วาดเส้นตั้งฉากใน PyQGIS?


33

ฉันมีสถานการณ์เช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งที่ฉันต้องทำคือการเชื่อมต่อแต่ละจุดกับทุกบรรทัดที่มากที่สุดสมมติว่า 200 เมตรห่างจากจุดนั้น กล่าวอีกนัยหนึ่งฉันต้องวาดเส้นตั้งฉากจากแต่ละจุดถึงทุกบรรทัดที่อยู่ในบัฟเฟอร์

มีวิธีการทำเช่นนี้ใน PyQGIS หรือไม่?

คำตอบ:


40

มันเป็นปัญหาของการวิเคราะห์รูปทรงเรขาคณิตและการแก้ปัญหาได้รับโดย Paul Bourke ในปี 1998 ( ระยะทางต่ำสุดระหว่าง Point และ Line ) ระยะทางที่สั้นที่สุดจากจุดหนึ่งไปยังอีกเส้นหนึ่งหรือส่วนของเส้นตรงนั้นเป็นเส้นตั้งฉากจากจุดนี้ไปยังส่วนของเส้น อัลกอริทึมของเขาหลายรุ่นได้รับการเสนอในภาษาต่างๆรวมถึง Python เช่นเดียวกับในการวัดระยะทางจากจุดหนึ่งไปยังเซกเมนต์บรรทัดใน Python แต่มีคนอื่นอีกหลายคน (เช่น เพื่อนบ้านที่ใกล้ที่สุดระหว่างเลเยอร์จุดและเลเยอร์บรรทัดที่มีหุ่นดี)

# 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.