Eine Liste von räumlichen Polygonobjekten in R zusammenführen

16

Ich habe eine Liste der räumlichen Puffer (30000 Puffer), die ich mit der Funktion erstellt habe 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 

Wie kann ich aus dieser Liste alle räumlichen Puffer zusammenführen, um ein Shapefile mit den 30000 Puffern (oder Features) zu erhalten? (Dieses Shapefile wird dann in der Funktion verwendet, aggregateum räumliche Polygone nach Attributen zu aggregieren.)

Ich habe diesen Code getestet, erhalte jedoch die folgende Fehlermeldung:

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
quelle
3
Gibt es einen Grund, warum Sie Ihre Puffer mit erstellen müssen, lapplyanstatt mit gBufferzu arbeiten byid = TRUE?
14.

Antworten:

12

Anhand einer Liste von SpatialPolygonsObjekten können Sie einen räumlichen Polygondatenrahmen mit einem Feature pro ursprünglichem SpatialPolygonsFeature erstellen .

Beispieldaten: Dies splist eine Liste von 12 SpatialPolygonsObjekten. Stellen Sie sicher, dass Ihr Objekt die gleichen Ergebnisse liefert, und testen Sie es an einem kleinen Beispiel, bevor Sie es mit 30.000 ausführen:

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

Sie möchten ein einzelnes Spatial PolygonsObjekt mit allen darin enthaltenen Features erstellen , um anschließend einen Datenrahmen für räumliche Polygone zu erstellen :

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

Dies entnimmt dem polygonsObjekt den ersten Slot (und es sollte nur einen geben, da jedes Listenelement derzeit ein einzelnes Feature ist) und erstellt dann eine Liste von Polygonen-Objekten, in die Sie einen Feed einfügen SpatialPolygons, um ein Multi-Feature zu erstellen SpatialPolygons. Zeichnen Sie dies, und Sie sollten alle Ihre Funktionen sehen. Wenn Sie als Nächstes speichern möchten shapefile, müssen Sie einige Daten hinzufügen. In Ermangelung von etwas anderem erstelle ich eine einfache 1 bis 12 ID-Spalte:

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

Das FALSEFlag stoppt einfach R und versucht, die räumlichen und nicht-räumlichen Daten neu anzuordnen, um sie abzugleichen. Möglicherweise möchten Sie die Puffergrößen in den Datenrahmen einfügen oder so.

Job erledigt.

Raumfahrer
quelle
18

So führen Sie eine Liste von Spatial-Objekten zusammen:

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

Sie können das Argument makeUniqueIDs in rbind verwenden, wenn Ihre Polygone keine eindeutigen IDs haben.

 library(purrr)

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