Zeichnen senkrechter Linien in PyQGIS?


33

Ich habe eine Situation wie diese:

Bildbeschreibung hier eingeben

Was ich tun muss, ist, jeden Punkt mit jeder Linie zu verbinden, die höchstens 200 m vom Punkt entfernt ist. Mit anderen Worten, ich muss von jedem Punkt zu jeder Linie, die sich im Puffer befindet, eine senkrechte Linie zeichnen.

Gibt es eine Möglichkeit, dies in PyQGIS zu tun?

Antworten:


40

Es ist ein Problem der analytischen Geometrie und die Lösung wurde 1998 von Paul Bourke gegeben ( Mindestabstand zwischen einem Punkt und einer Linie ). Die kürzeste Entfernung von einem Punkt zu einer Linie oder einem Liniensegment ist die Senkrechte von diesem Punkt zum Liniensegment. Mehrere Versionen seines Algorithmus wurden in verschiedenen Sprachen vorgeschlagen, einschließlich Python wie in Messen der Entfernung von einem Punkt zu einem Liniensegment in Python. aber es gibt viele andere (wie Nächster Nachbar zwischen einer Punktebene und einer Linienebene mit 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 line

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

und das Ergebnis ist

Ergebnis

Das Anpassen der Lösung an Ihr Problem ist einfach. Durchlaufen Sie einfach alle Liniensegmente, extrahieren Sie die Segmentendpunkte und wenden Sie die Funktion an.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.