Wie erhalte ich mit dem QGIS-Feldrechner Breiten- / Längengrade in Grad Minute Sekunde (DMS)?

9

Ich habe mir den folgenden Ausdruck ausgedacht, um 5.1234 in 5 ° 7`24.24 umzuwandeln. "

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

Hier ist das Problem: Für einige Punkte wie 5.1234 funktioniert es. aber für andere nicht. Ich vermute, das Problem ist die Ganzzahlkonvertierung, die die Dezimalzahlen aufrundet, anstatt sie abzuschneiden.

Gibt es eine andere Option? Vielen Dank.

Obsidianz
quelle
Ich kann eine Problemumgehung vorschlagen. Nicht optimal, aber wenn Sie gerade nicht weiterkommen, können Sie Ihre Arbeit erledigen. Klicken Sie mit der rechten Maustaste und speichern Sie als CSV. Öffnen Sie die CSV in Excel oder Google Text & Tabellen, geben Sie Ihre Formel ein (die sauberer und einfacher sein sollte). Löschen Sie alle Felder mit Ausnahme eines eindeutigen Bezeichners und konvertierter DMS-Zeichenfolgen. Speichern Sie es. Wenn Sie eine Tabellenverknüpfung mit einer vorhandenen Ebene durchführen, sind Sie fertig.
räumliche Gedanken
1
Seien Sie vorsichtig mit negativen Eingängen.
whuber
Nur um zu spatialthought Antwort hinzu: Rundung nach unten auf den nächsten Grad wird in Excel arbeiten , um die FLOOR () -Funktion.
Micha

Antworten:

3

Ich mag den Ausdruck , den Sie haben zusammen - wahrscheinlich keine Lösung in QGIS 1.8, aber in QGIS 1.9-dev gibt es eine floor()Rundungsfunktion , die rundet unten . Für 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) || '"'

Beachten Sie das entkommene Apostroph ( \').

Für D ° M.MMM ':

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

Um die Anzahl der angezeigten Dezimalminuten zu begrenzen, ersetzen Sie # im folgenden Ausdruck durch die Anzahl der Ziffern:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'
Simbamangu
quelle
Wie würde die Formel aus Neugier für Grad, Minuten aussehen?
Streitkolben
Ein Beispiel hinzugefügt; Dies funktioniert in QGIS 2.6 (und wahrscheinlich in Version 2.0 und höher), es sind jedoch möglicherweise elegantere Formatierungsfunktionen verfügbar.
Simbamangu
1
Nur eine Falle: Ihre Formel funktioniert nur für positive Werte von Easting und Northing. Negativ sind eins zu klein. Und ich frage mich, wie 0,5 ° O und 0,5 ° W unterschieden werden können. Etage (+/- 0,5) ist immer 0, nicht -0.
AndreJ
Aaargh. Die Fallstricke unzureichender Tests ... und hier arbeite ich auch auf der südlichen (negativen) Hemisphäre. Aktualisierung in Kürze.
Simbamangu
1

Der Modulo-Operator kann zum Abschneiden verwendet werden, aber der resultierende Ausdruck wäre sehr hässlich. Es ist schöner, die Zeichenfolgensubstitution zu verwenden, aber leider macht QGIS keine Strpos oder ähnliche Funktionen verfügbar. Verwenden Sie regexp_replace($x, '\\..*', '')diese Option , um den gesamten Teil und regexp_replace($x, '^[0-9]*\\.', '')den Dezimalteil abzurufen. Verwenden Sie torealstatt tointfür Berechnungen mit dem zweiten Ausdruck, um sicherzustellen, dass keine Rundung erfolgt.

lynxlynxlynx
quelle
2
Hatte keine Strpos-Funktion, tut dies aber jetzt;) github.com/qgis/Quantum-GIS/commit/…
Nathan W
tsk tsk tsk, so viel Leerzeichenrauschen.
Lynxlynxlynx
Ja, ignoriere das erste bisschen, es war nur ein bisschen Aufräumen, das nichts mit der neuen Funktion zu tun hat.
Nathan W
Hässlich ist es ... werde versuchen, es herauszufinden.
Obsidianz