Te traemos el arreglo a esta incógnita, o por lo menos eso creemos. Si presentas interrogantes coméntalo y sin dudas
Solución:
function ConvertDDToDMS(D, lng)
const M=0
Lo anterior te da un objeto. deg:, min:, sec:, dir:
con sec truncado a dos dígitos (p. ej. 3.14
) y dir es uno de N
, E
, S
, W
dependiendo de si configura el lng
(longitud) parámetro a true. p.ej:
ConvertDDToDMS(-18.213, true) ==
deg : 18,
min : 12,
sec : 46.79,
dir : 'W'
O si solo quieres lo básico string:
function ConvertDDToDMS(D)
return [0
ConvertDDToDMS(-18.213) == `-18d 12' 46"`
[edit June 2019] — arreglando un error de hace 8 años que a veces causaba que el resultado tuviera un error de 1 minuto debido a las matemáticas de coma flotante al convertir un minuto exacto, por ejemplo ConvertDDToDMS(4 + 20/60)
. El código actualizado todavía tiene un pequeño problema, pero en este caso se redondeará a 19 minutos y 59,99 segundos, lo cual está bien y no se puede solucionar debido a la forma en que funcionan los puntos flotantes.
No está claro cómo necesita la salida. Aquí hay una versión que devuelve los 3 valores como un string:
function ConvertDDToDMS(dd)
var deg = dd
Actualización: elimino la parte que no tenía ningún sentido (gracias lobos!).
Aquí tienes otra implementación más. No será tan corto ni eficiente como los anteriores, pero espero que sea mucho más fácil de entender.
Para hacerlo bien, primero debe comprender cómo se realizan los cálculos y solo luego intentar implementarlos.. Para eso, el pseudocódigo es una excelente opción, ya que escribe los pasos en un lenguaje sencillo o en una sintaxis simplificada que es fácil de entender, y luego lo traduce al lenguaje de programación de su elección.
¡Espero que sea útil!
/* This is the pseudocode you need to follow:
* It's a modified version from
* http://en.wikipedia.org/wiki/Geographic_coordinate_conversion#Conversion_from_Decimal_Degree_to_DMS
function deg_to_dms ( degfloat )
Compute degrees, minutes and seconds:
deg ← integerpart ( degfloat )
minfloat ← 60 * ( degfloat - deg )
min ← integerpart ( minfloat )
secfloat ← 60 * ( minfloat - min )
Round seconds to desired accuracy:
secfloat ← round( secfloat, digits )
After rounding, the seconds might become 60. These two
if-tests are not necessary if no rounding is done.
if secfloat = 60
min ← min + 1
secfloat ← 0
end if
if min = 60
deg ← deg + 1
min ← 0
end if
Return output:
return ( deg, min, secfloat )
end function
*/
function deg_to_dms (deg)
var d = Math.floor (deg);
var minfloat = (deg-d)*60;
var m = Math.floor(minfloat);
var secfloat = (minfloat-m)*60;
var s = Math.round(secfloat);
// After rounding, the seconds might become 60. These two
// if-tests are not necessary if no rounding is done.
if (s==60)
m++;
s=0;
if (m==60)
d++;
m=0;
return ("" + d + ":" + m + ":" + s);