Özellik tablosuna Yön ve Mesafe nasıl eklenir?


18

yardım edebilecek herkes. Sadece çoklu hat / hat verilerindeki yeni alanım olarak yön (Rulman: yani N 25 35 E) ve Mesafe (Uzunluk: 125 metre) eklemek istiyorum. bu alanları oluşturmak için bir eklenti var mı? benim satır verileri "ihracat / geometri sütunları eklemek" kullanmaya çalıştı, ama sadece "Uzunluk" değeri eklendi.


Şimdiye kadar bana mesafe vermek için mmqgis eklentisini kullanabilirim. Yön sorununu araştırıyorum.
Willy

1
Çoklu hat verileriniz neye benziyor? Mesafenin hesaplanması nispeten kolaydır - ancak, bir çoklu çizginin uzunluğu boyunca 'yatak' değişebilir. Eğer gelen rulman arıyorsunuz başlangıç noktasına kadar son nokta ?
Simbamangu

Evet, başlangıç ​​noktasından bitiş noktasına kadar rulman arıyorum ... teşekkürler
arzandia

1
Başlangıç ​​noktasından bitiş noktasına düz çizgi mesafesi veya çizginin yolunu izleyen çizgi uzunluğu ister misiniz? Çizgi segmentinde ara eğriler veya başka yön değişiklikleri varsa bunlar büyük ölçüde değişebilir.
RyanKDalton-OffTheGridMaps

Yanıtlar:


42

QGIS'teki Alan Hesaplayıcıda yön hesaplamasını yapabilirsiniz. Bu, küçük mesafelerde (yüzlerce km) UTM (metrik) koordinatlarında çalışır, ancak büyük mesafeler veya ondalık dereceler için daha karmaşık bir şeye ihtiyaç duyulacaktır.

Satır katmanınız için nitelik tablosunu açın, düzenlemeyi açın ve iletişim kutusunu açmak için Alan Hesaplayıcı düğmesini tıklayın:

resim açıklamasını buraya girin

1 veya 2 hassasiyetle ondalık olarak yeni bir alan oluşturun.

Bu kodu "İfade" kutusuna yapıştırın ve "Tamam" ı tıklayın: (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)))

İlk bölüm x ve y farklılıklarının ters tanjantını hesaplar ve dereceye (180 / pi) dönüştürür. İkinci kısım, 0-360 ° arasında bir yatak vermek için elde edilen şekle 180 veya 360 ekler.


2
En zarif bir çözüm, teşekkürler. Bir çoklu çizginin her bir segmenti için rulmanı belirlemeniz gerekiyorsa, bunu çizgi şekil dosyasını 'Bölünmüş Özellik' eklentisiyle bölerek yapabilirsiniz. Ardından yeni (bölünmüş) şekil dosyasını yükleyin ve yukarıdaki prosedürü izleyin.
nhopton

1
@arzandia - xat () ve yat () işlevleri kullandığınız 1.7'de çalışmadığından QGIS 1.9 (beta yüklemeleri için ana sayfaya bakın) kullanmanız GEREKİR !
Simbamangu

Bahsettiğiniz fişi zaten kullandım. Gördüğünüz gibi, katmanın adı "bölünmüş" ...
arzandia

1
Kendi sorumu yanıtlamak için, "Evet, yat (0) / yat (-1) ve xat (0) / xat (-1) için alan değerleri ekleyebilirsiniz."
cbunn

1
Benim için çalışmak için senaryoda bazı değişiklikler yapmak zorunda kaldım: (atan ((xat (0) -xat (1)) / (yat (0) -yat (1)))) * 180 / 3.14159 + (180 * (((yat (0) -yat (1)) <0) + (((xat (0) -xat (1)) <0 AND (yat (0) - yat (1))> 0) * 2)))
oskarlin

21

Bir eklentiye ihtiyacınız yok. Her şey PyQGIS QgsPoint sınıfında

Bir QGIS point sınıfının içeriğini Python Konsolundaki Python yerleşik işlev dir () ile incelerseniz.

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

Sen orada görebilirsiniz azimut ve sqrDist fonksiyonları ve birkaç denemeden sonra:

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

Sorun resim açıklamasını buraya girin

Python konsolunda

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

şimdi xy çizginin tüm düğümlerini (noktalarını) içeriyor

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

Çizginin tüm düğüm noktalarını kullanarak:

1) azimut noktası i'den i + 1'e (+/- 180 °) (bir çizginin düğümleri)

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 noktası ile i + 1 noktası arasındaki öklid mesafesi

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
[...]

Daha sonra, bu değerleri öznitelik tablosuna eklemek çok zor değildir.

Bu tekniği matplotlib ve Script Runner eklentisi ile çizgileri (jeoloji) analiz etmek için kullanıyorum

resim açıklamasını buraya girin


5
+1 - Güzel çözüm!
Öğrenmelisiniz

Bu harika bir çözüm ve jeologlar için süper değerli .. ama aynı zamanda sooo karmaşık
Shawn

10

@Simbamangu tarafından sağlanan çözüm oldukça etkilidir, ancak tüm vakaları kapsamaz. Örneğin, formülü yatay bir yer değiştirmeyle uygulamak sonucu NULL yapar, bu nedenle bu formülü QGIS Alan Hesaplayıcısında kullanmanız gerekir

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.