Đó là một vấn đề của hình học phân tích và giải pháp đã được Paul Bourke đưa ra vào năm 1998 ( Khoảng cách tối thiểu giữa Điểm và Đường thẳng ). Khoảng cách ngắn nhất từ một điểm đến một đoạn hoặc một đoạn thẳng là vuông góc từ điểm này đến đoạn thẳng. Một số phiên bản thuật toán của ông đã được đề xuất bằng nhiều ngôn ngữ khác nhau, bao gồm cả Python như trong Đo khoảng cách từ một điểm đến một đoạn đường trong Python. nhưng có nhiều thứ khác (như Hàng xóm gần nhất giữa lớp điểm và lớp đường thẳng với 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)])
và kết quả là
Điều chỉnh giải pháp cho vấn đề của bạn rất dễ dàng, chỉ cần lặp qua tất cả các phân đoạn dòng, trích xuất các điểm cuối của phân khúc và áp dụng chức năng.