¿Dibujando líneas perpendiculares en PyQGIS?

32

Tengo una situación como esta:

Lo que necesito hacer es conectar cada punto a cada línea que esté a lo sumo, digamos a 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?

    
pregunta PeterBorook 26.04.2013 - 01:14

1 respuesta

38

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 Medir la distancia de un punto a un segmento de línea en Python. pero hay muchos otros (como 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)

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

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

    
respondido por el gene 26.04.2013 - 10:42

Lea otras preguntas en las etiquetas