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.


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, #) ||'\'

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.