¿Creando puntos equidistantes en QGIS?

22

Estoy intentando crear puntos (nueva capa) a una distancia específica a lo largo de la carretera (capa existente) en QGIS. ¿Creando puntos regulares cada medidor a nivel de condado usando ArcGIS Desktop?  Da solución para ArcGIS. ¿Cómo lograr esto en QGIS? ¿Agregar puntos a la capa vectorial de puntos usando QGIS? explica cómo crear puntos pero no hace nada con respecto a la distancia.

(apliqué las soluciones propuestas con diferentes medidas de longitudes porque no sabía la conversión) La solución de @Nathans funcionó hasta cierto punto, obtuve ...

.Aquí,laproyeccióndeestospuntosequidistantesesdiferentedelalíneaoriginal.

[email protected],recibí

donde los puntos no parecen estar equidistantes. Supongo que hay un problema de proyección con ambos que no entiendo.

    
pregunta Stat-R 08.06.2012 - 19:46

5 respuestas

14

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 superior.

Aquí hay un 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 a líneas, 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 la biblioteca de Python bien formada , que deberías instalar de todos modos porque es útil tenerla a mano. También tiene una gran documentación en enlace

Esta es la sección que estoy usando en el siguiente ejemplo enlace .

La mayoría del siguiente código es QGIS código de repetición simplemente creando las características, las capas, la conversión de wkb y wkt y viceversa. El bit de 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 el directorio ~./qgis/python (porque está en la ruta de Python) y simplemente hago esto en la consola de Python dentro de QGIS.

 import locate
 locate.pointsAlongLine(30)

Eso creará una nueva capa de puntos con puntos a cada 30 metros a lo largo de las líneas seleccionadas, así:

Nota: el código es bastante aproximado y podría necesitar una limpieza.

EDITAR: la última compilación de desarrollo de QGIS ahora puede hacer esto de forma nativa.

Cambie 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
    
respondido por el Nathan W 09.06.2012 - 17:10
5

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
    
respondido por el underdark 09.06.2012 - 11:10
5

Si desea trazar el encadenamiento a intervalos fijos a lo largo de una línea de carretera, puede usar el complemento 'Perfil desde la línea' para hacer esto. Necesita un DEM debajo de la capa de la línea de la carretera, pero el procedimiento es rápido y muy simple. Nick.

    
respondido por el nhopton 09.06.2012 - 11:39
2

Tenga en cuenta que el modelo de datos Shapely (Python) / GEOS (C ++) está definido en un plano. Entonces, si sus puntos consisten en posiciones de GPS (latitud, longitud) utilizando el método shapely.geometry.LineString.interpolate(distance) , obtendrá una posición de GPS en la distancia euclidiana a lo largo del LineString dado.

interpolate() de Shapely se basa en la clase geos::linearref::LengthIndexedLine de GEOS usando el método extractPoint .

Supuestamente, la interpolación igualmente espaciada en el plano latitud-longitud es suficiente para aplicaciones que consideran distancias relativamente pequeñas. Sin embargo, en general, se debe considerar la distancia en una esfera para las aplicaciones de SIG (como se define en WGS84 ) .

Puedo pensar en dos soluciones usando el módulo Shapely:

  • Las propiedades LineString son puntos dados y curvas interpoladas linealmente a lo largo de ellos. Quizás pueda escribir un miembro que acceda a las curvas interpoladas e implementar la siguiente integral de línea sustituyendo la distancia euclidiana. Me gusta este enfoque porque utilizando la curva continua por partes, los puntos deseados se pueden obtener calculando las intersecciones de círculos adyacentes a lo largo de la curva con el radio r = radian_measure(arc_length) = arc_length / R , donde R es igual al radio de la Tierra en la posición dada.
  • codifique su propio método de interpolación (sin tocar el código Shapely) usando una función de distancia apropiada (por ejemplo, fórmula de haversine).

Para lograr esto, me gustaría consultar la siguiente pregunta de StackOverflow y esta answer en particular:

  

ES posible generar puntos equidistantes a lo largo de la curva. Pero   Debe haber más definición de lo que quiere para una respuesta real.   Lo siento, pero el código que he escrito para esta tarea está en MATLAB, pero puedo   Describe las ideas generales. Hay tres posibilidades.

     

Primero, son los puntos para ser verdaderamente equidistantes de los vecinos en   ¿Términos de una simple distancia euclidiana? Hacerlo implicaría encontrar   la intersección en cualquier punto de la curva con un círculo de un fijo   radio. Luego, solo paso a lo largo de la curva.

     

A continuación, si pretende que la distancia sea la distancia media a lo largo de la curva,   si la curva es lineal por partes, el problema es fácil de nuevo   hacer. Solo paso a lo largo de la curva, ya que la distancia en un segmento de línea es   fácil de medir.

     

Finalmente, si pretendes que la curva sea una spline cúbica, de nuevo esto   No es increíblemente difícil, pero es un poco más de trabajo. Aquí el truco es   a:

     
  • Calcula la longitud de arco lineal por tramos de un punto a otro a lo largo de la curva. Llámalo t. Genera un par de splines cúbicos, x (t), y (t).

  •   
  • Distingue x e y como funciones de t. Ya que estos son segmentos cúbicos, esto es fácil. Las funciones derivadas serán por partes
      cuadrático.

  •   
  • Use un solucionador de odas para moverse a lo largo de la curva, integrando la función de longitud de arco diferencial. En MATLAB, ODE45 funcionó muy bien.
  •   

Así, se integra

sqrt((x')^2 + (y')^2)
     

Nuevamente, en MATLAB, ODE45 puede configurarse para identificar aquellas ubicaciones donde   la función cruza ciertos puntos especificados.

     

Si tus habilidades de MATLAB están a la altura de la tarea, puedes mirar el código en    interparc para obtener más información. Está razonablemente bien comentado.   código.

     

3 :    enlace

    
respondido por el Patryk 28.06.2016 - 11:33
1

Sextante tiene una herramienta que podría funcionar para usted. Sextante se puede descargar desde el repositorio de complementos de Qgis.

Buscar:
"Herramientas para capas de líneas"
"Líneas a puntos equidistados"

    
respondido por el klewis 10.06.2012 - 16:38

Lea otras preguntas en las etiquetas