Hợp nhất một danh sách các đối tượng đa giác không gian trong R


16

Tôi có một danh sách các bộ đệm không gian (30000 bộ đệm) mà tôi đã xây dựng với chức năng 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 

Từ danh sách này, làm cách nào tôi có thể hợp nhất tất cả các bộ đệm không gian để có được một shapefile với 30000 bộ đệm (hoặc các tính năng)? (Shapefile này sau đó sẽ được sử dụng trong hàm aggregateđể tổng hợp các đa giác không gian theo các thuộc tính.)

Tôi đã kiểm tra mã này nhưng tôi nhận được thông báo lỗi này:

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
Bất kỳ lý do bạn cần để xây dựng bộ đệm của bạn lapplythay vì sử dụng gBuffervới byid = TRUE?
cengel

Câu trả lời:


12

Đưa ra một danh sách các SpatialPolygonsđối tượng, đây là cách xây dựng khung dữ liệu đa giác không gian với một tính năng cho mỗi SpatialPolygonstính năng ban đầu .

Dữ liệu mẫu: spllà danh sách 12 SpatialPolygonsđối tượng - đảm bảo đối tượng của bạn cho kết quả giống như thế này và kiểm tra trên một mẫu nhỏ trước khi chạy trên 30.000:

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

Bạn muốn tạo một Spatial Polygonsđối tượng duy nhất có tất cả các tính năng trong đó để tạo Khung dữ liệu đa giác không gian:

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

Cái này lấy polygonsvị trí đầu tiên từ đối tượng (và chỉ nên có một, vì mỗi phần tử danh sách hiện là một tính năng duy nhất) và sau đó xây dựng một danh sách các đối tượng Đa giác, thứ mà bạn cung cấp SpatialPolygonsđể tạo thành một tính năng đa năng SpatialPolygons. Vẽ sơ đồ này, và bạn sẽ thấy tất cả các tính năng của bạn. Tiếp theo, nếu bạn muốn lưu dưới dạng shapefile, bạn cần thêm một số dữ liệu. Trong trường hợp không có gì khác, tôi tạo một cột ID 1 đến 12 đơn giản:

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

Các FALSElá cờ chỉ dừng R cố gắng sắp xếp lại các dữ liệu không gian và phi không gian để phù hợp lên. Bạn có thể muốn đặt kích thước bộ đệm trong khung dữ liệu hoặc một cái gì đó.

Công việc hoàn thành.


18

Để hợp nhất một danh sách các đối tượng Không gian, bạn có thể làm:

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

2

Bạn có thể sử dụng đối số makeUniqueID trong rbind nếu đa giác của bạn không có ID duy nhất.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.