आर में अनाथ छेदों को ठीक करना


18

मैं दो समीपस्थ आकृति के विलय के बाद एक सामान्य क्षेत्र पर एक संघ प्रदर्शन करने की कोशिश कर रहा हूं। शेपफाइल उनके बीच में कम से कम एक पतली स्लिवर स्पेस के साथ समाप्त होता है। जब मैं एक संघ का प्रयास करता हूं तो मुझे निम्नलिखित अनाथ छेद त्रुटि मिलती है:

CreatePolygonsComment (p) में त्रुटि: rgeos_PolyCreateComment: अनाथ छेद, सूचकांक 17 पर छेद के लिए बहुभुज युक्त नहीं मिल सकता है

मैंने इस लिंक पर ड्रॉपबॉक्स में एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण अपलोड किया है ।

यहाँ समस्या को फिर से बनाने के लिए कोड है:

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

यह दिखाता है:

CreatePolygonsComment (p) में त्रुटि: rgeos_PolyCreateComment: अनाथ छेद, सूचकांक 17 पर छेद के लिए बहुभुज युक्त नहीं मिल सकता है

यहाँ और यहाँ प्रस्तावित फिक्स की कोशिश कर रहा है :

slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)

यह वही त्रुटि देता है जो यूनियन प्रयास से आती है लेकिन अलग-अलग इंडेक्स संख्या के साथ:

rgeos_PolyCreateComment: अनाथ छेद, सूचकांक 30 पर छेद के लिए बहुभुज युक्त नहीं मिल सकता है

रोजर बिवांड के सहायक ट्यूटोरियल में प्रस्तावित फिक्स की कोशिश करना

fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)

ऊपर के रूप में सूचकांक 30 पर एक ही त्रुटि देता है।

दूसरों ने इस समस्या को यहां और यहां उठाया है , और जबकि ऊपर दिए गए समाधान कुछ मामलों के लिए काम करते हैं, अन्य मामलों का समाधान नहीं किया जाता है। एक उपयोगकर्ता ने समस्या को संबोधित करने के लिए QGIS का उपयोग किया, और दूसरे में 2 में से 3 आइटम तय किए गए थे, लेकिन अंतिम के लिए कोई संकल्प नहीं था।

ऐसा प्रतीत होता है कि लोगों को समय-समय पर इस कोड के काम करने के बावजूद समस्याएं बनी रहती हैं। क्या किसी ने R के भीतर कोई समाधान पाया है?

मैंने आर्कगिस में "मरम्मत ज्यामिति" उपकरण का प्रदर्शन किया है, और इसने समस्या को ठीक किया, लेकिन ऐसा लगता है कि आर में एक फिक्स होना चाहिए।


आपके डेटा के बिना, यह कहना मुश्किल है कि समस्या कहां है।

@ पास्कल, मैंने अभी 10mb zipped और 16mb unzipped के पतले डाउन शेपफाइल के साथ एक ड्रॉपबॉक्स लिंक अपलोड किया है जो समस्या को पुन: उत्पन्न करेगा। मुझे यकीन नहीं था कि मूल 1.5 gb के रूप में डेटा कैसे प्रदान किया जाए, लेकिन समस्या को एक छोटी फ़ाइल में सीमित करने के लिए ArcGIS का उपयोग करने में कामयाब रहा। प्रबंधनीय आकार के प्रतिलिपि प्रस्तुत करने योग्य उदाहरण बनाने और साझा करने के लिए एक अच्छा प्रोटोकॉल है?
ल्यूक मैकाले

R के साथ विभिन्न तरीकों की कोशिश करने से काम नहीं चला। और जिग्मेट्रीज की जाँच करते समय क्यूजीज़ जम जाता है।

जवाबों:


25

