विशेषता तालिका में दिशा और दूरी कैसे जोड़ें?


18

जो भी मदद कर सकता है। मैं सिर्फ दिशा (असर: एन 25 25 ई) और दूरी (लंबाई: 125 मीटर) को पॉलीलाइन / लाइन डेटा में अपने नए क्षेत्र के रूप में जोड़ना चाहता हूं। क्या इन क्षेत्रों को उत्पन्न करने के लिए कोई प्लग-इन है? मैंने अपने लाइन डेटा में "निर्यात / ज्यामिति कॉलम जोड़ने" का उपयोग करने की कोशिश की, लेकिन केवल "लंबाई" मूल्य जोड़ा गया।


अभी तक मैं mmqgis प्लगइन का उपयोग करके मुझे दूरी दे सकता हूं। दिशा समस्या की खोज कर रहे हैं।
विली

1
आपका पॉलीलाइन डेटा कैसा दिखता है? दूरी की गणना करना अपेक्षाकृत आसान है - हालांकि, 'असर' एक पॉलीलाइन की लंबाई में बदल सकता है। क्या आप शुरू से अंत बिंदु तक असर की तलाश कर रहे हैं ?
सिंबांगु

हां, शुरू से अंत तक असर की तलाश में im ... धन्यवाद
arzandia

1
क्या आप स्टार्ट-अप से एंडपॉइंट तक सीधी लाइन की दूरी चाहते हैं, या लाइन के रास्ते के बाद लाइन की लंबाई? यदि लाइन खंड में मध्यवर्ती घटता या दिशा के अन्य परिवर्तन हैं, तो ये व्यापक रूप से भिन्न हो सकते हैं।
रयानKalton-OffTheGridMaps 15

जवाबों:


42

आप QGIS में फ़ील्ड कैलकुलेटर में असर की गणना कर सकते हैं। यह यूटीएम (मेट्रिक) में छोटी दूरी (सैकड़ों किमी) पर काम करता है, लेकिन बड़ी दूरी या दशमलव डिग्री के लिए कुछ अधिक परिष्कृत की आवश्यकता होगी।

अपनी पंक्ति परत के लिए विशेषता तालिका खोलें, संपादन टॉगल करें, और डायलॉग खोलने के लिए फ़ील्ड कैलकुलेटर बटन पर क्लिक करें:

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

1 या 2 परिशुद्धता के साथ दशमलव के रूप में एक नया क्षेत्र बनाएँ।

इस कोड को "अभिव्यक्ति" बॉक्स में पेस्ट करें, और "ओके" पर क्लिक करें: (atan((xat(-1)-xat(0))/(yat(-1)-yat(0)))) * 180/3.14159 + (180 *(((yat(-1)-yat(0)) < 0) + (((xat(-1)-xat(0)) < 0 AND (yat(-1) - yat(0)) >0)*2)))

पहला भाग एक्स और वाई अंतर के व्युत्क्रम स्पर्शरेखा की गणना करता है और इसे डिग्री (180 / pi) में परिवर्तित करता है। दूसरा भाग 0-360 ° से असर देने के लिए परिणामी आकृति में या तो 180 या 360 जोड़ता है।


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

1
@arzandia - ध्यान दें कि आप QGIS 1.9 (बीटा डाउनलोड के लिए होम पेज देखें) का उपयोग xat () और yat () फ़ंक्शंस 1.7 में काम नहीं करते हैं, जिसे आप उपयोग कर रहे हैं!
सिमबामुंग

मैंने पहले ही आपके द्वारा बताए गए प्लग का उपयोग किया है। जैसा कि आप छवि देख सकते हैं, परत का नाम "
स्प्लिटेड

1
मेरे अपने प्रश्न का उत्तर देने के लिए, "हां आप yat (0) / yat (-1) और xat (0) / xat (-1) के लिए फ़ील्ड मान सम्मिलित कर सकते हैं।"
cbunn

