Tracciare linee perpendicolari in PyQGIS?


33

Ho una situazione come questa:

inserisci qui la descrizione dell'immagine

Quello che devo fare è collegare ogni punto a ogni linea che è al massimo, diciamo 200 m, lontano dal punto. In altre parole, ho bisogno di tracciare una linea perpendicolare da ogni punto a ogni linea che si trova nel buffer.

C'è un modo per farlo in PyQGIS?

Risposte:


40

È un problema di geometria analitica e la soluzione è stata proposta da Paul Bourke nel 1998 ( distanza minima tra un punto e una linea ). La distanza più breve da un punto a un segmento o linea è la perpendicolare da questo punto al segmento di linea. Diverse versioni del suo algoritmo sono state proposte in vari linguaggi tra cui Python come in Misura della distanza da un punto a un segmento di linea in Python. ma ce ne sono molti altri (come il vicino più vicino tra un livello punto e un livello linea con 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)

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

e il risultato è

risultato

Adattare la soluzione al tuo problema è semplice, basta scorrere tutti i segmenti di linea, estrarre i punti finali dei segmenti e applicare la funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.