-
-
Save marcelitocs/da3e17b8f42f5712fa02371067826212 to your computer and use it in GitHub Desktop.
Convert float coordinates to DMS (degree, minutes, seconds). Ex.: convert_coord_to_dms(e.g. 21.305728, -157.859647) -> 21° 18' 20.6208" N, 157° 51' 34.7292" E
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function convert_coord_to_dms (lat, lon) { | |
/* | |
Se Lat é positivo é Norte, senão Sul | |
Se Long é positivo é Leste, senão Oeste | |
*/ | |
var lat_orientation = lat < 0 ? "S" : "N", | |
lon_orientation = lat < 0 ? "W" : "E"; | |
function get_dms(decimal) { | |
var result = {}; | |
// Torna o número positivo pois o sinal só é usado para verificar o quadrante onde as coordenadas estão | |
decimal = Math.abs(decimal); | |
/* | |
decimal % 1 | |
pega apenas a parte decimal do número. | |
Ex.: 12.34 % 1 == 0.34 | |
decimal * 60 | |
como decimal % 1 retorna um número entre 0 e 1 (exclusive) podemos usá-lo como porcentagem | |
0 == 0%, 0.5 = 50%, etc... | |
Dessa maneira bastante aplicar a porcentagem ao número 60, pois é a quantidade máxima de minutos que um degree pode ter | |
Ex.: 0.5 * 50 == 30 degrees | |
*/ | |
result.degrees = decimal; | |
result.minutes = decimal % 1 * 60; | |
result.seconds = result.minutes % 1 * 60; | |
/* | |
Após os cálculos terem sido feitos podemos descartar a parte decimal dos resultados. | |
O resultado é sempre mostrado com duas casas. No código abaixo, se algum dos valores for 0 o código acaba virando '00' | |
Math.trunc pega apenas a parte inteira de um número. Ex.: Math.trunc(-12.34) == -12 | |
Number.toFixed é usado para arrendondar seconds. 4 é um valor arbitrário, use o que melhor te servir | |
*/ | |
result = { | |
degrees: Math.trunc(result.degrees) || '00', | |
minutes: Math.trunc(result.minutes) || '00', | |
seconds: result.seconds.toFixed(4) || '00' | |
} | |
// Concatena os resultados com seus respectivos símbolos | |
return result.degrees + "° " + result.minutes + "' " +result.seconds + '" '; | |
} | |
// Concatena os resultados suas orientações | |
return get_dms(lat) + lat_orientation + ', ' + get_dms(lon) + lon_orientation; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function convert_dms_to_coord (lat, lon) { | |
function get_coord(deg, min, sec) { | |
// https://en.wikipedia.org/wiki/Decimal_degrees#Example | |
return (deg + (min / 60) + (sec / 3600)).toFixed(6) | |
} | |
lat = lat.split(/[^\d\.NS]+/g); | |
lon = lon.split(/[^\d\.WE]+/g); | |
coord_lat = get_coord(parseInt(lat[0], 10), parseInt(lat[1], 10), parseFloat(lat[2])); | |
coord_lon = get_coord(parseInt(lon[0], 10), parseInt(lon[1], 10), parseFloat(lon[2])); | |
if (lat[3] == "S") { | |
coord_lat = "-" + coord_lat; | |
} | |
if (lon[3] == "W") { | |
coord_lon = "-" + coord_lon; | |
} | |
return [coord_lat, coord_lon]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment