Примітка. Зараз існує плагін QGIS QChainage
. Це все це робить і багато іншого. Код нижче застарів у 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)
Скопіювавши і вставте вищезазначений код у файл, я зателефонував до свого locate.py у ~./qgis/python
каталог (тому що він знаходиться на шляху Python) і просто зробив це на консолі Python всередині QGIS.
import locate
locate.pointsAlongLine(30)
Це створить новий точковий шар з точками на кожні 30 метрів уздовж вибраних ліній, наприклад:
Примітка. Код є досить грубим і може знадобитися очищення.
РЕДАКТУВАННЯ: Найновіша розробка QGIS-розробників тепер може робити це на самому світі.
Змініть цикл while 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