मैं उस बहुभुज की पहचान करने के लिए एक स्थानिक उपरिशायी करना चाहता हूं जिसके भीतर बिंदुओं का एक समूह गिरता है। हालाँकि मैं पहले बहुभुजों को बफर करना और घुलाना चाहता हूं, जैसे कि मर्ज किए गए बहुभुजों के भीतर कहीं भी गिरने वाले बिंदु (लेकिन किसी भी छेद के भीतर नहीं) को ओवरले प्रक्रिया द्वारा समान रूप से लेबल किया जाएगा।
दुर्भाग्य से, मैं जो बफरिंग और / या भंग करने की प्रक्रिया का उपयोग कर रहा हूं, 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)))
मुझे ... पोस्ट में छेद की समस्या का उल्लेख करना चाहिए था, क्षमा करें।