PyQGIS में लंबवत रेखाएँ खींचना?


33

मेरे पास इस तरह की स्थिति है:

यहाँ छवि विवरण दर्ज करें

मुझे जो करने की ज़रूरत है, वह प्रत्येक बिंदु को प्रत्येक पंक्ति से जोड़ने के लिए है जो कि अधिकतम है, चलो बिंदु से दूर 200 मीटर कहते हैं। दूसरे शब्दों में, मुझे प्रत्येक बिंदु से प्रत्येक रेखा तक एक लंब रेखा खींचना है जो बफर में है।

क्या PyQGIS में ऐसा करने का कोई तरीका है?

जवाबों:


40

यह विश्लेषणात्मक ज्यामिति की समस्या है और इसका समाधान पॉल बोर्के ने 1998 में दिया था ( न्यूनतम दूरी के बीच बिंदु और एक रेखा )। किसी बिंदु से रेखा या रेखा खंड की सबसे छोटी दूरी इस बिंदु से रेखा खंड तक लंबवत है। पायथन सहित विभिन्न भाषाओं में उनके एल्गोरिथ्म के कई संस्करण प्रस्तावित किए गए हैं, जैसे कि पाइथन में एक बिंदु से रेखा खंड की दूरी को मापना। लेकिन कई अन्य हैं (जैसे बिंदु परत के बीच का निकटतम पड़ोसी और शेपली के साथ एक पंक्ति परत )

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

पीटी लाइन

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

और परिणाम है

परिणाम

आपकी समस्या के समाधान को अपनाना आसान है, बस सभी लाइन खंडों के माध्यम से लूप लें, खंडों के अंत बिंदुओं को निकालते हुए और फ़ंक्शन को लागू करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.