Combinar una lista de objetos poligonales espaciales en R

16

Tengo una lista de buffers espaciales (30000 buffers) que construí con la función 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 

De esta lista, ¿cómo puedo fusionar todos los búferes espaciales para obtener un shapefile con los 30000 búferes (o características)? (Este archivo de forma se utilizará en la función aggregatepara agregar polígonos espaciales por atributos).

Probé este código pero obtengo este mensaje de error:

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
fuente
3
¿Alguna razón por la que necesita construir sus memorias intermedias en lapplylugar de usar gBuffercon byid = TRUE?
cengel

Respuestas:

12

Dada una lista de SpatialPolygonsobjetos, a continuación se explica cómo construir un marco de datos de polígonos espaciales con una característica por SpatialPolygonscaracterística original .

Datos de muestra: sples una lista de 12 SpatialPolygonsobjetos; asegúrese de que su objeto dé los mismos resultados que este y pruebe en una muestra pequeña antes de ejecutar en 30,000:

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

Desea crear un solo Spatial Polygonsobjeto con todas las características para crear un Marco de datos de polígonos espaciales:

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

Esto toma la primera polygonsranura del objeto (y debe haber solo uno, ya que cada elemento de la lista es actualmente una sola característica) y luego construye una lista de objetos de Polígonos que es lo que alimenta SpatialPolygonspara hacer una función múltiple SpatialPolygons. Trace esto, y debería ver todas sus características. A continuación, si desea guardar como shapefile, debe agregar algunos datos. En ausencia de cualquier otra cosa, creo una columna de identificación simple de 1 a 12:

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

La FALSEbandera simplemente detiene a R tratando de reorganizar los datos espaciales y no espaciales para que coincidan. Es posible que desee colocar los tamaños de búfer en el marco de datos o algo así.

Trabajo hecho.

Hombre espacial
fuente
18

Para fusionar una lista de objetos espaciales, puede hacer:

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

Puede usar el argumento makeUniqueIDs en rbind si sus polígonos no tienen ID únicos.

 library(purrr)

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