หมายเหตุ:QChainage
ขณะนี้มีปลั๊กอิน QGIS มันทำทั้งหมดนี้และอีกมากมาย รหัสด้านล่างล้าสมัยด้วย QGIS 2.0 ขึ้นไป
นี่คือรหัส Python ที่คุณสามารถใช้ในไฟล์และใช้ภายใน QGIS:
QGIS มีวิธีการใน API เพื่อทำการอ้างอิงซับ แต่ฉันไม่สามารถทำงานได้อย่างถูกต้อง แต่ฉันจะติดต่อผู้เขียนรหัสและดูว่าฉันทำอะไรผิดหรือเปล่า
สำหรับตอนนี้คุณจะต้องใช้ไลบรารี Python ที่มีรูปทรงสวยงามซึ่งคุณควรติดตั้งต่อไปเพราะสะดวกในการใช้งาน นอกจากนี้ยังมีเอกสารที่ยอดเยี่ยมที่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)
คัดลอกและวางโค้ดด้านบนลงในไฟล์ฉันเรียกว่า Loc loc ของฉันใน~./qgis/python
ไดเรกทอรี (เพราะอยู่ในเส้นทาง Python) และทำสิ่งนี้ในคอนโซล Python ภายใน QGIS
import locate
locate.pointsAlongLine(30)
ที่จะสร้างเลเยอร์จุดใหม่ที่มีคะแนนทุก ๆ 30 เมตรตามแนวที่เลือกดังนี้:
หมายเหตุ: รหัสค่อนข้างหยาบและอาจต้องทำความสะอาด
แก้ไข: QGIS dev build ล่าสุดสามารถทำสิ่งนี้ได้
เปลี่ยนวนลูปใน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