QGIS में समभुज बिंदु बनाना?


22

मैं क्यूजीआईएस में सड़क (मौजूदा परत) के साथ विशिष्ट दूरी पर अंक (नई परत) बनाने की कोशिश कर रहा हूं। आर्कगिस डेस्कटॉप का उपयोग करके काउंटी स्तर पर हर मीटर पर नियमित अंक बनाना? ArcGIS के लिए समाधान देता है। QGIS में इसे कैसे प्राप्त करें? क्यूजीआईएस का उपयोग करते हुए बिंदु सदिश परत के बिंदुओं को जोड़ना? बताते हैं कि अंक कैसे बनाएं लेकिन दूरी के बारे में कुछ भी नहीं करता है।


(मैंने रूपांतरण के लिए लम्बाई के विभिन्न उपायों के साथ प्रस्तावित समाधानों को लागू किया था) @ नातान के समाधान ने कुछ हद तक काम किया, मुझे मिला ...

यहां छवि विवरण दर्ज करें। यहां, इन समभुज बिंदुओं का प्रक्षेपण मूल रेखा से अलग है।

@ अंडरडार्क के सुझाव के साथ, मुझे मिल गया

यह तस्वीरजहाँ बिंदु समतुल्य प्रतीत नहीं होते हैं। मुझे लगता है कि इन दोनों के साथ कुछ प्रक्षेपण मुद्दा है जो मुझे समझ में नहीं आ रहा है।


1
की तुलना करें gis.stackexchange.com/questions/11992/...
UnderDark

2
कुछ बिंदु। सबसे पहले, लाइन को एक अनुमानित सीआरएस (अव्यक्त / लोन नहीं) में होना चाहिए। दूसरी बात, क्या आपकी लाइन एक सही पॉलीलाइन है? मुझे नहीं लगता कि कोई भी विधि एक पंक्ति पर ठीक से काम करेगी जिसमें अलग-अलग लाइनों की एक स्ट्रिंग शामिल है। निक।
नेपटन

मेरे कोड के साथ, आपको import locateलाइन को एक बार फिर कॉल करने की आवश्यकता नहीं है । बस एक बार इसे कहते तो आप कॉल कर सकते हैं locate.pointsAlongLine(30)के रूप में आप की जरूरत है जितना
नाथन डब्ल्यू

एक अन्य विधि (जो कि कुछ उत्तरों द्वारा सुझाई गई सेक्स्टैंट है यहाँ QGIS <2.0 केवल है), QChainage नामक प्लगइन का उपयोग करने के लिए भी है।
एंडी

जवाबों:


14

नोट: अब एक QGIS प्लगइन है QChainage। यह यह सब और बहुत कुछ करता है। नीचे दिया गया कोड QGIS 2.0 और इसके बाद के संस्करण से पुराना है।

यहाँ कुछ पायथन कोड है जिसे आप एक फ़ाइल में चिपका सकते हैं और QGIS के अंदर उपयोग कर सकते हैं:

क्यूजीआईएस में एक विधि है इसमें एपीआई को लाइनर रेफ़रिंग करना है, हालांकि मैं इसे सही तरीके से काम करने के लिए नहीं पा सकता हूं, लेकिन मैं कोड के लेखक से संपर्क करूंगा और देखूंगा कि क्या मैं कुछ गलत कर रहा था।

अभी के लिए आपको सुडौल पाइथन लाइब्रेरी की आवश्यकता होगी , जिसे आपको वैसे भी स्थापित करना चाहिए क्योंकि यह आसपास होना आसान है। इसमें http://toblerity.github.com/shapely/manual.html पर भी शानदार प्रलेखन है

इस अनुभाग में मैं निम्न उदाहरण में उपयोग कर रहा हूँ है http://toblerity.github.com/shapely/manual.html#interoperation

निम्नलिखित कोड में से अधिकांश QGIS बॉयलरप्लेट कोड है, जो केवल फीचर्स, लेयर्स बनाने, wkb और wkt और बैक से परिवर्तित करने के लिए है। मुख्य बिट वह है point = line.interpolate(currentdistance)जो एक रेखा के साथ दूरी पर एक बिंदु देता है। हम इसे एक लूप में लपेटते हैं जब तक हम लाइन से बाहर नहीं निकल जाते।

import qgis
from qgis.core import *
from PyQt4.QtCore import QVariant
from shapely.wkb import loads
from shapely.wkt import dumps

vl = None
pr = None

def createPointsAt(distance, geom):
    if distance > geom.length():
        print "No Way Man!"
        return

    length = geom.length()
    currentdistance = distance
    feats = []  

    while currentdistance < length: 
        line = loads(geom.asWkb())
        point = line.interpolate(currentdistance)
        fet = QgsFeature()
        fet.setAttributeMap( { 0 : currentdistance } )
        qgsgeom = QgsGeometry.fromWkt(dumps(point))
        fet.setGeometry(qgsgeom)
        feats.append(fet)
        currentdistance = currentdistance + distance

    pr.addFeatures(feats)
    vl.updateExtents()

