다중 다각형으로 축소하지 않고 R의 버퍼 및 결합


9

점 집합이 속하는 다각형을 식별하기 위해 공간 오버레이를 수행하고 싶습니다. 그러나 먼저 다각형을 버퍼링하고 분해하여 병합 된 다각형 내에 있지만 구멍 내에 있지 않은 지점에 오버레이 절차에 의해 유사한 레이블이 지정되도록합니다.

불행히도, 내가 사용하는 버퍼링 및 / 또는 용해 프로세스는 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,11,1,1,2), 그러나 b.exploded대신 비 홀 다각형으로 표현, 구멍에 대한 정보를 잃었다. 장난감 예제의 결과에는 영향을 미치지 않지만 구멍에있는 점이 포함 된 오버레이는 다음과 같이 오도 될 수 있습니다.

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
#   FID
# 1   2

답변:


7

그것은 그 밝혀 sp::disaggregatesinglepart 다각형 떨어져 당겨하는 데 사용할 수 있습니다.

pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
b <- gBuffer(pts, width=0.6) 
over(pts, disaggregate(b))

# [1] 1 1 1 2

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, disaggregate(b))

# [1] NA

( raster::aggregate다시 결합하는 데 사용할 수 있습니다.)


3

나는 동정심입니다, 이것은 약간의 고통입니다. gBuffer 폴리곤 객체의 슬롯을 개별 폴리곤으로 분해해야합니다.

require(sp)
require(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 3), c(1, 2, 3))) 

b <- gBuffer(pts, width=0.6)

over(pts, b)

###########################################################
# explodes slots into individual polygons
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 <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids)) ) 
###########################################################

over(pts, b)

방금 테스트했는데 유망한 것처럼 보이지만 내 구멍은 더 이상 구멍이 아닙니다 :(. 구멍과 관련된 폴리와 함께 구멍을 유지하도록 이것을 조정할 수 있습니까? (나는 당신의 제안과 비슷한 노선을 따라 가고 있었는데 n <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))... 게시물에 구멍 문제를 언급 했어야합니다. 죄송합니다.
jbaums
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.