C'est un problème de géométrie analytique et la solution a été donnée par Paul Bourke en 1998 ( Distance minimale entre un point et une ligne ). La distance la plus courte entre un point et une ligne ou un segment de ligne est la perpendiculaire entre ce point et le segment de ligne. Plusieurs versions de son algorithme ont été proposées dans différentes langues, notamment en Python, comme dans Mesure de la distance d'un point à un segment de droite en Python. mais il y en a beaucoup d'autres (comme le plus proche voisin entre une couche de points et une couche de lignes avec 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)])
et le résultat est
Il est facile d’adapter la solution à votre problème. Il vous suffit de parcourir tous les segments de ligne, d’extraire les extrémités des segments et d’appliquer la fonction.