Converter as coordenadas geográficas do Google Maps A partir das coordenadas DD, utilizadas para inserir marcadores no Google Maps API V3, podemos com facilidade converter essas coordenadas no formato DMS.

Converter as coordenadas geográficas do Google Maps

por sábado, 26 de abril de 2014
Coordenadas Google Maps

As coordenadas geográficas utilizadas pelo Google Maps são designadas de Coordenadas DD (Decimal Degrees). Ou seja, estas coordenadas estão no formato Graus Decimais (e.g. Lat 40.601203, Lng -8.668173). Outro formato de representação das coordenadas geográficas, bastante comum entre os utilizadores de GPS, é o formato DMS (Degrees, Minutes, Seconds, e.g N 40° 36' 4.3", W 8° 40' 5.4").
A partir das coordenadas DD, utilizadas para inserir marcadores no mapa, podes com facilidade converter essas coordenadas no formato DMS. Com certeza que esta informação será bastante útil para os visitantes dos teus mapas.

Poderás também estar interessado em:
Conversor de coordenadas geográficas

O sistema de coordenadas geográficas

Convém antes de mais referir que ambos os sistemas dividem o globo em 360 graus, a diferença está no fraccionamento do grau. A latitude é compreendida entre o valor 0 no equador até 90 graus nos pólos. A longitude é compreendida entre o valor 0 no meridiano de GreenWich até 180 graus na parte oposta do globo.

Assim, temos os seguintes valores:

  • O valor de latitude superior a 0 (0 a 90) é referente ao Norte (N) e inferior a 0 (0 a -90) é referente ao Sul (S).
  • O valor de longitude superior a 0 (0 a 180) é referente a Este (E) e inferior a 0 (0 a -180) é referente a Oeste (O ou W).

Por exemplo, se determinado ponto tiver as coordenadas Lat 40.601203, Lng -8.668173 isto quer dizer que o ponto situa-se na latitude Norte e longitude Oeste.

Antes de iniciar o tutorial vê uma demonstração do mapa ou faz o download do código necessário para seguir este exemplo.

DEMO DOWNLOAD

Iniciar a conversão das coordenadas

Antes de mais vou mostrar-te o código que verifica se um determinado ponto fica a Norte, Sul, Este ou Oeste.

JavaScript /map.jsmarnoto.com
function ddToDms(lat, lng) {

   var lat = lat;
   var lng = lng;
   var latResult, lngResult;

   // Certificar que estás a trabalhar com números.
   // Isto é importante para o caso de obteres os valores
   // com origem em inputs de texto no html.
   lat = parseFloat(lat);  
   lng = parseFloat(lng);

   // Verificar a correspondência das coordenadas para a latitude: Norte ou Sul.
   if (lat >= 0) {
     latResult = 'N';
   } else {
     latResult = 'S';
   }

   // O exemplo anterior pode ser substituído pelo seguinte exemplo,
   // por forma a reduzir a quantidade de código.
   latResult = (lat >= 0)? 'N' : 'S';

   // Verificar a correspôndência das coordenadas para a longitude: Este ou Oeste.
   if (lng >= 0) {
     lngResult = 'E';
   } else {
     lngResult = 'W';
   }

   // O exemplo anterior pode ser substituído pelo seguinte exemplo
   // por forma a reduzir a quantidade de código.
   lngResult = (lng >= 0)? 'E' : 'W';
}

Coordenadas no formato DMS

O formato DMS utiliza a medida do ângulo para determinar a posição dos objectos no globo.
A unidade de medida do ângulo é o grau e existem 360 graus num círculo completo. (Símbolo do grau é º)
Cada grau é dividido em 60 minutos. (Símbolo do minuto é ') 1º = 60'
Cada minuto é dividido em 60 segundos. (Símbolo do segundo é ") 1' = 60"
Assim, em 1 grau existem 60 * 60 segundos, ou 3600 segundos.

A conversão das coordenadas DD em DMS

O passo seguinte é a conversão efectiva das coordenadas para o formato DMS.
Uma pequena introdução à equivalência entre os dois formatos para que a compreensão do código seja facilitada.
Tendo em conta os seguintes valores em DD Lat 40.601203.

  1. Antes de mais lembrar que se o valor de latitude é positivo, isso quer dizer que o objecto está no hemisfério Norte.
  2. O valor inteiro do formato DD equivale ao valor dos graus no formato DMS. Ou seja, o valor 40 em DD é equivalente ao valor 40º em DMS.
    Assim tens: DMS Lat N 40º.
  3. A parte decimal no formato DD é multiplicada por 60 e o valor inteiro daí resultante converte-se nos minutos no formato DMS. Ou seja, retirando 40 ao valor 40.601203 ficas com 0.601203. Então multiplicas 0.601203 * 60 = 36.07218 assim o valor dos minutos é 36'.
    Agora já tens: DMS Lat 40º 36'
  4. Agora utilizas a parte decimal resultante da multiplicação de 0.601203 * 60 = 36.07218 e multiplicas por 60. Ou seja, a 36.07218 retiras o 36 e multiplicas 0.07218 * 60 = 4.3308. Reduzindo este valor a duas casas decimais ficas com 4.33.
    Assim ficas com: DMS Lat 40º 36' 4.33"

    DD 40.601203 = DMS N 40º 36' 4.33"

Agora já podes ver o código JavaScript a utilizar para fazer a conversão automática para todos os marcadores existentes no teu projecto.

JavaScript /map.jsmarnoto.com
// Função que converte DD para DMS.
// Tendo como exemplo o valor -40.601203.
function getDms(val) {

   // Variáveis necessárias à conversão
   var valDeg, valMin, valSec, result;

   // Aqui convertes o valor recebido no parâmetro para um valor absoluto.
   // Ou seja, convertes o valor negativo para positivo.
   // Neste passo não interessa se é Norte, Sul, Este ou Oeste,
   // essa verificação foi efetuada anteriormente.
   val = Math.abs(val); // -40.601203 = 40.601203

   // ---- Graus ----
   // Retirar o valor inteiro de DD para obter o valor Degrees em DMS
   valDeg = Math.floor(val); // 40.601203 = 40

   // Adicionar o valor graus ao resultado, adicionando o símbolo graus 'º'.
   result = valDeg + "º"; // 40º

   // ---- Minutos ----
   // Retirar ao valor inicial o valor Degrees para ficar só com
   // a parte decimal.
   // Multiplicar a parte decimal por 60.
   // Math.floor devolve somente o valor inteiro.
   // ((40.601203 - 40 = 0.601203) * 60 = 36.07218) = 36
   valMin = Math.floor((val - valDeg) * 60); // 36.07218 = 36

   // Adicionar o valor minutos ao resultado, adicionando o símbolo minutos '''.
   result += valMin + "'"; // 40º36'

   // ---- Segundos ----
   // Para obter o valor em segundos é necessário:
   // 1º - retirar o valor em graus ao valor inicial: 40 - 40.601203 = 0.601203;
   // 2º - converter o valor minutos (36') em decimal ( valMin/60 = 0.6) para
   // de seguida o subtrair ao valor anterior: 0.601203 - 0.6 = 0.001203;
   // 3º - agora que já tens o valor dos segundos em decimal,
   // precisas de o converter em segundos de grau.
   // Para isso multiplicas esse valor (0.001203) por 3600, que é
   // o número de segundos existente num grau.
   // Obtens 0.001203 * 3600 = 4.3308
   // Como estás a utilizar a função Math.round(),
   // que arredonda o valor à unidade seguinte,
   // podes controlar o número de casas decimais através da
   // multiplicação por 1000 antes de Math.round
   // e consequente divisão por 1000 após a função Math.round.
   // Obtens 4.3308 * 1000 = 4330.8 -> Math.round = 4331 -> 4331 / 1000 = 4.331
   // Neste caso o valor final terá 3 casas decimais.
   // Se quiseres somente duas casas decimais basta
   // substituir o valor 1000 por 100.
   valSec = Math.round((val - valDeg - valMin / 60) * 3600 * 1000) / 1000; // 40.601203 = 4.331 

   // Adicionar o valor segundos ao resultado,
   // adicionando o símbolo segundos '"'.
   result += valSec + '"'; // 40º36'4.331"

   // Devolve a string resultante.
   return result;
 }

O código final

Com uma pequena alteração no código da função ddTomDms() consegues converter de forma automática as coordenadas DD para DMS.
O seguinte código mostra como utilizar as duas funções em conjunto, neste código só serão comentadas as alterações.

JavaScript /map.jsmarnoto.com
// Função que constrói a string de conversão
// de coordenadas em DD para DMS.
function ddToDms(lat, lng) {

   var lat = lat;
   var lng = lng;
   var latResult, lngResult, dmsResult;

   lat = parseFloat(lat);  
   lng = parseFloat(lng);

   latResult = (lat >= 0)? 'N' : 'S';

   // Chamada à função getDms(lat) para as coordenadas da Latitude em DMS.
   // O resultado será adicionado à variável latResult.
   latResult += getDms(lat);

   lngResult = (lng >= 0)? 'E' : 'W';

   // Chamada à função getDms(lng) para as coordenadas da Longitude em DMS.
   // O resultado será adicionado à variável lngResult.
   lngResult += getDms(lng);

   // Agora é só juntar as duas variáveis e separá-las com um espaço.
   dmsResult = latResult + ' ' + lngResult;

   // Devolvendo a string
   return dmsResult;
}

function getDms(val) {

  var valDeg, valMin, valSec, result;

  val = Math.abs(val);

  valDeg = Math.floor(val);
  result = valDeg + "º";

  valMin = Math.floor((val - valDeg) * 60);
  result += valMin + "'";

  valSec = Math.round((val - valDeg - valMin / 60) * 3600 * 1000) / 1000;
  result += valSec + '"';

  return result;
}

O código completo está disponível no link abaixo. Nesse código é feita uma chamada à função ddToDms() da seguinte forma:

JavaScript /map.jsmarnoto.com
var dmsCoords = ddToDms(latlng.lat(), latlng.lng());

A variável dmsCoords será incluída na construção da InfoWindow. Ou poderá ser incluída em qualquer outro local, não esquecendo que os valores a passar nos parâmetros terão de ser primeiro a latitude e depois a longitude -> ddToDms(lat, lng).

Ver exemplo do mapa Os estádios do Mundial de 2014 no Brasil

Este exemplo mostra a localização dos estádios onde vão decorrer os jogos do Mundial de Futebol do Brasil 2014. Ao fazer click nos marcadores abre uma Info Window com o nome e localização do Estádio, um link para a respectiva página da FIFA e ainda as coordenadas GPS no formato DMS.

Para mais informações acerca da criação de mapas com vários marcadores, por favor consulte o seguinte artigo:

Todas as dúvidas ou comentários são bem-vindos. Por favor, utilize a secção de comentários para que todos partilhem da informação.

Download dos ficheiros necessários para este exemplo

Miguel Marnoto

A minha especialização no Google Maps e na sua API JavaScript v3 é uma consequência do gosto pelos mapas e o reconhecimento da importância que o serviço Google Maps tem hoje no dia-a-dia das pessoas.

4 comentários para ''Converter as coordenadas geográficas do Google Maps"

COMENTAR
  1. Meus parabens. o seu link acredito ser o único explicando detalhadamente a conversão decimal para DMS. Ainda por cima, disponibilizando o código. Não olhei ele ainda pois queria te parabenizar. A proposito, enfrento um dilema.

    ResponderEliminar
  2. Complementando o dilema, não tenho a mesma motivação que você para sair distribuindo soluções por ai sabendo que não há garantia de um retorno, uma troca por assim dizer para quem se beneficia. O que te motiva...

    ResponderEliminar
    Respostas
    1. Obrigado. Quanto ao teu dilema... eu aprendi tanto com o trabalho de outros de forma gratuita que me sinto na obrigação de devolver algo também.

      Eliminar
    2. Conhecimento é poder; formar conhecedores e sabedoria. Parabéns Miguel Marnoto, pessoas assim motiva boas ações!

      Eliminar