बहु-बहुभुज को कम किए बिना आर और बफर में संघ


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,1बनाम 1,1,1,2), लेकिन b.explodedछेद के बारे में जानकारी खो दी है, बजाय इसे गैर-छेद वाले बहुभुज के रूप में प्रतिनिधित्व किया है। यह स्पष्ट रूप से खिलौने के उदाहरण के लिए परिणाम को प्रभावित नहीं करता है, लेकिन छेद में स्थित एक ओवरले जिसमें भ्रामक होगा, जैसे:

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

जवाबों:


7

यह पता चला है कि sp::disaggregateसिंगलपार्ट पॉलीगन को अलग करने के लिए इस्तेमाल किया जा सकता है।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.