def pointsAlongLine(distance):
    global vl
    vl = QgsVectorLayer("Point", "distance nodes", "memory")
    global pr
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = qgis.utils.iface.mapCanvas().currentLayer()
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        createPointsAt(distance, geom)

    QgsMapLayerRegistry.instance().addMapLayer(vl)

फ़ाइल में उपरोक्त कोड को कॉपी और पेस्ट करें, मैंने ~./qgis/pythonनिर्देशिका में (क्योंकि यह पायथन पथ में है) में मेरा पता-थ्रूहेम कहा है, और यह क्यूजीआईएस के अंदर पायथन कंसोल में करें।

 import locate
 locate.pointsAlongLine(30)

यह चयनित लाइनों के साथ हर 30 मीटर पर बिंदुओं के साथ एक नई बिंदु परत बनाएगा, जैसे:

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

नोट: कोड बहुत मोटा है और कुछ सफाई की आवश्यकता हो सकती है।

EDIT: सबसे अंतिम QGIS देव बिल्ड अब यह मूल रूप से कर सकता है।

लूप को इसमें बदलें createPointsAt:

 while currentdistance < length: 
    point = geom.interpolate(distance)
    fet = QgsFeature()
    fet.setAttributeMap( { 0 : currentdistance } )
    fet.setGeometry(point)
    feats.append(fet)
    currentdistance = currentdistance + distance

और आप इसे हटा सकते हैं

from shapely.wkb import loads
from shapely.wkt import dumps

धन्यवाद @ नथन। मुझे अपने अजगर के लिए शेपली पैकेज नहीं मिल सका। मैंने अजगर 2.7 स्थापित किया लेकिन शेपली इंस्टॉलर का कहना है कि अजगर 2.7 मेरी रजिस्ट्री में नहीं है। वहाँ Shapely स्थापित करने के लिए एक और तरीका है।
स्टेट-आर

मैंने stackoverflow.com/questions/3652625/… का अनुसरण किया और कॉल करने locateऔर इसका उपयोग करने के लिए उपरोक्त दो पंक्तियों को टाइप किया लेकिन फिर भी मुझे समभुज अंक नहीं मिले। इसके अलावा, मैं पायथन में एक नवजात शिशु हूं इसलिए मुझे समझ नहीं आया कि कोड (1) पायथन को क्यूगिस निर्देशिका में कैसे चलाया जाए या (2) कि C: \ Python27 \ पर?
स्टेट-आर

आप किस ओएस पर हैं?
नाथन डब्ल्यू

विंडोज 7 प्रोफेशनल
स्टेट-आर

