¿Dibujando líneas perpendiculares en PyQGIS?


33

Tengo una situación como esta:

ingrese la descripción de la imagen aquí

Lo que necesito hacer es conectar cada punto a cada línea que esté a lo sumo, digamos 200 m, lejos del punto. En otras palabras, necesito dibujar una línea perpendicular desde cada punto a cada línea que está en el búfer.

¿Hay alguna manera de hacer esto en PyQGIS?

Respuestas:


40

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 desde un punto a una línea o segmento de línea es la perpendicular desde este punto al segmento de línea. Se han propuesto varias versiones de su algoritmo en varios idiomas, incluido Python, como en Medición de distancia desde un punto a un segmento de línea en Python. pero hay muchos otros (como el vecino más cercano entre una capa de puntos y una capa de línea 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

resultado

Adaptar la solución a su problema es fácil, simplemente recorra todos los segmentos de línea, extraiga los puntos finales de los segmentos y aplique la función.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.