QGIS में लाइन के लिए कई बिंदुओं को संरेखित करना?


11

मैं लाइन ऑब्जेक्ट के चारों ओर एक निर्दिष्ट सहिष्णुता या बफर का उपयोग करते हुए एक पंक्ति में कई बिंदुओं को एक पंक्ति या रेखाओं के साथ संरेखित करना चाहूंगा। कृपया संलग्न किए गए नमूना स्केच को देखें।

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

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


तो बिंदु को लाइन के बाद में 0 मैप यूनिट होने की आवश्यकता है, लेकिन क्या आप इस बात की परवाह करते हैं कि बिंदु बिंदु के मूल स्थान के संबंध में लाइन के अनुदैर्ध्य रूप से कहाँ समाप्त होता है?
जो

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

निश्चित नहीं है कि यह सबसे अच्छा तरीका है, लेकिन एक तरह से मैं सोच सकता हूं कि दो डेटासेट का विश्लेषण करने और कुछ बिंदु निर्देशांक बनाने के लिए कुछ अजगर कोड लिखना है। यदि आप चाहते हैं कि यह आपको लगता है, तो मुझे बताएं और मैं आपके लिए एक उत्तर प्रदान कर सकता हूं। जैसे हर बिंदु के लिए, यदि लाइन से अक्षांश डिस्ट का पूर्ण मान <= 5 यूनिट है, तो पार्श्व दूरी = 0. आपको x, y मान को कोर्ड्स में परिवर्तित करने के लिए एक गाल्ड लाइब्रेरी आयात करना होगा। टिप्पणियां देखें: gis.stackexchange.com/questions/185445/…
जो

PyQGIS के साथ, यह एक मेमोरी लेयर का उत्पादन किया जा सकता है, जहां पॉइंट्स को पहले से 5 मैप यूनिट्स की सहिष्णुता और लाइन के लिए लंबवत पथ के अनुसार स्नैप किया जाता है। मेरा जवाब देखिए।
xunilk

जवाबों:


15

इसमें (अप्रबंधित) QGIS 3.0 संस्करण में ऐसा करने के लिए एक अंतर्निहित टूल है। आप पहले से ही इसका परीक्षण करने के लिए QGIS वेबसाइट से एक रात का स्नैपशॉट प्राप्त कर सकते हैं।

यह करने के लिए:

  1. एल्गोरिथ्म को संसाधित करने के लिए "स्नैप ज्यामिति को परत करें" चलाएं
  2. "इनपुट लेयर" के रूप में अपनी अंक परत का चयन करें
  3. पंक्ति परत को "संदर्भ परत" के रूप में चुनें
  4. एक उपयुक्त सहिष्णुता दर्ज करें (तड़कते समय बिंदुओं को स्थानांतरित करने के लिए अधिकतम दूरी)
  5. व्यवहार को "निकटतम बिंदु को प्राथमिकता दें" बदलें

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

यहां परिणाम है, मूल बिंदुओं को "x" के रूप में, और हरे बिंदुओं के रूप में तले हुए अंक। मैंने यहां एक सहिष्णुता का उपयोग किया है ताकि केवल कुछ इनपुट बिंदुओं को तड़कना पड़े।

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


यह ठीक वैसा ही है जैसा मुझे चाहिए। दुर्भाग्य से मेरे नियोक्ता केवल QGIS के LTR संस्करण स्थापित करते हैं और हम सभी परीक्षण संस्करणों को डाउनलोड करने और स्थापित करने से प्रतिबंधित हैं। (आह) मुझे लगता है कि यह प्रतीक्षा की बात है। क्या यह एक मानक / फंक्शन या निर्मित प्लग-इन है?
एड कैमडेन

