Desenhando linhas perpendiculares no PyQGIS?


33

Eu tenho uma situação como esta:

insira a descrição da imagem aqui

O que eu preciso fazer é conectar cada ponto a cada linha que esteja no máximo, digamos 200 m, longe do ponto. Em outras palavras, preciso desenhar uma linha perpendicular de cada ponto a todas as linhas que estão no buffer.

Existe uma maneira de fazer isso no PyQGIS?

Respostas:


40

É um problema de geometria analítica e a solução foi dada por Paul Bourke em 1998 ( Distância Mínima entre o Ponto e uma Linha ). A distância mais curta de um ponto a uma linha ou segmento de linha é a perpendicular desse ponto ao segmento de linha. Várias versões de seu algoritmo foram propostas em várias linguagens, incluindo Python e Medindo a distância de um ponto a um segmento de linha no Python. mas existem muitos outros (como o vizinho mais próximo entre uma camada de ponto e uma camada de linha com 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)

linha 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 o resultado é

resultado

É fácil adaptar a solução ao seu problema, basta percorrer todos os segmentos de linha, extrair os pontos finais dos segmentos e aplicar a função.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.