Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save marcelitocs/da3e17b8f42f5712fa02371067826212 to your computer and use it in GitHub Desktop.
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
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;
}
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