Uwaga: dostępna jest teraz wtyczka QGIS QChainage
. Robi to wszystko i jeszcze więcej. Poniższy kod jest nieaktualny w przypadku QGIS 2.0 i nowszych wersji.
Oto kod Pythona, który możesz umieścić w pliku i użyć w QGIS:
QGIS ma w sobie metodę API do wykonywania odwołań do liniowej, jednak nie mogłem go poprawnie uruchomić, ale skontaktuję się z autorem kodu i sprawdzę, czy zrobiłem coś złego.
Na razie będziesz potrzebować zgrabnej biblioteki Pythona, którą i tak powinieneś zainstalować, ponieważ dobrze jest mieć ją przy sobie. Ma również świetną dokumentację na stronie http://toblerity.github.com/shapely/manual.html
To jest sekcja, której używam w poniższym przykładzie http://toblerity.github.com/shapely/manual.html#interoperation .
Większość następującego kodu to prosty kod QGIS, który po prostu tworzy funkcje, warstwy, konwertuje z wkb i wkt iz powrotem. Bit rdzenia to taki, point = line.interpolate(currentdistance)
który zwraca punkt w pewnej odległości wzdłuż linii. Po prostu owijamy to w pętlę, dopóki nie zabraknie linii.
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)
Skopiuj i wklej powyższy kod do pliku, nazwałem mój locate.py, w ~./qgis/python
katalogu (ponieważ znajduje się on w ścieżce Pythona) i po prostu zrób to w konsoli Pythona w QGIS.
import locate
locate.pointsAlongLine(30)
Spowoduje to utworzenie nowej warstwy punktowej z punktami co 30 metrów wzdłuż wybranych linii:
Uwaga: kod jest dość zgrubny i może wymagać trochę czyszczenia.
EDYCJA: Ostatnia wersja QGIS może teraz robić to natywnie.
Zmień pętlę while createPointsAt
na:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
i możesz usunąć
from shapely.wkb import loads
from shapely.wkt import dumps