Gabungkan daftar objek poligon spasial di R

16

Saya memiliki daftar buffer spasial (30000 buffer) yang saya bangun dengan fungsi 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 

Dari daftar ini, bagaimana saya bisa menggabungkan semua buffer spasial untuk mendapatkan shapefile dengan 30000 buffer (atau fitur)? (Shapefile ini kemudian akan digunakan dalam fungsi aggregateuntuk mengagregasi poligon spasial dengan atribut.)

Saya menguji kode ini tetapi saya mendapatkan pesan kesalahan ini:

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
sumber
3
Apa alasan Anda perlu membuat buffer lapplybukan menggunakan gBufferdengan byid = TRUE?
cengel

Jawaban:

12

Diberikan daftar SpatialPolygonsobjek, berikut cara membuat bingkai data poligon spasial dengan satu fitur per SpatialPolygonsfitur asli .

Data sampel: spladalah daftar 12 SpatialPolygonsobjek - pastikan objek Anda memberikan hasil yang sama seperti ini, dan uji pada sampel kecil sebelum dijalankan pada 30.000:

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

Anda ingin membuat Spatial Polygonsobjek tunggal dengan semua fitur di dalamnya untuk kemudian membuat Bingkai Data Poligon Spasial:

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

Ini mengambil polygonsslot pertama dari objek (dan seharusnya hanya ada satu, karena setiap elemen daftar saat ini merupakan fitur tunggal) dan kemudian membangun daftar objek Polygons yang merupakan umpan yang Anda makan SpatialPolygonsuntuk membuat fitur-multi SpatialPolygons. Plot ini, dan Anda akan melihat semua fitur Anda. Selanjutnya, jika Anda ingin menyimpan sebagai shapefile, Anda perlu menambahkan beberapa data. Dengan tidak adanya hal lain, saya membuat kolom ID 1 hingga 12 sederhana:

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

The FALSEbendera hanya berhenti R mencoba untuk mengatur ulang data spasial dan non-spasial untuk menyesuaikan. Anda mungkin ingin meletakkan ukuran buffer dalam bingkai data atau sesuatu.

Pekerjaan selesai.

Spacedman
sumber
18

Untuk menggabungkan daftar objek spasial, Anda dapat melakukan:

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

Anda dapat menggunakan argumen makeUniqueIDs di rbind jika poligon Anda tidak memiliki ID unik.

 library(purrr)

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