सी ++ कक्षाओं में परिवर्तन पर निर्भर मानक कार्यक्षमता - मैन्युअल रूप से पुराने संस्करण में इसे कॉपी करने का कोई तरीका नहीं है। आप संभावित रूप से एक अलग मशीन पर OSGEO4W का उपयोग करके स्थापित करने की कोशिश कर सकते हैं, और फिर अपने कार्य केंद्र पर चलाने के लिए एक यूएसबी स्टिक के लिए osgeo4w फ़ोल्डर की नकल कर सकते हैं। मैं अतीत में उस दृष्टिकोण के साथ किस्मत में था।
ndawson

1
पुराने संस्करण के लिए इस प्लगइन पर एक नज़र है। docs.qgis.org/2.14/en/docs/user_manual/plugins/…
iRfAn

ऐसा लगता है कि प्लगइन बिंदुओं की परतों का समर्थन नहीं करता है।
मायकोला कोज़ियर

7

यह PyQGIS के साथ वहन किया जा सकता है । अगली स्थिति के लिए:

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

निम्न कोड, 5 मानचित्र इकाइयों की सहिष्णुता पर विचार करते हुए, QGIS के पायथन कंसोल पर चला गया था:

from math import sqrt

registry = QgsMapLayerRegistry.instance()

points = registry.mapLayersByName('points')
line = registry.mapLayersByName('line')

feat_points = [ feat for feat in points[0].getFeatures() ]
feat_line = line[0].getFeatures().next()

new_points = []

for feat in feat_points:
    pt = feat.geometry().asPoint()
    sqrdist, point, vertex = feat_line.geometry().closestSegmentWithContext(pt)
    if sqrt(sqrdist) <= 5:
        new_points.append(point)
    else:
        new_points.append(pt)

epsg = points[0].crs().postgisSrid()

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'new_points',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_points)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPoint(new_points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

यह एक मेमोरी लेयर तैयार की गई थी जहाँ पॉइंट्स को 5 मैप यूनिट्स के लिए सहिष्णुता और लाइन के लिए लंबवत पथ के अनुसार तड़क दिया गया था।

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


2

आप इसे रिफ्लेक्शंस प्लगिन के साथ फील्ड कैलकुलेटर में भी कर सकते हैं। आप एक लेयर ज्यामिति के साथ-साथ फ़ील्ड को अपडेट करने के लिए फ़ील्ड कैलकुलेटर का उपयोग कर सकते हैं। RefFunctions आपको किसी दिए गए दूरी (या "geomnearest" यदि आप कोई सीमा नहीं चाहते हैं) के भीतर निकटतम रेखा खोजने के लिए "जियोमिस्टेंस" फ़ंक्शन देता है और एक विशेषता या ज्यामिति लौटाएगा, और "निकटतम .0 बिंदु" फ़ंक्शन निकटतम मिलेगा किसी दिए गए ज्यामिति पर इंगित करें। उन्हें एक साथ स्ट्रिंग करना ताकि अपनी बिंदु परत के लिए नए ज्यामितीयों की गणना करें:

closest_point(geom_from_wkt(geomdistance('snap_lines','$geometry',10)) , $geometry)

सीधे ज्यामिति को अपडेट करने के बजाय, आप इसके बजाय स्नैप किए गए ज्यामिति के साथ एक क्षेत्र की गणना कर सकते हैं। मैं अलग-अलग स्ट्रीम लेयर्स के लिए पॉइंटिंग पॉइंट के लिए कई जियोमेट्री स्टोर करता हूं और फील्ड कैलकुलेटर में पॉइंट ज्योमेट्री को आसानी से अपडेट कर सकता हूं, जिसकी स्ट्रीम लाइनों के आधार पर मुझे इस्तेमाल करने की जरूरत है।

इसके साथ कुछ सीमाएँ हैं, दोनों परतों को एक ही CRS होने की आवश्यकता है और geomdistance फ़ंक्शन आपको एक त्रुटि देगा यदि आपके पास 100,000 से अधिक अंक हैं, लेकिन आप इस सीमा को बदल सकते हैं यदि आप refFunctions प्लगइन फ़ाइल को संपादित करते हैं।

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