Come ottenere latitudine / longitudine in DMS (Degree Minute Second) utilizzando il calcolatore di campo QGIS?


9

Ho trovato la seguente espressione per convertire 5.1234 in 5 ° 7`24.24 "

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

Ecco il problema: per alcuni punti come 5.1234, funziona. ma per altri no. Sospetto che il problema sia la conversione di numeri interi che arrotonda le cifre decimali invece di troncarla.

C'è qualche altra opzione? Grazie.


Posso suggerire una soluzione alternativa. Non ottimale, ma se sei bloccato in questo momento, puoi fare il tuo lavoro. Fare clic con il tasto destro e Salva come CSV. Apri CSV in Excel o Google Documenti, inserisci la tua formula (che dovrebbe essere più semplice e pulita). Elimina tutti i campi tranne un identificatore univoco e le stringhe DMS convertite. Salvarlo. Unisci tabella con il livello esistente e sei pronto.
pensieri spaziali

1
Fai attenzione agli input negativi.
whuber

Giusto per aggiungere alla risposta di spatialthought: arrotondamento verso il basso al grado più vicino lavorerà in Excel utilizzando la funzione di FLOOR ().
Micha,

Risposte:


3

Mi piace l'espressione che hai messo insieme - probabilmente nessuna soluzione in QGIS 1.8, ma in QGIS 1.9-dev c'è una floor()funzione di arrotondamento che arrotonda per difetto . Per 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) || '"'

Nota l'apostrofo con escape ( \').

Per D ° M.MMM ':

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

Per limitare il numero di minuti decimali visualizzati, sostituire # nell'espressione seguente con il numero di cifre:

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

Solo per curiosità, come sarebbe la formula per gradi, minuti?
mazza

Aggiunto un esempio; funziona con QGIS 2.6 (e probabilmente con qualsiasi versione 2.0 e successive) ma al momento potrebbero essere disponibili funzioni di formattazione più eleganti.
Simbamangu,

1
Solo una trappola: la tua formula funziona solo per valori positivi di Easting e Northing. I negativi sono troppo piccoli. E mi chiedo come si possano distinguere 0,5 ° E e 0,5 ° O. floor (+/- 0,5) sarà sempre 0, non -0.
AndreJ,

Aaargh. Le insidie ​​dei test insufficienti ... ed ecco che lavoro anche nell'emisfero meridionale (negativo). Aggiornamento a breve.
Simbamangu,

1

L'operatore modulo può essere utilizzato per eseguire il troncamento, ma l'espressione risultante sarebbe molto brutta. È più bello usare la sostituzione di stringhe, ma sfortunatamente QGIS non espone nessuna strpos o funzioni simili. Utilizzare regexp_replace($x, '\\..*', '')per ottenere l'intera parte e regexp_replace($x, '^[0-9]*\\.', '')per ottenere la parte decimale. Utilizzare torealinvece di tointper i calcoli con la seconda espressione per assicurarsi che non ci siano arrotondamenti.


2
Non aveva una funzione strpos ma adesso;) github.com/qgis/Quantum-GIS/commit/…
Nathan W

tsk tsk tsk, così tanto rumore da spazi bianchi.
lynxlynxlynx,

Sì, ignora quel primo bit, è stato solo un po 'di pulizia non correlato alla nuova funzione.
Nathan W,

Brutto che sia ... proverà a risolverlo.
Obsidianz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.