ropenstreetmapkmlr-maptoolsosmar

Convert SpatialLinesDataframe with multiple line elements to KML in R


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")

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")
    
    }