Saltar al contenido

¿Creando puntos equidistantes en QGIS?

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í:

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *