Tracer des lignes perpendiculaires dans PyQGIS?

33

J'ai une situation comme celle-ci:

entrez la description de l'image ici

Ce que je dois faire est de relier chaque point à chaque ligne située au maximum, disons à 200 m du point. En d'autres termes, je dois tracer une ligne perpendiculaire de chaque point à chaque ligne qui se trouve dans la mémoire tampon.

Y at-il un moyen de faire cela dans PyQGIS?

PeterBorook
la source

Réponses:

40

C'est un problème de géométrie analytique et la solution a été donnée par Paul Bourke en 1998 ( Distance minimale entre un point et une ligne ). La distance la plus courte entre un point et une ligne ou un segment de ligne est la perpendiculaire entre ce point et le segment de ligne. Plusieurs versions de son algorithme ont été proposées dans différentes langues, notamment en Python, comme dans Mesure de la distance d'un point à un segment de droite en Python. mais il y en a beaucoup d'autres (comme le plus proche voisin entre une couche de points et une couche de lignes avec 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)

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

et le résultat est

résultat

Il est facile d’adapter la solution à votre problème. Il vous suffit de parcourir tous les segments de ligne, d’extraire les extrémités des segments et d’appliquer la fonction.

gène
la source