Combinar una lista de objetos de polígono espacial en R

13

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 combinar todos los buffers espaciales para obtener un shapefile con los 30000 buffers (o características)? (Este shapefile se usará en la función aggregate para 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
    
pregunta Nell 14.02.2016 - 01:59

3 respuestas

10

Dada una lista de objetos SpatialPolygons , aquí se explica cómo construir un marco de datos de polígonos espaciales con una característica por característica original SpatialPolygons .

Datos de muestra: spl es una lista de 12 SpatialPolygons objetos. Asegúrese de que su objeto dé los mismos resultados que esto, y realice una prueba en una pequeña muestra antes de ejecutar 30,000:

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

Desea crear un solo objeto Spatial Polygons con todas las características para luego crear un marco de datos de polígonos espaciales:

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

Esto toma la primera ranura polygons del objeto (y debería haber solo una, ya que cada elemento de la lista es actualmente una única función) y luego construye una lista de objetos de polígonos que es lo que alimenta a SpatialPolygons Hacer un multi-feature SpatialPolygons . Traza esto, y deberías ver todas tus características. A continuación, si desea guardar como shapefile , necesita agregar algunos datos. En ausencia de cualquier otra cosa, creo una columna de ID simple de 1 a 12:

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

El indicador FALSE solo detiene R tratando de reorganizar los datos espaciales y no espaciales para que coincidan. Es posible que desee colocar los tamaños del búfer en el marco de datos o algo así.

Trabajo hecho.

    
respondido por el Spacedman 16.02.2016 - 09:56
12

Para fusionar una lista de objetos espaciales, puede hacer:

library(raster)
m <- do.call(bind, buff.pts) 
    
respondido por el Robert Hijmans 20.02.2016 - 02:07
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, .)
    
respondido por el ColinTB 26.09.2017 - 17:54

Lea otras preguntas en las etiquetas