मैंने संलग्न डेटा में ज्यामिति के मुद्दों का विश्लेषण किया है, और ऐसा लगता है कि यह केवल नहीं है, orphaned holesलेकिन यह भी है geometry validity issues। यह सच है कि एक orphaned holeकिसी भी तरह से एक ज्यामिति वैधता मुद्दा है, लेकिन rgeos उसी तरह से संभाल नहीं करता है, जैसे कि अनाथ छेद के लिए, एक साधारण चेतावनी के बजाय, एक त्रुटि उठाई जाती है। जैसा कि आप इंगित करते हैं, वे बहुभुज छेदों की जांच करने के लिए संकेत हैं, लेकिन अनाथ छिद्रों को ठीक करने के लिए लागू होने पर यह हमेशा सफल नहीं होता है।

तो चलें:

  1. अपना डेटा साफ़ करें (यदि आप यूनियन की तरह जियोप्रोसेसिंग करना चाहते हैं)

  2. अपनी यूनियन प्रक्रिया के साथ साफ किए गए डेटा का उपयोग करें

1. आर में ज्यामिति को ठीक करना ज्यामिति को ठीक करना कभी-कभी चुनौतीपूर्ण हो सकता है, इसलिए मैंने एक प्रायोगिक आर पैकेज ( https://github.com/eblondel/cleangeo देखें ) बनाने की कोशिश की है जो spवस्तुओं की सफाई को सुविधाजनक बनाने का इरादा रखता है (अब सीमित है) बहुभुज आकार)। आप के साथ पैकेज स्थापित कर सकते हैं:

require(devtools)
install_github("eblondel/cleangeo")
require(cleangeo)

शुरू करने के लिए, यह अच्छा है कि आप देखें कि आपके स्रोत डेटा के साथ ज्यामिति मुद्दे क्या हैं। इसके लिए, आप निम्नलिखित को चला सकते हैं (आपका डेटा बड़ा है इसलिए इसमें कुछ समय लग सकता है):

#get a report of geometry validity & issues for a sp spatial object
report <- clgeo_CollectionReport(sp)
summary <- clgeo_SummaryReport(report)
issues <- report[report$valid == FALSE,]

इसके साथ, आप देखेंगे कि आपके डेटा में 2 प्रकार के मुद्दे हैं: orphaned holesऔर geometry validity issues। दोनों और न केवल अनाथ छेद) unionप्रक्रिया को विफल करने की संभावना है , इसलिए जब संभव हो तो एक स्वचालित तरीके से डेटा को पहले साफ किया जाना चाहिए। तेजी से प्रजनन के लिए, नीचे दिया गया पहला नमूना कोड केवल उन विशेषताओं का सबसेट लेता है, जिन्हें संदिग्ध के रूप में टैग किया गया है (नवीनतम डेटा को छोड़कर, मूल डेटा में इंडेक्स = 9002 के साथ - इस पर मेरा नोट नीचे देखें)

#get suspicious features (indexes)
nv <- clgeo_SuspiciousFeatures(report)
mysp <- sp[nv[-14],]

#try to clean data
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

यदि clgeo_Cleanअच्छी तरह से काम करता है, तो आपको सभी ज्यामिति को अभी मान्य करना चाहिए। आप इसे संपूर्ण डेटासेट पर लागू कर सकते हैं (फीचर इंडेक्स = 9002 को छोड़कर)

#try to clean data
mysp <- sp[-9002,]
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

2. संघ प्रक्रिया अब, आइए देखें कि क्या unionइस डेटासेट पर काम करता है:

#Attempting a UnionSpatialPolygons based on the COUNTY field
mysp.df <- as(mysp, "data.frame")
countycol <- mysp.df$COUNTY
mysp.diss <- unionSpatialPolygons(mysp.clean, countycol)

नोट: जैसा कि पहले कहा गया था, मैंने एक फीचर (इंडेक्स = 9002) को हटा दिया है। इसे प्लॉट करने से पहले: plot(sp[9002,])आप देखेंगे कि यह फीचर बहुत (बहुत) जटिल है। मैंने इसे केवल नमूने से बाहर रखा है क्योंकि छेदों की जाँच में बहुत अधिक समय लग रहा था। आइए अब देखते हैं कि डेटा पढ़ने के लिए readShapePoly(से maptools) एक ही समस्या आती है ...

