4 votos

Cómo obtener la distancia a lo largo de una línea en un punto específico en QGIS/PyQGIS

Tengo una geometría de líneas y otra de puntos. Necesito saber la distancia a lo largo de la línea en el punto. Puedo ver la función QgsGeometry.interpolate() pero eso es lo contrario de lo que quiero hacer. Tengo un punto, necesito que la función devuelva la distancia. ¿Falta esta función en la API?

Para los versados en PostGIS, necesito algo parecido a la función ST_Line_Locate_Point() pero en PyQGIS.

4voto

Mat Puntos 196

Tienes razón, esto parece faltar en la API, tanto en QgsGeometry y en QgsGeos

QGIS utiliza GEOS como motor de geometría, y parece que esta opción no existe.

Puedes solucionarlo iterando sobre los segmentos de línea, contando sus longitudes. Cuando llegues al segmento que interseca tu punto, añade la longitud desde el inicio de la línea hasta tu punto y sal del bucle.

En este caso, he configurado una forma geométrica simple que comienza con dos líneas de longitud sqrt(2), y he hecho el punto a mitad de camino a lo largo del 2º segmento. El resultado es el esperado, 1.5*sqrt(2)

# your point
point_x = 2.5
point_y = 1.5

# your line
gLine = QgsGeometry.fromPolyline([QgsPoint(1, 1), QgsPoint(2, 2),QgsPoint(3,1),QgsPoint(6,1)])
gPoint = QgsGeometry.fromPoint(QgsPoint(point_x,point_y))
lineGeom = gLine.asPolyline() 

# step through line segments
total_len = 0
for seg_start, seg_end in zip(lineGeom, lineGeom[1:]):
   line_start = QgsPoint(seg_start)
   line_end = QgsPoint(seg_end) 
   segment = QgsGeometry.fromPolyline([line_start,line_end])
   print segment.exportToWkt()
   if gPoint.intersects(segment):
       to_point = QgsGeometry.fromPolyline([line_start, QgsPoint(point_x,point_y)])
       total_len += to_point.length()
       break
   else:
       total_len += segment.length()
print total_len

Ese código da la distancia acumulada a lo largo de la línea desde el primer vértice, pero podría ajustarse para dar resultados similares a la función postgis, que da una distancia normalizada a lo largo de la línea de 0.0 - 1.0

crédito a Gene por el código de iteración del segmento ici

2voto

kal-al Puntos 506

Esta no es una solución PyQGIS, pero hice algo similar hace un año usando el plugin "LRS" en QGIS. En mi situación, necesitaba la distancia a lo largo de un arroyo (feature class línea) a puntos de medición (mediciones GPS en feature class punto). El plugin permitía establecer una distancia dentro de la cual se suponía que los puntos intersecaban la línea, incluso si el GPS estaba ligeramente desviado.

Puede encontrar el plugin a través de QGIS buscando "LRS". Su página de inicio está aquí: http://blazek.github.io/lrs/ y tiene un enlace a documentación decente. Conseguí que funcionara después de varios intentos. Si no recuerdo mal, es necesario establecer la entrada en la ficha calbiration y la ubicación de salida en la ficha medidas antes de ejecutar. Parece que también tienen una pestaña de localización para las medidas individuales.

El plugin está escrito en Python, y puedes descargar su código en http://blazek.github.io/lrs/ para ver cómo lo hicieron, aunque la respuesta de @Steven Kay es más sencilla si tus puntos están directamente sobre la línea.

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