Rysowanie linii prostopadłych w PyQGIS?


33

Mam taką sytuację:

wprowadź opis zdjęcia tutaj

Muszę połączyć każdy punkt z każdą linią, która jest co najwyżej, powiedzmy 200 m, od tego punktu. Innymi słowy, muszę narysować linię prostopadłą z każdego punktu do każdej linii znajdującej się w buforze.

Czy istnieje sposób, aby to zrobić w PyQGIS?

Odpowiedzi:


40

Jest to problem geometrii analitycznej, a rozwiązanie zostało podane przez Paula Bourke'a w 1998 r. ( Minimalna odległość między punktem a linią ). Najkrótsza odległość od punktu do linii lub odcinka linii jest prostopadła od tego punktu do odcinka linii. Kilka wersji jego algorytmu zostało zaproponowanych w różnych językach, w tym w Pythonie, podobnie jak w Pomiarze odległości od punktu do segmentu linii w Pythonie. ale istnieje wiele innych (np. Najbliższy sąsiad między warstwą punktową a warstwą liniową za pomocą 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)

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

i wynik jest

wynik

Dostosowanie rozwiązania do problemu jest łatwe, wystarczy przejść przez wszystkie segmenty linii, wyodrębnić punkty końcowe segmentów i zastosować funkcję.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.