Nota: Ahora hay un complemento de QGIS QChainage
. Hace todo esto y más. El código a continuación está desactualizado con QGIS 2.0 y versiones posteriores.
Aquí tienes un poco de código Python que puedes pegar en un archivo y usar dentro de QGIS:
QGIS tiene un método en su API para hacer referencia lineal, sin embargo no pude hacer que funcionara correctamente, pero contactaré al autor del código para ver si estaba haciendo algo mal.
Por ahora necesitarás la librería de Python shapely, la cual deberías instalar de todas formas 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 utilizando en el siguiente ejemplo http://toblerity.github.com/shapely/manual.html#interoperation.
La mayoría del código a continuación es código básico de QGIS que simplemente crea las características, capas, convierte de wkb y wkt y viceversa. La parte central es 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 se nos acabe la 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 se puede!"
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 y pega el código anterior en un archivo, yo lo llamé locate.py, en el directorio ~./qgis/python
(porque está en la ruta de Python) y simplemente haz lo siguiente 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 está bastante básico y podría necesitar algún ajuste.
EDICIÓN: La última versión de desarrollo de QGIS ahora puede hacer esto nativamente.
Cambia el bucle while en 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 eliminar el
from shapely.wkb import loads
from shapely.wkt import dumps
1 votos
Comparar gis.stackexchange.com/questions/11992/...
2 votos
Un par de puntos. En primer lugar, la línea debe estar en un CRS proyectado (no lat/lon). En segundo lugar, ¿su línea es una polilínea real? No creo que ningún método funcione correctamente en una línea que consta de una serie de líneas individuales. Nick.
0 votos
También, con mi código, no es necesario llamar la línea
import locate
más de una vez. Simplemente llámala una vez y luego puedes llamar alocate.pointsAlongLine(30)
todas las veces que necesites.0 votos
Otro método (dado que Sextante, como sugieren algunas respuestas aquí, es solo para QGIS <2.0), es también utilizar el complemento llamado QChainage.