Question

I try to convert a spatial object (a river retrieved from OSM) with multiple lines to KML. For an object with a single line it is easy with kmlLine. However, with multiple lines the below approach is not working and my attempts to adapt the example from the documentation were in vain:

# get OSM data:
library(osmar)
library(maptools)

salzach <- get_osm(relation(408582), full = T)
sp_salzach <- as_sp(salzach, what = "lines")

# convert to KML:
kmlLine(sp_salzach, "salzach.kml", lwd = 3, col = "blue", name = "Salzach")
Warning:
In kmlLine(sp_salzach, "salzach.kml", lwd = 3, col = "blue", name = "Salzach") :
  Only the first Lines object with the ID '23633534' is taken from 'obj'

# shell.exec("salzach.kml")
Was it helpful?

Solution

As it says in the Details of ?kmlLine, if you provide a spatialLinesDataFrame as first argument, it will use only the first element of the spatialLinesDataFrame object. Since

 sp_salzach@data$id[1]
 [1] 23633534

this is the Lines object with the above ID, therefore the warning. sp_salzach contains 74 Lines objects, not 1. If you want to apply kmlLines to each of these lines you would need to do sth. like this:

for( i in seq_along(sp_salzach) ) {

    kmlLine(sp_salzach@lines[[i]], kmlfile = paste0("salzach", i, ".kml"), 
            lwd = 3, col = "blue", name = paste0("Salzach", i))

}

This will create 74 .kml files in your working directory, one for each Lines object in sp_salzach, although I'm not sure if this is what you want.

EDIT:

If you don't adapt the name in each iteration, you get all lines in one file, at least if opened with google earth it seems to work, i.e.:

for( i in seq_along(sp_salzach) ) {

        kmlLine(sp_salzach@lines[[i]], kmlfile = "salzach.kml", 
                lwd = 3, col = "blue", name = "Salzach")

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top