QGIS alan hesap makinesini kullanarak Derece Dakika Saniyede (DMS) enlem / boylam nasıl alınır?


9

5.1234 5 ° 7`24.24 "dönüştürmek için aşağıdaki ifade ile geldim

toint ($ x) || '°' || toint ((($ $) - toint ($ x)) * 60) || '' '|| substr ((tostring (((($ x) - toint ($ x)) * 60) - toint (((($ $) - toint ($ x)) * 60)) * 60), 1,5) || '"'

Sorun şu: 5.1234 gibi bazı noktalar için işe yarıyor. ama diğerleri için değil. Sorunun, ondalık sayıları yuvarlamak yerine yuvarlayan tamsayı dönüşümü olduğundan şüpheleniyorum.

Başka seçenek var mı? Teşekkürler.


Bir çözüm önerebilirim. Optimal değil, ancak şu anda sıkışıp kalırsanız, işinizi halledebilirsiniz. Sağ tıklayın ve CSV Olarak Kaydet. CSV'yi Excel'de veya Google Dokümanlar'da açın, formülünüzü girin (daha temiz ve daha kolay olmalıdır). Benzersiz bir tanımlayıcı ve dönüştürülmüş DMS dizeleri dışındaki tüm alanları silin. Kaydet. Varolan katmanla bir masa birleştirmesi yapın ve hazırsınız.
spatialthoughts

1
Negatif girdilere dikkat edin.
whuber

Sadece spatialthought cevabı eklemek için: yuvarlama aşağı () fonksiyonu KAT kullanarak Excel'de çalışacak yakın derecede.
Micha

Yanıtlar:


3

QGIS 1.8 muhtemelen hiçbir çözüm, ancak QGIS 1.9-dev bir var - Ben ifadesi gibi araya getirdik floor()yuvarlar yuvarlama fonksiyonu aşağı . D ° M '' için:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || floor(((abs($x)) - floor (abs($x))) * 60) ||'\'' || substr( (tostring((((abs($x)) - floor (abs($x))) * 60) - floor(((abs($x)) - floor (abs($x))) * 60)) * 60),1,5) || '"'

Kaçan kesme işaretini ( \') not edin .

D ° M.MMM 'için:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || ((abs($x) - floor(abs($x))) * 60) ||'\''

Görüntülenen ondalık dakika sayısını sınırlamak için, aşağıdaki ifadedeki # rakamını basamak sayısı ile değiştirin:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'

Sadece meraktan, formül Dereceler, Dakikalar için nasıl görünürdü?
topuz

Bir örnek eklendi; bu QGIS 2.6'da (ve muhtemelen 2.0 ve üstü herhangi bir şeyde) çalışır, ancak şimdi daha zarif biçimlendirme işlevleri olabilir.
Simbamangu

1
Sadece bir tuzak: Formülünüz yalnızca Easting ve Northing'in pozitif değerleri için çalışır. Negatif çok küçük. Ve merak ediyorum 0,5 ° E ve 0,5 ° W nasıl ayırt edilebilir. zemin (+/- 0,5) her zaman 0 olur, -0 değil.
AndreJ

Aaargh. Yetersiz testin tuzakları ... işte ben de güney (negatif) yarımkürede çalışıyorum. Kısa süre güncelleniyor.
Simbamangu

1

Modulo operatörü kısaltma yapmak için kullanılabilir, ancak ortaya çıkan ifade çok çirkin olacaktır. String ikamesi kullanmak daha iyidir, ancak maalesef QGIS herhangi bir strpos veya benzer fonksiyon ortaya çıkarmaz. regexp_replace($x, '\\..*', '')Tüm parçayı regexp_replace($x, '^[0-9]*\\.', '')almak ve ondalık kısmı almak için kullanın . Yuvarlama olmayacağından emin olmak için ikinci ifadeye sahip hesaplamalar torealyerine kullanın toint.


2
Bir strpos işlevi yoktu ama şimdi var;) github.com/qgis/Quantum-GIS/commit/…
Nathan W

tsk tsk tsk, çok fazla boşluk gürültüsü.
lynxlynxlynx

Evet, ilk fonksiyonun yeni fonksiyonla ilgisi olmayan bir parça temizlik olduğunu görmezden gel.
Nathan W

Çirkin ... çalışmayı deneyecek.
Obsidianz

1

Gerekirse, DMS'de koordinatları almak için kodda bazı değişiklikler yaptım. Yalnızca EPSG bilgilerinin ayarlanması gerekir.

Enlem

(CASE WHEN $y < 0 THEN '-' ELSE '' END) || floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) || '°' || floor(((abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) ||'\'' || substr( (tostring((((abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) - floor(((abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60)) * 60),1,5) || '"'

Boylam

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) || '°' || floor(((abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) ||'\'' || substr( (tostring((((abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) - floor(((abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60)) * 60),1,5) || '"'

0

Bu gönderi konuyla ilgiliydi, ancak bugünlerde ifade hesaplayıcısına dahil edilen bu amaç için yerel bir işlev var.

Şimdi, sadece koşabilirsiniz to_dms(5.1234, 'x', 2). Mevcut dokümanın yakalanması aşağıda görülebilir

resim açıklamasını buraya girin

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.