अजगर फ़ाइल बनाएँ C:\Users\{you user name}\.qgis\pythonतो QGIS को पुनरारंभ करें यदि खुला है, और ` . Load a line layer, select a line a call प्लगइन्स- > पायथन कंसोल आयात पर जाएं 'औरlocate.pointsAlongLine(30)
नाथन डब्ल्यू

5

आप नियमित अंतराल पर लाइनों के साथ अंक बनाने के लिए QGIS GRASS प्लगइन v.to.point टूल का उपयोग कर सकते हैं

# convert line to points; dmax = distance between points
v.to.points -i -v -t in=road out=road_pts type=line dmax=90

मैंने 100 के रूप में dmax का उपयोग किया और प्रत्येक के लिए परिणामी अनुमान इस प्रकार है। (मुझे नहीं पता कि सीआरएस खुद को कैसे सौंपा जा रहा है।)CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
स्टेट-आर

अब यह भी पसंद करें: QGIS -> Sextante -> GRASS -> v.to.point
markusN

5

यदि आप एक रोड लाइन के साथ निश्चित अंतराल पर श्रृंखला को प्लॉट करना चाहते हैं तो आप ऐसा करने के लिए 'प्रोफाइल से लाइन' प्लग-इन का उपयोग कर सकते हैं। आपको सड़क लाइन की परत के नीचे एक डेम की आवश्यकता है, लेकिन प्रक्रिया त्वरित और बहुत सरल है। निक।

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


यह एक बहुत अच्छा और आसान तरीका है, धन्यवाद!
शेफर्डो

2

एक विमान में Shapely (पायथन) / GEOS (C ++) डेटा मॉडल को परिभाषित किया गया है। तो अगर आपके बिंदुओं में जीपीएस पोजीशन (अक्षांश, देशांतर) शामिल हैं, तो shapely.geometry.LineString.interpolate(distance)विधि का उपयोग करके दिए गए यूक्लिडियन दूरी पर एक जीपीएस स्थिति का उत्पादन होगा LineString

Shapely की विधि का उपयोग कर interpolate()GEOS ' geos::linearref::LengthIndexedLineवर्ग पर आधारित है extractPoint

माना जाता है कि अक्षांश-देशांतर-समतल में समान रूप से फैला हुआ अंतर अपेक्षाकृत छोटी दूरी पर विचार करने वाले अनुप्रयोगों के लिए पर्याप्त है। सामान्य तौर पर, हालांकि, किसी को जीआईएस अनुप्रयोगों के लिए एक क्षेत्र पर दूरी पर विचार करना चाहिए (जैसा कि डब्ल्यूजीएस 84 में परिभाषित किया गया है )।

मैं Shapely मॉड्यूल का उपयोग करते हुए दो वर्कअराउंड के बारे में सोच सकता हूं:

  • LineStringगुण सभी बिंदु दिए गए हैं और उनके साथ रैखिक रूप से प्रक्षेपित वक्र हैं। शायद आप एक सदस्य लिख सकते हैं जो प्रक्षेपित वक्रों तक पहुंचता है और यूक्लिडियन दूरी को प्रतिस्थापित करते हुए निम्नलिखित पंक्ति को अभिन्न रूप से लागू करता है। मुझे यह दृष्टिकोण पसंद है क्योंकि टुकड़ा-वार निरंतर वक्र का उपयोग करके वांछित बिंदुओं को त्रिज्या के साथ वक्र के साथ आसन्न हलकों के चौराहों की गणना करके प्राप्त किया जा सकता है r = radian_measure(arc_length) = arc_length / R, जहां आर दी गई स्थिति पर पृथ्वी की त्रिज्या के बराबर होती है।
  • एक उपयुक्त दूरी फ़ंक्शन (जैसे। haversine सूत्र) का उपयोग करके अपने स्वयं के प्रक्षेप विधि (Shapely कोड को छूने के बिना) को कोड करें।

इसे प्राप्त करने के लिए मैं निम्नलिखित StackOverflow प्रश्न और विशेष रूप से इस उत्तर का उल्लेख करना चाहूंगा :

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

सबसे पहले, एक साधारण यूक्लिडियन दूरी के संदर्भ में पड़ोसियों से वास्तव में समान होने के बिंदु हैं? ऐसा करने के लिए एक निश्चित त्रिज्या के एक चक्र के साथ वक्र पर किसी भी बिंदु पर प्रतिच्छेदन ढूंढना शामिल होगा। फिर बस वक्र के साथ कदम रखें।

इसके बाद, यदि आप वक्र के साथ दूरी के लिए दूरी का इरादा रखते हैं, यदि वक्र एक टुकड़ा रैखिक है, तो समस्या फिर से करना आसान है। वक्र के साथ बस कदम, क्योंकि एक खंड खंड पर दूरी को मापना आसान है।

अंत में, यदि आप कर्व के लिए क्यूबिक स्पलाइन होने का इरादा रखते हैं, तो फिर से यह अविश्वसनीय रूप से मुश्किल नहीं है, लेकिन थोड़ा और काम है। यहाँ चाल है:

  • वक्र के साथ-साथ बिंदु से बिंदु तक रैखिक रेखीय आरेख की गणना करें। इसे t कहो। क्यूबिक स्प्लीन, x (t), y (t) की एक जोड़ी उत्पन्न करें।

  • T के कार्यों के रूप में x और y को अलग करें। चूंकि ये घन खंड हैं, इसलिए यह आसान है। व्युत्पन्न कार्य टुकड़े-टुकड़े
    द्विघात होंगे।

  • विभेदक आरेखीय कार्य को एकीकृत करते हुए वक्र के साथ स्थानांतरित करने के लिए एक आयोड सॉल्वर का उपयोग करें। MATLAB में, ODE45 ने अच्छी तरह से काम किया।

इस प्रकार, एक एकीकृत करता है

sqrt((x')^2 + (y')^2)

MATLAB में फिर से, ODE45 को उन स्थानों की पहचान करने के लिए सेट किया जा सकता है, जहां फ़ंक्शन कुछ निर्दिष्ट बिंदुओं को पार करता है।

यदि आपका MATLAB कौशल कार्य पर निर्भर है, तो आप अधिक स्पष्टीकरण के लिए कोड को इंटरपार्क में देख सकते हैं । यह यथोचित टिप्पणी कोड है।

3 : http://www.mathworks.com/matlabcentral/fileexchange/34874-interparc


1

Sextante में एक उपकरण है जो आपके लिए काम कर सकता है। Sextante को Qgis plugin रिपॉजिटरी से डाउनलोड किया जा सकता है।

इसके लिए देखें:
"लाइन लेयर्स के लिए टूल"
"लाइनों को समान बिंदुओं"


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