10 votos

¿Cómo obtener la latitud/longitud en grados/minuto segundo (DMS) usando la calculadora de campo QGIS?

He ideado la siguiente expresión para convertir 5.1234 a 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) || '"'

Este es el problema: para algunos puntos como el 5.1234, funciona. pero para otros, no. Sospecho que el problema es la conversión de números enteros que redondean las cifras decimales en lugar de truncarlas.

¿Hay alguna otra opción? Gracias.

0 votos

Puedo sugerir una solución. No es óptima, pero si estás atascado en este momento, puedes hacer tu trabajo. Haga clic con el botón derecho y guarde como CSV. Abre el CSV en Excel o Google Docs, introduce tu fórmula (que debería ser más limpia y fácil). Elimine todos los campos excepto el identificador único y las cadenas DMS convertidas. Guárdelo. Haga una unión de tablas con la capa existente y estará listo.

2 votos

Ten cuidado con las entradas negativas.

0 votos

Sólo para añadir a la respuesta de spatialthought: el redondeo abajo al grado más cercano funcionará en Excel utilizando la función FLOOR().

5voto

BWW Puntos 302

Actualmente existe una función nativa to_dms() para esta intención incluida en la calculadora de expresiones.

Ahora, puedes simplemente ejecutar to_dms(5.1234, 'x', 2) . A continuación se puede ver una captura del documento actual

enter image description here

4voto

Me gusta la expresión que has puesto - probablemente no hay solución en QGIS 1.8, pero en QGIS 1.9-dev hay un floor() función de redondeo que redondea abajo . Para 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) || '"'

Tenga en cuenta el apóstrofe escapado ( \' ).

Para D°M.MMM':

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

Para limitar el número de minutos decimales mostrados, sustituya # en la expresión siguiente por el número de dígitos:

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

0 votos

Sólo por curiosidad, ¿cómo sería la fórmula para los grados y los minutos?

0 votos

Se ha añadido un ejemplo; esto funciona en QGIS 2.6 (y probablemente en cualquier otra versión 2.0 y superior) pero puede haber funciones de formato más elegantes disponibles ahora.

1 votos

Sólo un escollo: Tu fórmula sólo funciona para valores positivos de Este y Norte. Los negativos son demasiado pequeños. Y me pregunto cómo se pueden distinguir 0,5° E y 0,5° W. floor(+/-0,5) siempre será 0, no -0.

1voto

gregmac Puntos 12813

Se puede utilizar el operador módulo para hacer el truncamiento, pero la expresión resultante sería muy fea. Es más bonito usar la sustitución de cadenas, pero desafortunadamente QGIS no expone ninguna función strpos o similar. Utilice regexp_replace($x, '\\..*', '') para obtener toda la parte y regexp_replace($x, '^[0-9]*\\.', '') para obtener la parte decimal. Utilice toreal en lugar de toint para los cálculos con la segunda expresión para asegurarse de que no habrá redondeo.

2 votos

No tenía una función strpos pero ahora la tiene ;) github.com/qgis/Quantum-GIS/commit/

0 votos

Tsk tsk tsk, tanto ruido de espacio en blanco.

0 votos

Sí, ignora la primera parte, era sólo un poco de limpieza sin relación con la nueva función.

1voto

Chris Puntos 1769

He hecho algunos cambios en el código para obtener las coordenadas en DMS, si es necesario. Sólo se necesitan ajustes en la información EPSG.

Latitud

(CASE WHEN $y < 0 THEN '-' ELSE '' END) || floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) || '°' || floor(((abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) ||'\'' || substr( (tostring((((abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) - floor(((abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(Y( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60)) * 60),1,5) || '"'

Longitud

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) || '°' || floor(((abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) ||'\'' || substr( (tostring((((abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60) - floor(((abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
)) - floor (abs(X( transform( $geometry, 'EPSG:31983', 'EPSG:4326'))
))) * 60)) * 60),1,5) || '"'

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X