Не нужно редактировать топологию, просто объединить все полигоны в один sp
объект типа SpatialPolygonsDataFrame
(spdf). В spdf только один полигон.
Данные ( прямая ссылка на данные ) (размер файла 1,1 КБ) (dput()
в данном случае не подходит):
list_of_spdf <- unlist(readRDS("data.Rds"))
Я получаю желаемый результат с помощью:
one_spdf <- rbind(list_of_spdf[1][[1]], list_of_spdf[2][[1]], list_of_spdf[3][[1]], makeUniqueIDs = TRUE)
# when plotting can see two polygons (third object is a repeat for sake of testing)
plot(one_spdf)
Имея сотни объектов (хотя только один полигон на spdf), мне нужно сделать rbind
программно. Поэтому я попытался lapply
list_of_spdf <- lapply(list_of_spdf, rbind, makeUniqueIDs = TRUE)
Очевидно, это возвращает список и, следовательно, не то, что я ищу.
Итак, я написал функцию:
rbindSPDF <- function(lst) {
# Create empty spdf objects
pol <-
SpatialPolygonsDataFrame(SpatialPolygons(list()), data = data.frame())
pols <-
SpatialPolygonsDataFrame(SpatialPolygons(list()), data = data.frame())
# loop for rbind
for (i in 1:length(lst)) {
pol[i] <- lst[i][[1]]
if (length(pols) == 0) {
pols <- pol[i]
} else {
pols <- rbind(pols, pol[i], makeUniqueIDs = TRUE)
}
}
return(pols)
}
Однако при использовании rbindSPDF
:
single_spdf <- rbindSPDF(list_of_spdf)
Я получаю:
Error in as.vector(data) :
no method for coercing this S4 class to a vector
Не уверен, что я здесь делаю не так.
Плюс, наверное, мне даже не нужно использовать свою собственную функцию.
Примечание. В дополнение ко многим другим пакетам я использую sp
и rgdal
для пространственных данных и предпочел бы избежать использования еще одного пакета из-за присоединения / отсоединения времени и маскирования.