Преобразовать SpatialLinesDataframe с несколькими линейными элементами в KML в R

Я пытаюсь преобразовать пространственный объект (река, извлеченная из 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")

1 ответ

Решение

Как говорится в деталях ?kmlLine, если вы предоставите spatialLinesDataFrame в качестве первого аргумента, он будет использовать только первый элемент spatialLinesDataFrame объект. поскольку

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

это объект Lines с указанным выше идентификатором, поэтому предупреждение. sp_salzach содержит 74 строки объектов, а не 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 Планета Земля, это, кажется, работает, то есть:

for( i in seq_along(sp_salzach) ) {

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

}
Другие вопросы по тегам