Рисование перпендикулярных линий в 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.