将具有多个线元素的SpatialLinesDataframe转换为R中的KML

时间:2012-12-21 22:21:18

标签: r openstreetmap kml maptools osmar

我尝试将具有多行的空间对象(从OSM检索的河流)转换为KML。对于具有单行的对象,使用kmlLine很容易。但是,对于多行,下面的方法不起作用,我尝试从the documentation调整示例是徒劳的:

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

1 个答案:

答案 0 :(得分:1)

正如?kmlLine的详细信息中所述,如果您提供spatialLinesDataFrame作为第一个参数,它将仅使用spatialLinesDataFrame对象的第一个元素。 从那以后

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

这是具有上述ID的Lines对象,因此是警告。 sp_salzach包含74个Lines对象,而不是1.如果要将kmlLines应用于这些行中的每一行,您需要执行某些操作。像这样:

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

}

这将在您的工作目录中创建74个.kml文件,sp_salzach中每个Line对象一个,但我不确定这是否是您想要的。

修改

如果你没有在每次迭代中调整名称,你可以在一个文件中获得所有行,至少如果用google earth打开它似乎有效,即:

for( i in seq_along(sp_salzach) ) {

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

}