KML Export From R

For these examples, this code creates rectangles for the Universal Transverse Mercator (UTM) zones.

library(rgdal)

north = lapply(seq(-179.99, 174.01, 6), function(west) {
	Polygon(matrix(data = c(west,west, west + 5.98, west + 5.98, west,
	0, 84, 84, 0, 0), ncol=2)) })

south = lapply(seq(-179.99, 174.01, 6), function(west) {
	Polygon(matrix(data = c(west,west, west + 5.98, west + 5.98, west,
	0, -80, -80, 0, 0), ncol=2)) })

polygons = c(north, south)

polygons = sapply(1:length(polygons), function(x) {
	Polygons(polygons[x], ID=x) })

wgs84 = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")

polygons = SpatialPolygons(polygons, proj4string = wgs84)

data = data.frame(ZONE = rep(1:60, 2), HEMISPHERE = c(rep("N", 60), rep("S", 60)))

utm_zones = SpatialPolygonsDataFrame(polygons, data = data)

The easiest and least-flexible way to export to KML is the KML driver in writeOGR(). There is no direct control over lines/fills/icons, and the only fields that can be specified are popup Name and Description.

# Create name field
utm_zones$NAME = paste0("UTM Zone ", utm_zones$ZONE, utm_zones$HEMISPHERE)

# Write
writeOGR(utm_zones, "utm_zones.kml", "Universal Transverse Mercator Zones", driver="KML", 
	layer_options=c(NameField = "NAME", DescriptionField = "NAME"))

# Replace colors

text = readLines("utm_zones.kml")
text = gsub(pattern = "ff0000ff", replace = "40800000", x=text)
writeLines(text, con="utm_zones.kml")
UTM Zones

If you need more control over the coloring the kmlPolygon() function from the maptools library is what you need, although it only handles one polygon at a time (why?!) and requires quite a bit of code for what should be a one-function operation:

library(maptools)

# Create name field

utm_zones$NAME = paste0("UTM Zone ", utm_zones$ZONE, utm_zones$HEMISPHERE)

# Different colors for the northern and southern hemispheres

colors = c(rep("#00008040", 60), rep("#00800040", 60))
borders = c(rep("#00008080", 60), rep("#00800080", 60))

# Create a list of KML polygons

utm_polygons = sapply(1:length(utm_zones), function(x) { 
	kmlPolygon(utm_zones[x,], name=utm_zones$NAME[x], description=utm_zones$NAME[x],
	lwd=1, col=colors[x], border=borders[x]) })

# Open the file and write the header

kmlfile = file("utm_zones.kml", "w")

cat(kmlPolygon(kmlname="Universal Transverse Mercator Zones")$header, file=kmlfile, sep="\n")

# Write the style information

cat(unlist(utm_polygons["style",]), file=kmlfile, sep="\n")

# Write the placemarks

cat(unlist(utm_polygons["content",]), file=kmlfile, sep="\n")


# Write the footer and close the file

cat(kmlPolygon(kmlname="State Plane Coordinate System")$footer, file=kmlfile, sep="\n")

close(kmlfile)

There is also a plotKML library that is useful if you are creating a choropleth or some other kind of thematic map:

library(plotKML)

# Create an array of colors
breaks = quantile(utm_zones$ZONE, na.rm=T)
categories = as.numeric(cut(utm_zones$ZONE, breaks))

palette = colorRampPalette(c("#800000", "#000080"))
ramp = palette(4)
colors = ramp[categories]

kml_open("temp.kml")
kml_layer(utm_zones, colour=colors)
utm_zones$ZONE)
kml_close("temp.kml")