Catatan: Sekarang ada plugin QGIS QChainage
. Ia melakukan semua ini dan lebih banyak lagi. Kode di bawah ini kedaluwarsa dengan QGIS 2.0 dan di atasnya.
Berikut adalah beberapa kode Python yang dapat Anda tempelkan dalam file dan gunakan di dalam QGIS:
QGIS memang memiliki metode di dalamnya API untuk melakukan referensi liner namun saya tidak dapat membuatnya berfungsi dengan benar, tetapi saya akan menghubungi pembuat kode dan melihat apakah saya melakukan sesuatu yang salah.
Untuk saat ini Anda memerlukan pustaka Python yang indah , yang harus Anda instal karena berguna untuk digunakan. Ini juga memiliki dokumentasi yang bagus di http://toblerity.github.com/shapely/manual.html
Ini adalah bagian yang saya gunakan dalam contoh berikut http://toblerity.github.com/shapely/manual.html#interoperation .
Sebagian besar kode berikut adalah kode boilerplate QGIS hanya membuat fitur, lapisan, mengkonversi dari wkb dan wkt dan kembali. Bit inti adalah point = line.interpolate(currentdistance)
yang mengembalikan titik pada jarak di sepanjang garis. Kami hanya membungkus ini dalam satu lingkaran sampai kami kehabisan garis.
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)
Salin dan tempel kode di atas ke dalam file, saya panggil loc.py saya, dalam ~./qgis/python
direktori (karena berada di jalur Python) dan lakukan saja ini di konsol Python di dalam QGIS.
import locate
locate.pointsAlongLine(30)
Itu akan membuat layer titik baru dengan titik pada setiap 30 meter di sepanjang garis yang dipilih, seperti:
Catatan: Kode ini cukup kasar dan mungkin perlu dibersihkan.
EDIT: Build dev QGIS terbaru sekarang dapat melakukan ini secara asli.
Ubah loop sementara createPointsAt
ke:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
dan Anda dapat menghapus
from shapely.wkb import loads
from shapely.wkt import dumps