我尝试将具有多行的空间对象(从 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")
最佳答案
正如 ?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
工作目录中的文件,每个 Lines 对象对应一个 sp_salzach
,虽然我不确定这是否是你想要的。编辑:
如果您没有在每次迭代中调整名称,则会在一个文件中获取所有行,至少如果使用 google earth 打开它似乎可以工作,即:
for( i in seq_along(sp_salzach) ) {
kmlLine(sp_salzach@lines[[i]], kmlfile = "salzach.kml",
lwd = 3, col = "blue", name = "Salzach")
}
关于r - 在 R 中将具有多个线元素的 SpatialLinesDataframe 转换为 KML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997936/