Tôi muốn thực hiện một lớp phủ không gian để xác định đa giác trong đó một tập hợp các điểm rơi. Tuy nhiên, trước tiên tôi muốn đệm và hòa tan các đa giác, sao cho các điểm rơi ở bất kỳ vị trí nào trong đa giác được hợp nhất (nhưng không nằm trong bất kỳ lỗ nào) sẽ được gắn nhãn tương tự bằng quy trình lớp phủ.
Thật không may, quá trình đệm và / hoặc hòa tan mà tôi đang sử dụng đang giảm SpatialPolygons
đối tượng thành đa giác. Việc sử dụng gBuffer
tạo ra đa giác khi byid=FALSE
, nhưng không hợp nhất các đa giác chồng chéo khi byid=TRUE
. Trong trường hợp thứ hai, sau đó hòa tan các đa giác với gUnaryUnion
một lần nữa tạo ra một đa giác. Xếp chồng SpatialPoints
với các kết quả đa giác này trong tất cả các điểm được báo cáo là nằm trong đa giác 1.
Đây là một ví dụ đồ chơi có liên quan với các điểm được đệm, trong đó tôi muốn thực hiện lớp phủ các điểm với các đa giác được đệm:
library(sp)
library(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5)))
plot(gBuffer(pts, width=0.6), lwd=2)
points(pts, pch=20, cex=2)
text(coordinates(pts), labels=seq_len(length(pts)), pos=4, font=2)
Và kết quả của một số lớp phủ ...
Với
byid=FALSE
:b <- gBuffer(pts, width=0.6) over(pts, b) # [1] 1 1 1 1
Với
byid=TRUE
:b2 <- gBuffer(pts, width=0.6, byid=TRUE) over(pts, b2) # [1] 1 2 3 4
Với
byid=TRUE
và sau đógUnaryUnion
:b3 <- gUnaryUnion(b2) over(pts, b3) # [1] 1 1 1 1
Tôi đang tìm phương pháp đúng để đạt được kết quả 1 1 1 2
, tức là các điểm 1, 2 và 3 nằm trong đa giác 1 (các đa giác 1, 2 và 3 trước đây đã được hợp nhất) và điểm 4 nằm trong đa giác 2 (ban đầu là đa giác 4 ).
BIÊN TẬP
Dữ liệu thực sự của tôi bao gồm các lỗ hổng và lý tưởng nhất là tôi muốn có thể bảo tồn chúng. Tôi đã cập nhật dữ liệu mẫu ở trên để bao gồm một lỗ sau khi đệm.
Áp dụng cách tiếp cận của @ JeffreyEvans cho các polys này:
polys <- b@polygons[[1]]@Polygons
pl <- vector("list", length(polys))
for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
b.spolys <- SpatialPolygons(pl)
row.ids <- sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))
b.exploded <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids)))
kết quả trong:
over(pts, b.exploded)
# FID
# 1 2
# 2 2
# 3 2
# 4 1
đó là kết quả mong đợi (tôi không quá bận tâm về thứ tự poly - 2,2,2,1
so với 1,1,1,2
), nhưng b.exploded
đã mất thông tin về lỗ hổng, thay vào đó đại diện cho nó như một đa giác không lỗ. Nó rõ ràng không ảnh hưởng đến kết quả của ví dụ về đồ chơi, nhưng lớp phủ liên quan đến các điểm nằm trong lỗ sẽ gây hiểu nhầm, ví dụ:
in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
# FID
# 1 2
:(
. Chúng ta có thể điều chỉnh điều này để giữ các lỗ hổng cùng với các polys mà chúng được liên kết không? (Tôi đang đi dọc theo các đường tương tự như đề nghị của bạn, vớin <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
... Tôi có nên nói vấn đề lỗ trong bài viết, xin lỗi.