我尝试将具有多行的空间对象(从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")
答案 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")
}