bộ đệm và liên kết trong R mà không giảm xuống đa giác


9

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 gBuffertạ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 gUnaryUnionmột lần nữa tạo ra một đa giác. Xếp chồng SpatialPointsvớ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)

nhập mô tả hình ảnh ở đây

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=TRUEvà 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,1so 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

Câu trả lời:


7

Nó chỉ ra rằng sp::disaggregatecó thể được sử dụng để tách các đa giác một phần.

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::aggregatecó thể được sử dụng để kết hợp chúng một lần nữa.)


3

Tôi thông cảm, đây là một chút đau đớn. Bạn phải làm nổ các khe, của đối tượng đa giác gBuffer, thành các đa giác riêng lẻ.

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)

Mới thử nghiệm và có vẻ đầy hứa hẹn, nhưng lỗ của tôi không còn lỗ nữa :(. 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ới n <- 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.
jbaums
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.