2012-12-21 54 views
4

我尝试将具有多行的空间对象(从OSM检索到的河流)转换为KML。对于单行的对象,使用kmlLine很容易。然而,多行下面的方法是不工作,我尝试从the documentation适应的例子是徒劳的:将具有多行元素的SpatialLinesDataframe转换为R中的KML

# 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

因为它说,在?kmlLine的详细信息,如果您提供一个spatialLinesDataFrame作为第一个参数,它将只使用spatialLinesDataFrame对象的第一个元素。 由于

[email protected]$id[1] 
[1] 23633534 

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

for(i in seq_along(sp_salzach)) { 

    kmlLine([email protected][[i]], kmlfile = paste0("salzach", i, ".kml"), 
      lwd = 3, col = "blue", name = paste0("Salzach", i)) 

} 

这将创建工作目录74个.kml文件,每个品系sp_salzach对象,虽然我不知道这是否是你想要的。

编辑:

如果你没有在每次迭代适应的名字,你在一个文件中的所有行,至少如果打开谷歌地球似乎工作,即:

for(i in seq_along(sp_salzach)) { 

     kmlLine([email protected][[i]], kmlfile = "salzach.kml", 
       lwd = 3, col = "blue", name = "Salzach") 

} 
+0

谢谢 - 帮助! – Kay