Jak uzyskać szerokość / długość geograficzną w stopniach sekundy (DMS) za pomocą kalkulatora pola QGIS?

9

Wymyśliłem następujące wyrażenie, aby przekonwertować 5.1234 na 5 ° 7`24.24 "

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

Oto problem: w przypadku niektórych punktów, takich jak 5.1234, działa. ale dla innych tak nie jest. Podejrzewam, że problemem jest konwersja liczb całkowitych, która zaokrągla liczby dziesiętne zamiast je obcinać.

Czy jest jakaś inna opcja? dzięki.

Obsidianz
źródło
Mogę zasugerować obejście. Nie optymalne, ale jeśli utkniesz w tej chwili, możesz wykonać swoją pracę. Kliknij prawym przyciskiem myszy i zapisz jako CSV. Otwórz plik CSV w programie Excel lub Dokumentach Google, wprowadź formułę (która powinna być czystsza i łatwiejsza). Usuń wszystkie pola oprócz unikalnego identyfikatora i przekonwertowanych ciągów DMS. Zapisz to. Wykonaj połączenie tabeli z istniejącą warstwą i gotowe.
przemyślenia przestrzenne
1
Uważaj na negatywne dane wejściowe.
whuber
Aby dodać do odpowiedzi na pytanie przestrzenne: zaokrąglanie w dół do najbliższego stopnia będzie działać w Excelu za pomocą funkcji FLOOR ().
Micha,

Odpowiedzi:

3

Podoba mi się wyrażenie, które razem stworzyłeś - prawdopodobnie nie ma rozwiązania w QGIS 1.8, ale w QGIS 1.9-dev jest floor()funkcja zaokrąglania, która zaokrągla w dół . Dla D ° M'S '':

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

Zwróć uwagę na apostrof ( \').

Dla D ° M.MMM ”:

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

Aby ograniczyć liczbę wyświetlanych minut po przecinku, zamień # w poniższym wyrażeniu na liczbę cyfr:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'
Simbamangu
źródło
Z ciekawości, jak wyglądałaby ta formuła dla stopni, minut?
mace
Dodano przykład; działa to w QGIS 2.6 (i prawdopodobnie w wersji 2.0 i nowszej), ale teraz mogą być dostępne bardziej eleganckie funkcje formatowania.
Simbamangu,
1
Tylko jedna pułapka: Twoja formuła działa tylko dla dodatnich wartości Easting i Northing. Negatywne są o jeden za małe. Zastanawiam się, jak można rozróżnić 0,5 ° E i 0,5 ° W. piętro (+/- 0,5) zawsze będzie wynosić 0, a nie -0.
AndreJ
Aaargh. Pułapki związane z niewystarczającymi testami ... a ja też pracuję na południowej (ujemnej) półkuli. Aktualizacja wkrótce.
Simbamangu
1

Operatora modulo można użyć do obcięcia, ale wynikowe wyrażenie byłoby bardzo brzydkie. Korzystniej jest stosować podstawianie ciągów, ale niestety QGIS nie ujawnia żadnych strpos ani podobnych funkcji. Użyj, regexp_replace($x, '\\..*', '')aby uzyskać całą część i regexp_replace($x, '^[0-9]*\\.', '')uzyskać część dziesiętną. Użyj torealzamiast tointdo obliczeń z drugim wyrażeniem, aby upewnić się, że nie będzie zaokrąglania.

lynxlynxlynx
źródło
2
Nie miał funkcji strpos, ale teraz;) github.com/qgis/Quantum-GIS/commit/…
Nathan W
tsk tsk tsk, tyle hałasu spacji.
lynxlynxlynx
Tak, zignoruj ​​ten pierwszy fragment, to było tylko trochę sprzątania niezwiązanego z nową funkcją.
Nathan W
Brzydkie to ... spróbuje to wypracować.
Obsidianz