Объединение всех объектов SpatialPolygonsDataFrame из списка в один объект SpatialPolygonsDataFrame - PullRequest
0 голосов
/ 05 мая 2018

Не нужно редактировать топологию, просто объединить все полигоны в один 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 для пространственных данных и предпочел бы избежать использования еще одного пакета из-за присоединения / отсоединения времени и маскирования.

1 Ответ

0 голосов
/ 05 мая 2018

Иметь программную версию

one_spdf <- rbind(list_of_spdf[1][[1]], 
                  list_of_spdf[2][[1]], 
                  list_of_spdf[3][[1]], 
                  ...
                  makeUniqueIDs = TRUE)

для очень длинного списка в list_of_spdf, будет ли что-то вроде следующей работы?

# generate list containing list_of_spdf[i][[1]]
list.df <- lapply(seq_along(list_of_spdf),
                  function(i){list_of_spdf[i][[1]]})

# apply rbind to the list
one_spdf2 <- do.call("rbind",
                     c(args = list.df, makeUniqueIDs = TRUE))

> all.equal(one_spdf, one_spdf2)
[1] TRUE

Результаты кажутся эквивалентными на моей машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...