1
मेरे लिए मुझे इसे काम करने के लिए स्क्रिप्ट में कुछ बदलाव करने थे: (एटैन ((xat (0) -xat (1)) / (yat (0) -yat (1))) * 180 / 3.1415,000 + (१ (० * (((यत (०) -यात (१)) <०) + (((जत (०) -xat (१)) <० और (यत (०) - यत (१))> ०) * 2)))
oskarlin

21

आपको एक प्लगइन की आवश्यकता नहीं है। सब कुछ PyQGIS के वर्ग QgsPoint में है

यदि आप Python कंसोल में अंतर्निहित फ़ंक्शन dir () के साथ QGIS बिंदु वर्ग की सामग्री की जांच करते हैं।

dir(point])
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__'
, '__getitem__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__module__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', 
'__str__', '__subclasshook__', '__weakref__', 'azimuth', 
'multiply', 'set', 'setX', 'setY', 'sqrDist', 'sqrDistToSegment', 'toDegreesMinutesSeconds', 'toString', 'wellKnownText', 'x', 'y']

आप देखते हैं देख सकते हैं दिगंश और sqrDist कार्य करता है और कुछ प्रयास के बाद:

- xy[0].azimuth(xy[1]) or xy[1].azimuth(xy[0]) gives the azimuth direction between two points(in degrees, +/- 180°)
- xy[0].sqrDist(xy[1]) give the square distance between two points (in the unit of the project)

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

तो पायथन कंसोल में

def select_all(layer):
     layer.select([])
     layer.setSelectedFeatures([obj.id() for obj in layer])

myline = qgis.utils.iface.activeLayer()
select_all(myline)
for elem in myline.selectedFeatures():
      xy = elem.geometry().asPolyline()

अब xy में पंक्ति के सभी नोड्स (बिंदु) शामिल हैं

# first point
print "x=%2d y=%2d" % (xy[0].x(),xy[0].y())
x=112935 y=117784
# and others...

लाइन के सभी नोड बिंदुओं का उपयोग करना:

1) एज़िमथ पॉइंट आई टू पॉइंट आई + 1 (+/- 180 °) (एक लाइन के नोड्स)

for i in range(len(xy)-1):
     print "x=%2d y=%2d azim=%6.1f azim2=%6.1f" % (xy[i].x(), xy[i].y(), xy[i].azimuth(xy[i+1]), xy[i+1].azimuth(xy[i]))

x=112935 y=117784 azim= 168.4 azim2= -11.6
x=113032 y=117312 azim=-167.5 azim2=  12.5
x=112926 y=116835 azim= 177.3 azim2=  -2.7
x=112943 y=116472 azim= 145.1 azim2= -34.9
[...]

2) बिंदु i और बिंदु i + 1 के बीच यूक्लिडियन दूरी

for i in range(len(xy)-1):
     print "x=%2d y=%2d dist=%6.1f" % (xy[i].x(), xy[i].y(), xy[i].sqrDist(xy[i+1]))

x=112935 y=117784 dist=232533.9
x=113032 y=117311 dist=238243.6
x=112926 y=116835 dist=131839.8
x=112943 y=116472 dist=209268.1
[...]

के बाद, इन मानों को विशेषता तालिका में जोड़ना बहुत मुश्किल नहीं है।

मैं matplotlib और स्क्रिप्ट रनर प्लगइन के साथ वंशावली (भूविज्ञान) का विश्लेषण करने के लिए इस तकनीक का उपयोग करता हूं

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


5
+1 - अच्छा समाधान! अवश्य ... सीखें ... अजगर ...
सिमबामुंग

यह भूवैज्ञानिकों के लिए एक महान समाधान और सुपर मूल्यवान है .. लेकिन यह भी जटिल है
शॉन

10

@ सिंबांगु द्वारा प्रदान किया गया समाधान बहुत प्रभावी है लेकिन सभी मामलों को कवर नहीं करता है। उदाहरण के लिए, क्षैतिज विस्थापन के साथ सूत्र को लागू करने से परिणाम पूरा हो जाएगा, इसलिए आपको QIS के फ़ील्ड कैलकुलेटर में इस फॉर्मूले का उपयोग करना होगा

case
when yat(-1)-yat(0) < 0 or yat(-1)-yat(0) > 0 then 
(atan((xat(-1)-xat(0))/(yat(-1)-yat(0)))) * 180/3.14159 + 
(180 *
(((yat(-1)-yat(0)) < 0) + 
(((xat(-1)-xat(0)) < 0 AND (yat(-1) - yat(0)) >0)*2)
))
when ((yat(-1)-yat(0)) = 0 and (xat(-1) - xat(0)) >0) then 90
when ((yat(-1)-yat(0)) = 0 and (xat(-1) - xat(0)) <0) then 270
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.