Примечание: теперь есть плагин 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