जीआईएस विश्लेषण डुप्लिकेट ज्यामितीय खोजने के लिए


9

मेरे पास एक बड़ी आकृति है जिसमें शहर की सभी इमारतें और घर शामिल हैं जो मैं (लगभग 90,000 सुविधाओं) में काम करता हूं। इमारतों / घरों के डेटा को शहर के सर्वेक्षण इंजीनियरों द्वारा बचाया जाता है और खराब डेटा और उस डेटा के लिए अलग-अलग सर्वेक्षकों की पहुंच के कारण, कई इमारतों / घरों को दो बार बचाया गया है और नक्शे में डुप्लिकेट के रूप में दिखाया गया है।

उनमें से कुछ बिल्कुल डुप्लिकेट हैं (वे एक दूसरे पर दिखाई देते हैं) जबकि अन्य दो वस्तुओं के बीच एक स्थान के साथ डुप्लिकेट हैं (जैसे एक वस्तु दूसरे के अंदर है - संलग्न स्क्रीन शॉट देखें)।

यहां छवि विवरण दर्ज करें

मैं उस डेटा को साफ करना चाहता हूं ताकि मेरे पास शहर में केवल सही इमारतें / घर हों, इसलिए मेरा प्रश्न है:

क्या कोई जीआईएस विश्लेषण या एसक्यूएल अभिव्यक्ति है जो मैं सभी डुप्लिकेट किए गए फीचर्स (सटीक दोनों और दूसरों के अंदर स्थित हैं) को खोजने के लिए चला सकता हूं? मेरे पास ArcGIS और QGIS दोनों हैं, इसलिए मैं आपके सभी सुझावों के लिए खुला हूं।


आप डिलीट आइडेंटिकल टूल को एक्सप्लोर करने का प्रयास कर सकते हैं । हालाँकि, इसके लिए एंटरप्राइज़ लाइसेंस स्तर की आवश्यकता होती है। आप तकनीकी अनुच्छेद 36031 में उपलब्ध कुछ अन्य विकल्पों की समीक्षा कर सकते हैं। आर्कगिस डुप्लीकेट जियोमेट्री के साथ सुविधाओं को पहचानने या हटाने का एक तरीका प्रदान करता है जो आपकी सबसे अच्छी शर्त है डेटा समीक्षक एक्सट्रैस्टियन । इनमें से कोई भी उपकरण आपके विभाजित ज्यामिति को संबोधित नहीं करेगा
MDHald

इसके अलावा, आपको यह विचार करना होगा कि हटाए गए समान उपकरण में सारणीबद्ध घटकों की तुलना नहीं की जाएगी। मैं इसका उत्तर नहीं जानता, लेकिन उम्मीद है कि यह समस्या को हल करने में मदद करता है।
MDHald

क्या डेटाबेस में डेटा है? किस प्रकार?
आईएससी में

एक विकल्प आर्कपार्ट में इंटर्सेक्ट टूल (जैसा कि इस उत्तर में वर्णित है ) का उपयोग किया जा सकता है , जो ओवरलैप के किसी भी स्थान को आउटपुट करेगा। इसे मैन्युअल रूप से जाँचना और तय करना होगा कि किस बहुभुज को हटाना है, लेकिन सटीक डुप्लिकेट के मामले में मुझे लगता है कि आपको वैसे भी करने की आवश्यकता होगी।
एरिका

4
'डुप्लिकेट' शब्द का प्रयोग इस प्रश्न में थोड़ा भ्रामक है। सटीक, समान, स्टैक्ड प्रतियों के मामले के लिए, फिर, हाँ, वे हैं (या हो सकते हैं - विशेषताएँ भिन्न हो सकती हैं) डुप्लिकेट और जैसा कि अन्य लोगों ने सुझाव दिया है कि यदि आपके पास लाइसेंस स्तर है तो डिलीट या फाइंड आइडेंटिकल टूल उपयोगी हो सकता है। लेकिन अगर वे बिल्कुल अलग हैं, या एक अलग आकार है, तो वे वास्तव में प्रति se डुप्लिकेट नहीं हैं। यदि आपके पास एक उन्नत लाइसेंस है, तो मैं एक जियोडैटैबस टोपोलॉजी पर गौर करूँगा, जो मस्ट नॉट ओवरलैप चेक चल रहा है। एडवांस्ड के बिना, शायद QGIS और प्लगइन के साथ भी ऐसा ही किया जा सकता है क्योंकि लुइगी का जवाब बताता है।
क्रिस डब्ल्यू

