Saltar al contenido

¿Crear puntos equidistantes en QGIS?

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

ingrese la descripción de la imagen aquí

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.

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 *