Menggambar garis tegak lurus di PyQGIS?


33

Saya memiliki situasi seperti ini:

masukkan deskripsi gambar di sini

Yang perlu saya lakukan adalah menghubungkan setiap titik ke setiap baris yang paling banyak, katakanlah 200 m, jauh dari titik. Dengan kata lain, saya perlu menggambar garis tegak lurus dari setiap titik ke setiap garis yang ada di buffer.

Apakah ada cara untuk melakukan ini di PyQGIS?

Jawaban:


40

Ini adalah masalah geometri analitik dan solusinya diberikan oleh Paul Bourke pada tahun 1998 ( Jarak Minimum antara Titik dan Garis ). Jarak terpendek dari titik ke garis atau segmen garis adalah tegak lurus dari titik ini ke segmen garis. Beberapa versi algoritmanya telah diajukan dalam berbagai bahasa termasuk Python seperti dalam Mengukur jarak dari titik ke segmen garis dalam Python. tetapi ada banyak lainnya (seperti tetangga terdekat antara layer titik dan layer garis dengan 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)

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

dan hasilnya

hasil

Mengadaptasi solusi untuk masalah Anda itu mudah, cukup lewati semua segmen garis, ekstrak titik akhir segmen dan terapkan fungsinya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.