İçinde bir dizi noktanın düştüğü çokgeni tanımlamak için uzamsal bir bindirme yapmak istiyorum. Bununla birlikte, ilk önce çokgenleri tamponlamak ve çözmek istiyorum, böylece birleştirilmiş çokgenler içinde herhangi bir yere düşen noktalar (ancak herhangi bir delik içinde değil) üst üste bindirme prosedürü ile benzer şekilde etiketlenecektir.
Ne yazık ki, kullandığım tamponlama ve / veya çözme işlemi, SpatialPolygons
nesneyi çokgen haline indirgiyor. Kullanmak gBuffer
zaman çok çokgen oluşturur byid=FALSE
, ancak çakışan çokgenleri ne zaman birleştiremezse byid=TRUE
. İkinci durumda, daha sonra çokgenlerin gUnaryUnion
tekrar eritilmesi çok poligon oluşturur. SpatialPoints
Bu çok-çokgen ile üst üste bindirme , içerilen tüm noktaların çokgen 1 içine düştüğü bildirilmektedir.
Burada, tamponlu noktalarla ilgili bir oyuncak örneği, tamponlanmış çokgenlerle noktaların bir bindirmesini yapmak istiyorum:
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)
Ve bazı kaplamaların sonuçları ...
İle
byid=FALSE
:b <- gBuffer(pts, width=0.6) over(pts, b) # [1] 1 1 1 1
İle
byid=TRUE
:b2 <- gBuffer(pts, width=0.6, byid=TRUE) over(pts, b2) # [1] 1 2 3 4
Birlikte
byid=TRUE
ve daha sonragUnaryUnion
:b3 <- gUnaryUnion(b2) over(pts, b3) # [1] 1 1 1 1
Sonucu elde etmek için doğru yöntemi arıyorum 1 1 1 2
, yani 1, 2 ve 3 noktaları çokgen 1 (daha önce birleştirilen çokgenler 1, 2 ve 3) içine düşüyor ve nokta 4 çokgen 2 (başlangıçta çokgen 4) içine düşüyor ).
DÜZENLE
Gerçek verilerim delikler içeriyor ve ideal olarak onları korumak istiyorum. Arabelleğe aldıktan sonra bir delik eklemek için yukarıdaki örnek verileri güncelledim.
@ JeffreyEvans'ın bu polilere yaklaşımını uygulamak:
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)))
sonuç:
over(pts, b.exploded)
# FID
# 1 2
# 2 2
# 3 2
# 4 1
Bu beklenen sonuçtur (poli sırası hakkında çok fazla karışıklık yapmadım - 2,2,2,1
vs. 1,1,1,2
), ancak b.exploded
delikle ilgili bir çokgen olarak temsil eden delik hakkındaki bilgileri kaybetti. Açıkçası oyuncak örneğinin sonucunu etkilemez, ancak delikte bulunan noktaları içeren bir kaplama yanıltıcı olacaktır, örneğin:
in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
# FID
# 1 2
:(
. Delikleri ilişkili oldukları polislerle birlikte tutmak için uyarlayabilir miyiz? (Senin öneride olduğu gibi aynı çizgide ilerliyordum,n <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
ben ...