Nota: ora è disponibile un plug-in QGIS QChainage
. Fa tutto questo e altro. Il codice seguente non è aggiornato con QGIS 2.0 e versioni successive.
Ecco del codice Python che puoi inserire in un file e usare all'interno di QGIS:
QGIS ha un metodo nella sua API per fare riferimento al liner ma non sono riuscito a farlo funzionare correttamente, ma contatterò l'autore del codice e vedrò se stavo facendo qualcosa di sbagliato.
Per ora avrai bisogno della formosa libreria Python, che dovresti comunque installare perché è utile avere in giro. Ha anche un'ottima documentazione su http://toblerity.github.com/shapely/manual.html
Questa è la sezione che sto usando nell'esempio seguente http://toblerity.github.com/shapely/manual.html#interoperation .
La maggior parte del codice seguente è il codice QGIS del boilerplate semplicemente creando le funzionalità, i layer, convertendo da wkb e wkt e viceversa. Il bit principale è quello point = line.interpolate(currentdistance)
che restituisce un punto a distanza lungo una linea. Lo avvolgiamo in un ciclo fino a quando non finiamo la linea.
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)
Copia e incolla il codice sopra in file, ho chiamato mio Locate.py, nella ~./qgis/python
directory (perché è nel percorso Python) e basta fare questo nella console Python all'interno di QGIS.
import locate
locate.pointsAlongLine(30)
Ciò creerà un nuovo livello punti con punti ogni 30 metri lungo le linee selezionate, in questo modo:
Nota: il codice è piuttosto approssimativo e potrebbe essere necessario ripulirlo.
EDIT: l'ultimo build di sviluppo QGIS ora può farlo nativamente.
Cambia il ciclo while in createPointsAt
:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
e puoi rimuovere il file
from shapely.wkb import loads
from shapely.wkt import dumps