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)
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
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.