¿Cómo obtener la latitud / longitud en Grados Minutos Segundos (DMS) usando la calculadora de campo QGIS?

9

Se me ocurrió la siguiente expresión para convertir 5.1234 a 5 ° 7`24.24 "

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

Aquí está el problema: para algunos puntos, como 5.1234, funciona. pero para otros, no lo hace. Sospecho que el problema es la conversión de enteros que redondea las cifras decimales en lugar de truncarla.

¿Hay alguna otra opción? Gracias.

Obsidianz
fuente
Puedo sugerir una solución alternativa. No es óptimo, pero si está atrapado en este momento, puede hacer su trabajo. Haga clic derecho y Guardar como CSV. Abra el CSV en Excel o Google Docs, ingrese su fórmula (que debería ser más limpia y fácil). Elimine todos los campos excepto un identificador único y cadenas de DMS convertidas. Guárdalo Haga una unión de tabla con la capa existente y estará listo.
pensamientos espaciales
1
Tenga cuidado con las entradas negativas.
whuber
Sólo para añadir a la respuesta de spatialthought: redondeo hacia abajo al grado más próximo trabajará en Excel utilizando la función floor ().
Micha

Respuestas:

3

Me gusta la expresión que ha reunido: probablemente no haya solución en QGIS 1.8, pero en QGIS 1.9-dev hay una floor()función de redondeo que se redondea hacia 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 a continuación con el número de dígitos:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'
Simbamangu
fuente
Solo por curiosidad, ¿cómo se vería la fórmula para Grados, Minutos?
maza
Se agregó un ejemplo; esto funciona en QGIS 2.6 (y probablemente en cualquier versión 2.0 en adelante) pero puede haber funciones de formato más elegantes disponibles ahora.
Simbamangu
1
Solo una trampa: su fórmula solo funciona para valores positivos de Este y Norte. Los negativos son uno demasiado pequeño. Y me pregunto cómo se pueden distinguir 0.5 ° E y 0.5 ° W. floor (+/- 0.5) siempre será 0, no -0.
AndreJ
Aaargh Las trampas de las pruebas insuficientes ... y aquí estoy yo trabajando en el hemisferio sur (negativo) también. Actualizando en breve.
Simbamangu
1

El operador de módulo se puede usar para hacer 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 ningún strpos o funciones similares. Use regexp_replace($x, '\\..*', '')para obtener toda la parte y regexp_replace($x, '^[0-9]*\\.', '')para obtener la parte decimal. Use en toreallugar de tointpara cálculos con la segunda expresión para asegurarse de que no habrá redondeo.

lynxlynxlynx
fuente
2
No tenía una función strpos pero ahora sí;) github.com/qgis/Quantum-GIS/commit/…
Nathan W
tsk tsk tsk, mucho ruido de espacios en blanco.
lynxlynxlynx
Sí, ignore esa primera parte, solo fue un poco de limpieza no relacionada con la nueva función.
Nathan W
Es feo ... intentará resolverlo.
Obsidianz