13 votos

¿Alineación de varios puntos con una línea en QGIS?

Me gustaría alinear múltiples puntos a una línea, o líneas dentro de una capa, utilizando una tolerancia o búfer especificado alrededor de los objetos de la línea. Por favor, consulte el croquis de muestra adjunto.

En este ejemplo, los puntos más cercanos a la línea en la imagen ANTES están a menos de 5 unidades de mapa de la línea, mientras que los puntos más alejados están a más de 10 unidades de mapa. Me gustaría ajustar los puntos más cercanos a la línea más cercana, utilizando una tolerancia de 5 unidades de mapa para lograr el resultado en la imagen DESPUÉS.

enter image description here

0 votos

Así que el punto tiene que estar a 0 unidades de mapa lateralmente de la línea, pero ¿te importa dónde termina el punto longitudinalmente de la línea con respecto a la ubicación original del punto?

0 votos

Lo ideal sería mover los puntos utilizando una trayectoria perpendicular a la línea. Sin embargo, la intención es utilizar tolerancias bastante pequeñas. Si los puntos se mueven longitudinalmente o latitudinalmente, hacia la línea, no se desplazarán mucho de una posición perpendicular preferible.

0 votos

No estoy seguro de que esta sea la mejor manera, pero una forma que se me ocurre es escribir algo de código python para analizar los dos conjuntos de datos y producir algunas coordenadas de puntos. Si esto es lo que crees que quieres, házmelo saber y podré darte una respuesta. Por ejemplo, para cada punto, si el valor absoluto de la distancia lat de la línea <= 5 unidades, entonces la distancia lateral = 0. Tendrías que importar una biblioteca gdal para convertir los valores x,y en coords. Ver comentarios en: gis.stackexchange.com/questions/185445/

15voto

John Feminella Puntos 123

Hay una herramienta incorporada para hacer esto en la versión (no liberada) de QGIS 3.0. Puede obtener una instantánea nocturna del sitio web de QGIS para probarlo por adelantado.

Para ello:

  1. Ejecutar el algoritmo de procesamiento "Ajustar geometrías a la capa"
  2. Seleccione su capa de puntos como "capa de entrada"
  3. Seleccione la capa de líneas como "capa de referencia"
  4. Introduzca una tolerancia adecuada (distancia máxima para mover los puntos mientras se ajusta)
  5. Cambiar el comportamiento a "Preferir el punto más cercano"

enter image description here

Aquí está el resultado, mostrando los puntos originales como "x", y los puntos ajustados como puntos verdes. He utilizado una tolerancia aquí para que sólo algunos de los puntos de entrada se ajusten.

enter image description here

0 votos

Esto es exactamente lo que necesito. Por desgracia, mi empleador sólo instala versiones LTR de QGIS y todos estamos restringidos a descargar e instalar versiones de prueba. (suspiro) Supongo que es cuestión de esperar. ¿Se trata de una función estándar/incorporada o de un complemento?

0 votos

La funcionalidad estándar depende de los cambios en las clases de c++ - no hay manera de copiar manualmente esto a una versión anterior. Usted podría tratar de instalar usando OSGEO4W en una máquina diferente, y luego copiar la carpeta osgeo4w a una memoria USB para ejecutar en su estación de trabajo. He tenido suerte con ese enfoque en el pasado.

1 votos

Para la versión antigua, mira este plugin. docs.qgis.org/2.14/es/docs/user_manual/plugins/

7voto

Yada Puntos 9489

Esto se puede permitir con PyQGIS . Para la siguiente situación:

enter image description here

El siguiente código, considerando una tolerancia de 5 unidades de mapa, se ejecutó en la consola Python de QGIS:

from math import sqrt

registry = QgsMapLayerRegistry.instance()

points = registry.mapLayersByName('points')
line = registry.mapLayersByName('line')

feat_points = [ feat for feat in points[0].getFeatures() ]
feat_line = line[0].getFeatures().next()

new_points = []

for feat in feat_points:
    pt = feat.geometry().asPoint()
    sqrdist, point, vertex = feat_line.geometry().closestSegmentWithContext(pt)
    if sqrt(sqrdist) <= 5:
        new_points.append(point)
    else:
        new_points.append(pt)

epsg = points[0].crs().postgisSrid()

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'new_points',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_points)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPoint(new_points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Se produjo una capa de memoria en la que los puntos se ajustaron según la tolerancia previamente considerada de 5 unidades de mapa y una trayectoria perpendicular a la línea.

enter image description here

2voto

rjohnston Puntos 2450

También puede hacerlo en la calculadora de campos con el plugin refFunctions. Puedes utilizar la Calculadora de Campos para actualizar la geometría de una capa así como los campos. refFunctions te da una función "geomdistance" para encontrar la línea más cercana dentro de una distancia dada (o "geomnearest" si no quieres un umbral) y devolverá un atributo o la geometría, y la función "closest_point" encontrará el punto más cercano en una geometría dada. Encadénalos así para calcular nuevas geometrías para tu capa de puntos:

closest_point(geom_from_wkt(geomdistance('snap_lines','$geometry',10)) , $geometry)

En lugar de actualizar directamente la geometría, puede calcular un campo con la geometría ajustada. Yo almaceno múltiples geometrías para ajustar puntos de alcantarilla a diferentes capas de arroyos y puedo actualizar fácilmente la geometría del punto en la Calculadora de campos dependiendo de las líneas de arroyos que necesite utilizar.

Hay algunas limitaciones con esto, ambas capas necesitan ser el mismo CRS y la función geomdistance le dará un error si usted tiene más de 100.000 puntos, pero se puede cambiar este límite si se edita refFunctions archivo plugin.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X