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