점 집합이 속하는 다각형을 식별하기 위해 공간 오버레이를 수행하고 싶습니다. 그러나 먼저 다각형을 버퍼링하고 분해하여 병합 된 다각형 내에 있지만 구멍 내에 있지 않은 지점에 오버레이 절차에 의해 유사한 레이블이 지정되도록합니다.
불행히도, 내가 사용하는 버퍼링 및 / 또는 용해 프로세스는 SpatialPolygons
객체를 다중 다각형으로 줄이는 것 입니다. 를 사용 gBuffer
하면의 경우 다중 다각형을 byid=FALSE
만들지 만의 경우 겹치는 다각형을 통합하지 못합니다 byid=TRUE
. 후자의 경우,이어서 폴리곤을 gUnaryUnion
다시 용해 시키면 다중 폴리곤이 생성된다. SpatialPoints
이러한 다중 다각형으로 오버레이 하면 포함 된 모든 점이 다각형 1에 속하는 것으로보고됩니다.
다음은 버퍼링 된 포인트가있는 관련 장난감 예제입니다. 여기서 버퍼링 된 다각형으로 포인트를 오버레이하고 싶습니다.
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)
그리고 일부 오버레이의 결과는 ...
로
byid=FALSE
:b <- gBuffer(pts, width=0.6) over(pts, b) # [1] 1 1 1 1
로
byid=TRUE
:b2 <- gBuffer(pts, width=0.6, byid=TRUE) over(pts, b2) # [1] 1 2 3 4
와
byid=TRUE
이후gUnaryUnion
:b3 <- gUnaryUnion(b2) over(pts, b3) # [1] 1 1 1 1
결과를 달성하는 올바른 방법을 찾고 있습니다 1 1 1 2
. 즉, 점 1, 2 및 3이 다각형 1 (이전에 병합 된 다각형 1, 2 및 3)에 속하고 점 4가 다각형 2 (원래 다각형 4)에 속합니다. ).
편집하다
내 실제 데이터에는 구멍이 있으며 이상적으로는 구멍을 보존하고 싶습니다. 버퍼링 후 구멍을 포함하도록 위의 예제 데이터를 업데이트했습니다.
이 폴리에 @JeffreyEvans의 접근법을 적용 :
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)))
결과 :
over(pts, b.exploded)
# FID
# 1 2
# 2 2
# 3 2
# 4 1
이는 예상 된 결과 (나도 폴리 순서에 대해 법석을 떨게 아니에요 - 인 2,2,2,1
대 1,1,1,2
), 그러나 b.exploded
대신 비 홀 다각형으로 표현, 구멍에 대한 정보를 잃었다. 장난감 예제의 결과에는 영향을 미치지 않지만 구멍에있는 점이 포함 된 오버레이는 다음과 같이 오도 될 수 있습니다.
in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
# FID
# 1 2
:(
. 구멍과 관련된 폴리와 함께 구멍을 유지하도록 이것을 조정할 수 있습니까? (나는 당신의 제안과 비슷한 노선을 따라 가고 있었는데n <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
... 게시물에 구멍 문제를 언급 했어야합니다. 죄송합니다.