33 votos

¿Cómo dibujar líneas perpendiculares en QGIS?

Tengo una situación como esta:

enter image description here

Lo que tengo que hacer es conectar cada punto con cada línea que esté como máximo, digamos a 200 m, del punto. En otras palabras, tengo que dibujar una línea perpendicular desde cada punto hasta cada línea que esté en el buffer.

¿Hay alguna manera de hacer esto en PyQGIS?

41voto

GreyCat Puntos 146

Es un problema de geometría analítica y la solución fue dada por Paul Bourke en 1998 ( Distancia mínima entre un punto y una línea ). La distancia más corta de un punto a una línea o segmento de línea es la perpendicular de este punto al segmento de línea. Se han propuesto varias versiones de su algoritmo en varios lenguajes, incluido Python, como en Medir la distancia de un punto a un segmento de línea en Python. pero hay muchos otros (como Vecino más cercano entre una capa de puntos y una capa de líneas con Shapely)

# basic example with PyQGIS
# the end points of the line
line_start = QgsPoint(50,50)
line_end = QgsPoint(100,150)
# the line
line = QgsGeometry.fromPolyline([line_start,line_end])
# the point
point = QgsPoint(30,120)

pt line

def intersect_point_to_line(point, line_start, line_end):
     ''' Calc minimum distance from a point and a line segment and intersection'''
      # sqrDist of the line (PyQGIS function = magnitude (length) of a line **2)
      magnitude2 = line_start.sqrDist(line_end) 
      # minimum distance
      u = ((point.x() - line_start.x()) * (line_end.x() - line_start.x()) + (point.y() - line_start.y()) * (line_end.y() - line_start.y()))/(magnitude2)
      # intersection point on the line
      ix = line_start.x() + u * (line_end.x() - line_start.x())
      iy = line_start.y() + u * (line_end.y() - line_start.y())
      return QgsPoint(ix,iy)

line = QgsGeometry.fromPolyline([point,intersect_point_to_line(point, line_start, line_end)])

y el resultado es

result

Adaptar la solución a su problema es fácil, sólo tiene que hacer un bucle a través de todos los segmentos de la línea, extrayendo los puntos finales de los segmentos y aplicar la función.

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