Solución:
Nota: Ahora hay un complemento de QGIS QChainage
. Hace todo esto y más. El siguiente código no está actualizado con QGIS 2.0 y superior.
Aquí hay un código de Python que puede pegar en un archivo y usar dentro de QGIS:
QGIS tiene un método en su API para hacer referencias de líneas sin embargo no pude hacer que funcione correctamente, pero me pondré en contacto con el autor del código y veré si estaba haciendo algo mal.
Por ahora necesitarás el bien proporcionado Biblioteca de Python, que debe instalar de todos modos porque es útil tenerla cerca. También tiene una excelente documentación en http://toblerity.github.com/shapely/manual.html
Esta es la sección que estoy usando en el siguiente ejemplo http://toblerity.github.com/shapely/manual.html#interoperation.
La mayor parte del siguiente código es un código repetitivo de QGIS que simplemente crea las características, las capas, la conversión de wkb y wkt y viceversa. El núcleo es el point = line.interpolate(currentdistance)
que devuelve un punto a una distancia a lo largo de una línea. Simplemente envolvemos esto en un bucle hasta que nos quedemos sin línea.
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)
Copie y pegue el código anterior en el archivo, llamé a mi Locate.py, en ~./qgis/python
directorio (porque está en la ruta de Python) y simplemente haga esto en la consola de Python dentro de QGIS.
import locate
locate.pointsAlongLine(30)
Eso creará una nueva capa de puntos con puntos cada 30 metros a lo largo de las líneas seleccionadas, así:
Nota: el código es bastante aproximado y es posible que necesite una limpieza.
EDITAR: La última versión de desarrollo de QGIS ahora puede hacer esto de forma nativa.
Cambiar el bucle while en createPointsAt
para:
while currentdistance < length:
point = geom.interpolate(distance)
fet = QgsFeature()
fet.setAttributeMap( { 0 : currentdistance } )
fet.setGeometry(point)
feats.append(fet)
currentdistance = currentdistance + distance
y puedes quitar el
from shapely.wkb import loads
from shapely.wkt import dumps
Puede utilizar la herramienta v.to.points del complemento QGIS GRASS para crear puntos a lo largo de las líneas a intervalos regulares
# convert line to points; dmax = distance between points
v.to.points -i -v -t in=road out=road_pts type=line dmax=90
Si desea trazar el PK a intervalos fijos a lo largo de una línea de carretera, puede usar el complemento ‘Perfil desde la línea’ para hacerlo. Necesita un DEM debajo de la capa de la línea de la carretera, pero el procedimiento es rápido y muy simple. Mella.