Vẽ các đường vuông góc trong PyQGIS?


33

Tôi có một tình huống như thế này:

nhập mô tả hình ảnh ở đây

Điều tôi cần làm là kết nối mỗi điểm với mỗi dòng nhiều nhất, giả sử cách điểm đó 200 m. Nói cách khác, tôi cần vẽ một đường vuông góc từ mỗi điểm đến mọi đường nằm trong bộ đệm.

Có cách nào để làm điều này trong PyQGIS không?

Câu trả lời:


40

Đó 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)

dòng pt

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à

kết quả

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.