जवाबों:


4

QGIS में, टोपोलॉजी चेकर प्लगइन आपकी समस्या को हल कर सकता है


3
मैं मानता हूं कि एक टोपोलॉजी संभवतः डेटा की सफाई की समस्या का सबसे अच्छा एकल समाधान है। हालाँकि आप प्लगइन को एक लिंक और टोपोलॉजी क्या करता है या करता है और कौन सा चेक आपको चलाना होगा, का एक संक्षिप्त विवरण प्रदान करके अपने उत्तर को थोड़ा विस्तारित करना चाह सकते हैं। मुझे डर है कि आपका उत्तर टाइप किए जाने की संभावना कम गुणवत्ता के रूप में दिखाई जाएगी।
क्रिस डब्ल्यूएपी

ठीक है: प्लगइन का विवरण यहां है: docs.qgis.org/2.2/en/docs/user_manual/plugins/… और "ओवरलैप नहीं होना चाहिए" समस्या से संपर्क कर सकता है। प्लगइन का एक वीडियो गाइड यहां है: youtube.com/watch?v=huhkTZkoKC8
लुइगी पिरेली

6

आप के बाद के स्थानिक रिश्तों को खोजने के लिए मैं बहुत ही कुशल तरीके से पायथन के इटर्स्टूल और एक खोजक का उपयोग करूंगा । आप भी शामिल कर सकते ज्यामिति तरीकों overlaps , containsऔर equalज्यामिति संपत्तियों पर प्राप्त करने के लिए।

  1. वर्कफ़्लो को बेहतर ढंग से व्यवस्थित करने और पुनरावृत्ति के लिए एक फ़ंक्शन बनाकर प्रारंभ करें

    def findOverlaps(x):

  2. व्यक्तिगत सुविधा ज्यामिति पर लूप करने के लिए एक खोज कर्सर खोलें

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. itertools.combinations()पुनरावृत्त इनपुट से तत्वों के बाद लौटने के लिए उपयोग करेंcur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. निम्न विधियों में से ज्यामिति गुण से पहुंचें: equals(), overlaps(), और contains()। ये एक तार्किक अनुक्रम में सेट अप हैं - यदि आवश्यक हो तो आप अपने विशिष्ट उद्देश्यों को पूरा करने के लिए इसे ट्वीक कर सकते हैं।

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
  5. चलाओ...

enter code herefindOverlaps (एफसी)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

यहां छवि विवरण दर्ज करें

स्क्रीनशॉट विभिन्न प्रकार की विशेषताओं को दिखाता है जो अतिव्यापी, अतिव्यापी और समान और अद्वितीय हैं।

यहां छवि विवरण दर्ज करें


2

मुझे पता है कि आपके लिए क्या काम कर सकता है। यह कुछ मान्यताओं पर आधारित होने जा रहा है, लेकिन यह संभव समान सुविधाओं की आपकी सूची को कम करने में मदद करेगा। यह एक स्वचालित प्रक्रिया नहीं होगी, लेकिन इसे मैन्युअल रूप से डुप्लिकेट को देखने की आवश्यकता होगी। टिप्पणियों के आधार पर, ऐसा लगता है कि स्वचालित उपकरण विशेषताओं की तुलना नहीं करते हैं, जिससे आपको सुविधाओं को हटाने में मदद नहीं मिलेगी।

ArcMap का उपयोग करना

(1) अगर चीजें गलत हो जाएं तो अपने शेपफाइल की कॉपी बनाएं।

(२) अपने शेपफाइल में डबल के रूप में एक कॉलम जोड़ें।

(3) सबसे अधिक वर्णनात्मक (सबसे सटीक) प्रारूप का उपयोग करके प्रत्येक सुविधा के लिए क्षेत्र की गणना करें। कुछ जहां गोलाई एक मुद्दा नहीं हो सकता है।

(4) उस कॉलम पर एक सारांश (संक्षेप) चलाएं। सुनिश्चित करें कि आप संक्षेप में एक अद्वितीय पहचानकर्ता का चयन करें और पहले और अंतिम दोनों को चिह्नित करें।

(५) अपनी आउटपुट तालिका में, उन अभिलेखों को देखें जहाँ गिनती क्षेत्र १ से अधिक है।

