Posterior a de esta extensa selección de datos resolvimos este asunto que tienen algunos de nuestros lectores. Te ofrecemos la solución y nuestro deseo es que resulte de gran ayuda.
Solución:
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 funcionara 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 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 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 tosco y podría necesitar algo de limpieza.
EDITAR: La última compilación de desarrollo de QGIS ahora puede hacer esto de forma nativa.
Cambiar el ciclo 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 usar 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 línea de carretera, pero el procedimiento es rápido y muy simple. Mella.