3. रीडिंग डेटा (UPDATE) के लिए readShapePoly बनाम readOGR पर स्विच करें

readOGRकेवल शेपफाइल्स पढ़ने के लिए उपलब्ध फ़ंक्शन नहीं है। आप पैकेज readShapePolyसे भी उपयोग कर सकते हैं maptools, आम तौर पर पहले वाले की तुलना में अधिक प्रदर्शनकारी:

require(maptools)
mysp <- readShapePoly("ReproducibleExample.shp")

तेज दौड़ने के अलावा:

  • यदि आप उपरोक्त कोड का उपयोग करते हैं clgeo_CollectionReport, तो अनाथ छेद की कोई समस्या नहीं है, लेकिन फिर भी ज्यामिति की समस्याएं हैं।

  • ज्यामिति की सफाई clgeo_Cleanभी अच्छी तरह से चलती है, और अब यह सुविधा सूचकांक 9002 के साथ नहीं अटकती है

  • और ... संघ प्रक्रिया काम करती है।

प्लॉट परिणाम के नीचे देखें:

#plot the result
plot(mysp, border= "lightgray")
plot(mysp.diss, border="red", add = TRUE)

संघ परिणाम

निष्कर्ष : अपने आकार डेटा को पढ़ने के लिए maptools पसंद करते हैं , और किसी भी जियोप्रोसेसिंग से पहले अपने डेटा को साफ करने के लिए क्लींजो का उपयोग करने पर विचार करें।


धन्यवाद eblondel! मैं यह कोशिश करूंगा। पैकेज के विकास के लिए धन्यवाद!
ल्यूक मैकाले

नमस्ते, यह अच्छी तरह से काम किया है, लेकिन मैं आपको बताना चाहता था कि ज्यामिति को सही करने में, जटिल और जटिल सुविधाओं से निपटने के दौरान यह बहुत बड़े बहुभुज बना देगा। उदाहरण के लिए एक सड़क नेटवर्क को एक बड़े बहुभुज के लिए ठीक किया गया था जो मूल रूप से नेटवर्क की सीमा थी। मुझे यकीन नहीं है कि सही करना कितना आसान है, लेकिन मैं आपको बताना चाहता हूं।
ल्यूक मैकाले

वाह। बहुत प्रभावशाली पैकेज। वह बहुत काम का रहा होगा।
nograpes

3
आपकी प्रतिक्रिया के लिए धन्यवाद @nograpes। जब मैंने इस मुद्दे को पोस्ट किया था, तो मैंने इस पैकेज को स्क्रैच से बनाया है, क्योंकि जियोमेट्री को साफ करना हमेशा आसान काम नहीं है। यदि आप गितुब पर हैं, तो मैं आपके 'स्टार' :-) का स्वागत करूंगा, मैं भविष्य में पैकेज को और बेहतर बनाना चाहूंगा, और संभवत: इसे सीआरएएन पर जारी करूंगा।
eblondel

7
बस आपको बता दें कि Cleangeo को CRAN ( cran.r-project.org/package=cleangeo ) में प्रकाशित किया गया है, इसका उपयोग करने वाले सभी लोग, Github में एन्हांसमेंट अनुरोधों या बग्स की रिपोर्ट करने के लिए स्वतंत्र महसूस करते हैं।
eblondel

1

एक सुविधाजनक समाधान जो आर में मेरे लिए काम कर रहा है, एक शून्य-चौड़ाई बफर लागू करना है :

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#project your data (I'm using California Albers here) and apply a zero-width buffer
example <- spTransform(example, CRS("+init=epsg:3310"))
example <- gBuffer(example, byid = T, width = 0)

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

UnionSpatialPolygons इस डेटा सेट के साथ थोड़ा समय लेता है, लेकिन बस ठीक काम करने लगता है।

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