Unisci un elenco di oggetti poligonali spaziali in R


16

Ho un elenco di buffer spaziali (30000 buffer) che ho creato con la funzione 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 

Da questo elenco, come posso unire tutti i buffer spaziali per ottenere un file di forma con i 30000 buffer (o funzionalità)? (Questo file di forma verrà quindi utilizzato nella funzione aggregateper aggregare i poligoni spaziali per attributi.)

Ho provato questo codice ma ottengo questo messaggio di errore:

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

3
Qual è il motivo per cui devi creare i tuoi buffer lapplyinvece di usarli gBuffercon byid = TRUE?
cengel,

Risposte:


12

Dato un elenco di SpatialPolygonsoggetti, ecco come costruire un frame di dati di poligoni spaziali con una funzione per SpatialPolygonsfunzione originale .

Dati di esempio: splè un elenco di 12 SpatialPolygonsoggetti: assicurati che il tuo oggetto fornisca gli stessi risultati di questo e prova su un piccolo campione prima di eseguirlo su 30.000:

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

Si desidera creare un singolo Spatial Polygonsoggetto con tutte le funzionalità al fine di creare un frame di dati di poligoni spaziali:

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

Questo prende il primo polygonsslot dall'oggetto (e dovrebbe essercene solo uno, poiché ogni elemento della lista è attualmente una singola caratteristica) e quindi costruisce un elenco di oggetti Poligoni che è ciò a cui si alimenta SpatialPolygonsper creare una funzione multipla SpatialPolygons. Trama questo e dovresti vedere tutte le tue funzionalità. Successivamente, se si desidera salvare come un shapefile, è necessario aggiungere alcuni dati. In assenza di qualsiasi altra cosa, creo una semplice colonna ID da 1 a 12:

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

Il FALSEflag semplicemente interrompe R cercando di riorganizzare i dati spaziali e non spaziali in modo che corrispondano. Potresti voler inserire le dimensioni del buffer nel frame di dati o qualcosa del genere.

Lavoro fatto.


18

Per unire un elenco di oggetti spaziali, puoi fare:

library(raster)
m <- do.call(bind, buff.pts) 

2

Puoi usare l'argomento makeUniqueIDs in rbind se i tuoi poligoni non hanno ID univoci.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.