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

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

最佳答案

正如 ?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/

相关文章:

r - mclapply() 的性能明显比 lapply() 差。我怎样才能加快速度?

caching - 如何清除我自己服务器上的所有 osm 磁贴缓存

android - 将 OpenSeaMap 集成到 Android 应用程序中

javascript - 在 Django 中使用 OpenLayers 实现 map

python - 使用 Python 从 KML BatchGeo 文件中提取坐标

java - 带文件夹的 Geotools KML 导出

r - 如何每 50 列对 R 中的大型 data.table 进行子集化并查找字符行的模式

R 内存未在 Windows 中释放

r - 使用 R 在一张图中绘制光谱数据

postgresql - 将 osm 文件导入 postgres/postgis 数据库