QGIS का उपयोग करके एक पंक्ति परत में सुविधाओं के चौराहों का पता लगाना

Nov 25 2020

मैं नीचे की तस्वीर की तरह एक ही परत में चौराहों को ढूंढना चाहता हूं। सभी लाइनें एक ही परत में अलग-अलग विशेषताएं हैं।

मैं क्यूजीआईएस में इन चौराहों को कैसे ढूंढ सकता हूं?

जवाब

8 KadirŞahbaz Nov 25 2020 at 10:26

निम्नलिखित स्क्रिप्ट का उपयोग करके आप अपेक्षित परिणाम प्राप्त कर सकते हैं। लेकिन सबसे पहले, "Vector geometry > Multipart to singleparts"टूल का उपयोग करें यदि एक ही रंग के लाइन जोड़े समान विशेषताएं हैं। क्योंकि स्क्रिप्ट ज्यामितीयों के बीच निकटतम बिंदु का उपयोग करती है।

परत नाम सेट करें। आपको epsदो लाइनें प्रतिच्छेद या स्पर्श करने के लिए एप्सिलॉन ( ) मान सेट करने की भी आवश्यकता है । क्योंकि निर्देशांक में दशमलव में छोटे परिवर्तन परिणाम को प्रभावित करते हैं। इसलिए, ज्यामिति से संबंधित कुछ उपकरणों और कार्यों में एक सीमा होती है।

मुझे लगता है कि डेटा अनुमानित समन्वय प्रणाली में है। यदि यह भौगोलिक है, तो कमी करें eps

# specify minimum distance to assume that lines intersect/touch
eps = 0.01 # 0.01 meter = 1 cm

line_lyr = QgsProject.instance().mapLayersByName('LINE_LAYER_NAME')[0]
crs = line_lyr.crs().authid()

# make new point layer
point_lyr = QgsVectorLayer("Point?crs=" + crs, "points", "memory")
point_lyr.startEditing()

for line1 in line_lyr.getFeatures():
    geom1 = line1.geometry()
    
    for line2 in line_lyr.getFeatures():
        geom2 = line2.geometry()
        
        if (geom1.distance(geom2) < eps 
            and line1.id() < line2.id()): # to avoid duplicate points 
               
            point = geom1.nearestPoint(geom2)
            feature = QgsFeature()
            feature.setGeometry(point)
            point_lyr.addFeature(feature)    
    
point_lyr.commitChanges()
QgsProject.instance().addMapLayer(point_lyr)

नोट: स्क्रिप्ट छवि में हाइलाइटिंग बिंदु भी देती है।

6 Taras Nov 25 2020 at 06:22

"लाइन चौराहों" भू-एल्गोरिदम का उपयोग करने का प्रयास करें जो उन बिंदुओं को बनाता है जहां रेखाएं प्रतिच्छेद करती हैं।

ध्यान दें कि 'Input layer'और 'Intersect layer'उसी पंक्ति की परत को चुना गया था।

यदि लाइनें काट दी जाती हैं (नीचे दी गई छवि देखें), कुछ अतिरिक्त ज्यामिति समायोजन की आवश्यकता है, यानी तड़क।

एक परत के भीतर ज्यामिति के लिए एक परत में ज्यामितीय तड़क के लिए "स्नैप ज्यामिति परत करने के लिए " लागू होते हैं ।

और "लाइन चौराहों" भू-एल्गोरिदम लागू करने के बाद।

1 hexamon Nov 26 2020 at 08:05

मैं यह मान रहा हूं कि प्रत्येक खंड एक विशेषता के बजाय एक खंड है। आप फिर लाइन लेयर के साथ बफ़र्ड स्टार्ट और एंड नोड को ओवरले करने की कोशिश कर सकते हैं।

  1. निकालें 0 और -1 के साथ विशिष्ट कार्यक्षेत्र चलाएँ (सभी प्रारंभ और अंत नोड के लिए अंक प्राप्त करने के लिए)
  2. परिणाम पर बफ़र का उपयोग करें 0.2 मीटर या कुछ और, शायद आपके डेटा के आधार पर कम हो।
  3. बफ़र प्रारंभ और अंत नोड्स के साथ इनपुट और लाइन लेयर के रूप में जॉइन लेयर के साथ रन एट्रिब्यूट बाय लोकेशन (सारांश) चलाएं । गणना करने के लिए सारांश में बॉक्स गणना की जांच करना सुनिश्चित करें । यह आपको इस बात की गिनती देगा कि यह बफ़र नोड कितनी लाइनों पर ओवरलैप करता है।
  4. Join से आउटपुट लेयर में, उन सभी फीचर्स को फ़िल्टर करें जिनकी संख्या 2 से कम है। शेष आपके चौराहे होने चाहिए।
  5. या तो नोड्स को अंक के रूप में वापस पाने के लिए परिणाम पर सेंट्रोइड्स चलाएं , या मूल निकाले गए नोड्स का चयन करें जो परिणामों को स्थान के अनुसार चयन करते हैं

यह विचार है कि सभी बफ़र्ड नोड्स की अपनी मूल पंक्ति से 1 ओवरलैप होनी चाहिए, जब तक कि वे किसी अन्य लाइन के साथ प्रतिच्छेद नहीं करते हैं, तब गिनती 2 (या बहुपरत चौराहों के लिए) होगी।