Mesclar uma lista de objetos de polígono espacial em R

16

Eu tenho uma lista de buffers espaciais (30000 buffers) que criei com a função lapply:

buff.pts <- lapply(1:nrow(pts.prj), FUN=function(l){
  buff <- gBuffer(pts.prj[l,], width=1000) ## 1km
  return(buff)
}))

> head(buff.pts)
[[1]]
class       : SpatialPolygons 
features    : 1 
extent      : 307941.8, 311941.8, 4994518, 4998518  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

[[2]]
class       : SpatialPolygons 
features    : 1 
extent      : 307226, 311226, 4991153, 4995153  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

Nesta lista, como posso mesclar todos os buffers espaciais para obter um shapefile com os 30000 buffers (ou recursos)? (Esse shapefile será usado na função aggregatepara agregar polígonos espaciais por atributos.)

Eu testei esse código, mas recebo esta mensagem de erro:

test <- as.data.frame(do.call("rbind", buff.pts))
Error in as.data.frame(do.call("rbind", buff.pts)) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Error in validObject(res) : 
  invalid class SpatialPolygons object: non-unique Polygons ID slot values
Nell
fonte
3
Qualquer razão que você precisa para construir seus buffers com lapplyem vez de usar gBuffercom byid = TRUE?
cengel

Respostas:

12

Dada uma lista de SpatialPolygonsobjetos, veja como construir um quadro de dados de polígonos espaciais com um recurso por originalSpatialPolygons recurso .

Dados da amostra: splé uma lista de 12 SpatialPolygonsobjetos - verifique se o seu objeto apresenta os mesmos resultados e teste em uma pequena amostra antes de executar em 30.000:

> length(spl)
[1] 12
> class(spl)
[1] "list"
> class(spl[[1]])
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

Você deseja criar um único Spatial Polygonsobjeto com todos os recursos para criar um quadro de dados de polígonos espaciais:

> joined = SpatialPolygons(lapply(spl, function(x){x@polygons[[1]]}))
> plot(joined)

Isso pega o primeiro polygonsslot do objeto (e deve haver apenas um, já que cada elemento da lista é atualmente um único recurso) e, em seguida, cria uma lista de objetos Polígonos, que é o que você alimenta SpatialPolygonspara criar um recurso múltiplo SpatialPolygons. Plote isso e você deverá ver todos os seus recursos. Em seguida, se você quiser salvar como shapefile, precisará adicionar alguns dados. Na ausência de qualquer outra coisa, crio uma coluna simples de 1 a 12 ID:

> jdata = SpatialPolygonsDataFrame(Sr=joined, data=data.frame(i=1:12),FALSE)

o FALSE bandeira apenas para R tentando reorganizar os dados espaciais e não espaciais para corresponder. Você pode querer colocar os tamanhos de buffer no quadro de dados ou algo assim.

Tarefa concluída.

Spacedman
fonte
18

Para mesclar uma lista de objetos espaciais, você pode:

library(raster)
m <- do.call(bind, buff.pts) 
Robert Hijmans
fonte
2

Você pode usar o argumento makeUniqueIDs em rbind se seus polígonos não tiverem IDs exclusivos.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
ColinTB
fonte