Es ist ein Problem der analytischen Geometrie und die Lösung wurde 1998 von Paul Bourke gegeben ( Mindestabstand zwischen einem Punkt und einer Linie ). Die kürzeste Entfernung von einem Punkt zu einer Linie oder einem Liniensegment ist die Senkrechte von diesem Punkt zum Liniensegment. Mehrere Versionen seines Algorithmus wurden in verschiedenen Sprachen vorgeschlagen, einschließlich Python wie in Messen der Entfernung von einem Punkt zu einem Liniensegment in Python. aber es gibt viele andere (wie Nächster Nachbar zwischen einer Punktebene und einer Linienebene mit 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)])
und das Ergebnis ist
Das Anpassen der Lösung an Ihr Problem ist einfach. Durchlaufen Sie einfach alle Liniensegmente, extrahieren Sie die Segmentendpunkte und wenden Sie die Funktion an.