Nota: ahora hay un complemento QGIS QChainage
. Hace todo esto y más. El siguiente código está desactualizado 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ínea, 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á la biblioteca Python bien formada , que debe instalar de todos modos porque es útil tenerla a mano. 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 solo crea las características, las capas, la conversión de wkb y wkt y viceversa. El bit central 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 location.py, en el ~./qgis/python
directorio (porque está en la ruta de Python) y solo 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, de esta manera:
Nota: El código es bastante tosco y podría necesitar alguna limpieza.
EDITAR: la última versión de desarrollo de QGIS ahora puede hacer esto de forma nativa.
Cambie el bucle while createPointsAt
a:
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