4

複数の行がある空間オブジェクト(OSMから取得した川)をKMLに変換しようとしています。単一行のオブジェクトの場合、kmlLineを使用すると簡単です。ただし、複数行の場合、以下のアプローチは機能せず、ドキュメントからの例を適応させる試みは無駄でした。

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

1 に答える 1

1

の詳細に記載されているように?kmlLinespatialLinesDataFrame最初の引数としてを指定すると、オブジェクトの最初の要素のみが使用されspatialLinesDataFrameます。以来

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

これは上記のIDを持つLinesオブジェクトであるため、警告です。sp_salzach1ではなく74のLinesオブジェクトが含まれています。kmlLinesこれらの各行に適用する場合は、sthを実行する必要があります。このような:

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オブジェクトに1つずつsp_salzachですが、これが必要かどうかはわかりません。

編集:

各反復で名前を調整しない場合、すべての行が1つのファイルに含まれます。少なくとも、Google Earthで開くと、機能しているように見えます。つまり、次のようになります。

for( i in seq_along(sp_salzach) ) {

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

}
于 2012-12-22T02:10:39.803 に答える