नोट: अब एक 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