Малювання перпендикулярних ліній в PyQGIS?


33

У мене така ситуація:

введіть тут опис зображення

Що мені потрібно зробити, це підключити кожну точку до кожної прямої, скажімо, 200 м від точки. Іншими словами, мені потрібно провести перпендикулярну лінію від кожної точки до кожної лінії, яка знаходиться в буфері.

Чи є спосіб це зробити в PyQGIS?

Відповіді:


40

Це проблема аналітичної геометрії, і рішення було дано Полом Бурком у 1998 р. ( Мінімальна відстань між точками та лінією ). Найкоротша відстань від точки до лінії або відрізка лінії - перпендикуляр від цієї точки до відрізка лінії. Запропоновано кілька версій його алгоритму на різних мовах, включаючи Python, як у вимірюванні відстані від точки до лінійного сегмента в Python. але є багато інших (наприклад, Найближчий сусід між точковим шаром та шаром лінії з 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)

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

і результат є

результат

Адаптувати рішення вашої проблеми досить просто, просто переведіть усі сегменти рядка, витягуючи кінцеві точки сегментів і застосуйте функцію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.