(6 ए) मैन्युअल रूप से सुविधाओं की जांच करें और प्रक्रिया को दोहराएं जब तक कि अधिक डुप्लिकेट न हों।

(६ बी) आप केवल उन विशिष्ट आईडी की सूची बना सकते हैं और आर्कपी के माध्यम से सुविधाओं को हटा सकते हैं, लेकिन आप संभवतः एक ही क्षेत्र के साथ दो अज्ञात सुविधाओं के होने का मौका चलाते हैं।

आर्कपी का उपयोग करते हुए एक और तकनीक

जैसा कि मैं उपर्युक्त उत्तर का निर्माण कर रहा था, मैंने इस संभावना के बारे में सोचा कि किसी भी तरह इस डेटा के कई लेखकों ने वास्तव में डुप्लिकेट किए गए सुविधाओं के लिए समान अद्वितीय पहचानकर्ताओं का उपयोग किया हो सकता है। यदि ऐसा है, तो आप आर्कपी में लूपिंग के माध्यम से डुप्लिकेट खोजने में सक्षम हो सकते हैं।

जिस तरह से मैं सोचता हूं कि आर्कपी का उपयोग करने से यह आपके सिस्टम पर कर लग सकता है और थोड़ा सा ले सकता है।

(1) अपने आकार की प्रतिलिपि बनाएँ (मामले में फिर से)

(2) डुप्लिकेट को निरूपित करने के लिए एक नया कॉलम जोड़ें। कुछ ऐसा जो 'y' या 'n' या 0 या 1 या जो कुछ भी काम करता है, की तरह लगता है।

(3) अद्वितीय पहचानकर्ता को संग्रहीत करने के लिए अजगर में एक सूची बनाएं।

(4) एक अद्यतन कर्सर चलाएँ ( arcpy.UpdateCursor('LAYERNAME'))। प्रत्येक रिकॉर्ड के लिए, आप यह देखने के लिए सूची की जाँच करें कि क्या उसमें वह पहचानकर्ता है या नहीं तो आपके कॉलम को डुप्लिकेट के लिए चिह्नित करें।

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(५) फिर आप उन चिह्नित स्तंभों के साथ जो चाहें कर सकते हैं।

इन तुलनाओं को करने के लिए शायद बेहतर तरीके हैं, लेकिन वे दो हैं जो मेरा मानना ​​है कि काम करना चाहिए या कम से कम आपको शुरू करना चाहिए।

संपादित करें

एल्ब्रोसिस की टिप्पणी के आधार पर , आप गलत सुविधाओं को हटाने की संभावना को कम करने के लिए न्यूनतम बाउंडिंग आयत का उपयोग कर सकते हैं।

ArcMap का उपयोग करके, आप डेटा प्रबंधन में न्यूनतम बाउंडिंग ज्यामिति उपकरण चला सकते हैं । विकल्पों पर जाँच करने के बाद, मुझे लगता है कि CONVEX_HULL विकल्प का उपयोग करना शायद सबसे अच्छा होगा।

यदि आप डुप्लिकेट के लिए MBG_Orientation के साथ-साथ MBG_APodX / Y1 , MBG_APod_X / Y2 फ़ील्ड की तुलना करते हैं, तो आपको डुप्लिकेट सुविधाओं का एक अच्छा विचार प्राप्त करने में सक्षम होना चाहिए। मैं सुझाव दूंगा कि मैं तुलना करने के लिए ऊपर वर्णित संक्षेप विधि का उपयोग कर रहा हूं। डुप्लिकेट खोजने के लिए बाउंडिंग आयत से एक कोने (निर्देशांक) को चुनें। आपको कुछ आकस्मिक 'मैच' मिल सकते हैं, लेकिन एक बार जब आप अन्य वर्टीकल प्लस ओरिएंटेशन में जोड़ते हैं, तो यह काफी सुरक्षित शर्त होगी कि परिणाम की विशेषताएं डुप्लिकेट हैं।

हालाँकि मैंने इसका उपयोग नहीं किया है और इस उपकरण के परिणामों के बारे में निश्चित नहीं हूं, लेकिन यदि आप ArcMap में सारांश सांख्यिकी टूल का उपयोग करते हैं, तो आपको परिणामी आकार की जांच आसान लग सकती है । ऐसा लगता है कि आप मेरे एकल कॉलम विकल्प के बजाय कई कॉलमों को संक्षिप्त कर सकते हैं।

