PyQGIS에서 수직선을 그리시겠습니까?


33

나는 이런 상황이있다 :

여기에 이미지 설명을 입력하십시오

내가해야 할 일은 각 지점을 최대 200m라고하는 모든 선에 연결하는 것입니다. 다시 말해, 각 점에서 버퍼에있는 모든 선까지 수직선을 그려야합니다.

PyQGIS에서 이것을 수행하는 방법이 있습니까?

답변:


40

이것은 분석 기하학의 문제이며 해결책은 1998 년 Paul Bourke ( 점과 선 사이의 최소 거리) 에 의해 주어졌습니다 . 점에서 선 또는 선분까지의 최단 거리는이 점에서 선분까지의 직각입니다. 그의 알고리즘의 여러 버전은 파이썬 에서 점에서 선분까지의 거리를 측정하는 것과 같이 파이썬을 포함한 다양한 언어로 제안되었습니다 . 그러나 많은 다른 것들이 있습니다 ( 점층과 모양 사이의 가장 가까운 이웃 과 같은 )

# 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 라인

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

결과는

결과

문제에 대한 솔루션을 쉽게 적용 할 수 있습니다. 모든 선 세그먼트를 반복하여 세그먼트 끝점을 추출하고 함수를 적용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.