Comment obtenir la latitude / longitude en degrés minute seconde (DMS) en utilisant la calculatrice de terrain QGIS?

9

J'ai trouvé l'expression suivante pour convertir 5.1234 en 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) || '"'

Voici le problème: pour certains points comme 5.1234, cela fonctionne. mais pour d'autres, ce n'est pas le cas. Je soupçonne que le problème est la conversion entière qui arrondit les chiffres décimaux au lieu de la tronquer.

Y a-t-il une autre option? Merci.

Obsidianz
la source
Je peux suggérer une solution de contournement. Pas optimal, mais si vous êtes bloqué en ce moment, vous pouvez faire votre travail. Faites un clic droit et enregistrez en tant que CSV. Ouvrez le CSV dans Excel ou Google Docs, entrez votre formule (qui devrait être plus propre et plus facile). Supprimez tous les champs sauf un identifiant unique et des chaînes DMS converties. Sauvegarde le. Faites un joint de table avec la couche existante et vous êtes prêt.
spatialoughtts
1
Soyez prudent avec les entrées négatives.
whuber
Il suffit d'ajouter à la réponse de spatialthought: arrondi vers le bas au degré le plus proche fonctionnera dans Excel en utilisant la fonction FLOOR ().
Micha

Réponses:

3

Je aime l'expression que vous avez mis ensemble - probablement pas de solution dans QGIS 1.8, mais dans QGIS 1.9-dev il y a une floor()fonction d' arrondi qui arrondit vers le bas . Pour 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) || '"'

Notez l'apostrophe échappée ( \').

Pour D ° M.MMM ':

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

Pour limiter le nombre de minutes décimales affichées, remplacez # dans l'expression ci-dessous par le nombre de chiffres:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'
Simbamangu
la source
Par curiosité, à quoi ressemblerait la formule pour les degrés, les minutes?
masse
Ajout d'un exemple; cela fonctionne dans QGIS 2.6 (et probablement n'importe quoi 2.0 et plus) mais il peut y avoir des fonctions de formatage plus élégantes disponibles maintenant.
Simbamangu
1
Un seul écueil: votre formule ne fonctionne que pour les valeurs positives d'abscisse et d'ordonnée. Les négatifs sont trop petits. Et je me demande comment distinguer 0,5 ° E et 0,5 ° W. le plancher (+/- 0,5) sera toujours 0, pas -0.
AndreJ
Aaargh. Les pièges des tests insuffisants ... et voici que je travaille également dans l'hémisphère sud (négatif). Mise à jour sous peu.
Simbamangu
1

L'opérateur modulo peut être utilisé pour faire de la troncature, mais l'expression résultante serait très moche. Il est plus joli d'utiliser la substitution de chaînes, mais malheureusement QGIS n'expose pas de strpos ou de fonctions similaires. Utilisez regexp_replace($x, '\\..*', '')pour obtenir la partie entière et regexp_replace($x, '^[0-9]*\\.', '')pour obtenir la partie décimale. Utilisez torealau lieu de tointpour les calculs avec la deuxième expression pour vous assurer qu'il n'y aura pas d'arrondi.

lynxlynxlynx
la source
2
N'avait pas de fonction strpos mais en a maintenant;) github.com/qgis/Quantum-GIS/commit/…
Nathan W
tsk tsk tsk, tellement de bruit d'espaces.
lynxlynxlynx
Oui, ignorez ce premier bit, c'était juste un peu de nettoyage sans rapport avec la nouvelle fonction.
Nathan W
Moche c'est ... va essayer de s'en sortir.
Obsidianz