मुझे नहीं लगता कि बिना डुप्लीकेट फीचर को डिलीट किए संभावना की चिंता किए बिना ऐसा करने का एक पूरी तरह से स्वचालित तरीका होगा। इन विधियों को उन विशेषताओं की संख्या को सीमित करने में मदद करनी चाहिए जिनकी आपको मैन्युअल रूप से समीक्षा करने की आवश्यकता होगी।


मैं मान रहा हूं कि वे बहुविवाह थे। यदि वे लाइनें हैं, तो आप लंबाई का उपयोग कर सकते हैं। अंक X / Y निर्देशांक के साथ सबसे आसान हैं।
ब्रानको

2
मैंने "समान क्षेत्र सुविधाओं" के बारे में भी सोचा था, लेकिन यह मुझे इस संभावना के रूप में प्रभावित करता है कि bldg पदचिह्नों के अनपेक्षित मैचों को बनाने के लिए समान प्रकार के आकार हो सकते हैं। मुझे लगता है कि यह सुविधाओं की एक एमबीआर चौराहे को आगे / परिष्कृत करने के लिए बाधाओं में सुधार करेगा। यही है, अगर उनके पास एक ही क्षेत्र है (और एक ही विशेषता हो सकती है) और उनका एमबीआर प्रतिच्छेद करते हैं, तो शायद यह संभावना है कि वे एक ही सुविधा के दो पीढ़ी हैं। क्या इसका कोई मतलब है?
एलोबिस सिप 29'14

2

आप एसक्यूएल में एक स्थानिक स्व शामिल होने का उपयोग कर सकते हैं। आप यह नहीं बता रहे हैं कि आप किस SQL ​​बोली का उपयोग कर रहे हैं, इसलिए यह उदाहरण Postgres / Postgis का उपयोग करता है, लेकिन इसे आसानी से Oracle या SQL सर्वर के लिए अनुकूलित किया जा सकता है। ज्यामिति नामक स्तंभ में संग्रहीत ज्यामिति के साथ, इमारतों नामक एक तालिका को मानते हुए:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

इससे चौराहे मिल जाएंगे। यदि आप कुल समानता चाहते हैं तो ST_Intersects को ST_Equals से बदलें। या, बस दो को मिलाएं:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

ध्यान दें, a.id <b.id का अर्थ है कि आप केवल आधे मामलों को स्वयं से जुड़ने पर विचार करते हैं, जो इसे a) तेज बनाता है और b) आपको एक सूची देता है, जिसका उपयोग आप उन सभी को हटाए बिना ओवरलैपिंग बहुभुज के आधे हिस्से को हटाने के लिए कर सकते हैं। । स्पष्ट रूप से, यह अभी भी एक ओ (n²) एल्गोरिथ्म है, लेकिन व्यवहार में, बहुत तेज होगा यदि आपके पास स्थानिक सूचकांक है - जो वास्तव में किसी भी गैर-तुच्छ डेटा सेट के लिए कुल आवश्यकता है।

ओवरलैपिंग की कुछ परिभाषा फिट करने के लिए आपको थोड़ी मालिश करने की आवश्यकता हो सकती है - आप पड़ोसी घरों को नहीं हटाना चाहते हैं जो बुरी तरह से सर्वेक्षण कर चुके हैं।


यदि आप शेपफाइल में एक अद्वितीय विशेषता याद कर रहे हैं, तो आप a.rowidइसके बजाय उपयोग कर सकते हैं a.idrowidSQLite में एक कीवर्ड है जो आपको डेटासेट की आंतरिक आईडी देगा।
लुवी

1

अगर सही तरीके से इस्तेमाल किया जाए तो टोपोलॉजी चेकर प्लगइन एक अच्छा टूल है। आपको अभी भी अपने डेटा की मूलभूत समझ होनी चाहिए और आपको मैन्युअल रूप से 'सुधार' करना होगा। प्लगइन हाइलाइट करेगा कि वह क्या सोचता है कि त्रुटियां हैं। यह आप पर निर्भर है कि आप प्रत्येक की जाँच करें और आपके और आपके डेटा के लिए उचित निर्णय लें। आपकी परत में 90 000 आइटम के साथ, आप क्रिसमस से घर आ सकते हैं!

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