O novo Google Maps é muito mais apelativo aos nossos olhos mas muitas utilidades ficaram na gaveta. Aos poucos a Google vai implementando algumas das ferramentas mais úteis da anterior versão. Mas a facilidade com que se encontravam as coordenadas de um local no formato graus decimais (DDD: 40.604036, -8.665247) ainda não foi implementada no novo Google Maps.
À data da publicação deste artigo a única forma de encontrar essas coordenadas é através do URL.
Ao fazer click no mapa surge uma caixa no canto superior esquerdo que mostra as coordenadas de GPS. Com um click nessas coordenadas o URL da página é alterado e no final do URL encontramos as coordenadas DDD.
No seguinte URL mostro o endereço completo de uma localização após o click nas coordenadas de GPS. No final do URL aparacem as respectivas coordenadas em graus decimais.
https://www.google.com/maps/preview#!q=40%C2%B0+38.396'%2C+-8%C2%B0+36.570'&data=!4m14!2m13!1m12!3m8!1m3!1d10723!2d-8.6007929!3d40.6367078!3m2!1i1366!2i680!4f13.1!4m2!3d40.6399333!4d-8.6095
Com a API do Google Maps podemos facilmente criar o nosso próprio sistema de pesquisa de coordenadas no formato graus decimais.
Antes da explicação do código vejamos uma demonstração do sistema em funcionamento.
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 DOWNLOADActualização (3 de Abril de 2014)
No final de Fevereiro passado, a equipa do Google Maps trouxe de volta a possibilidade de clicar com o botão direito no mapa e solicitar mais informações sobre o local seleccionado. Assim, é novamente possível obter as direcções para ou a partir do local, bem como visualizar a latitude e longitude.
Implementação do sistema de detecção de coordenadas
O código JavaScript necessário para implementar um sistema de detecção de coordenadas é muito simples. Antes de mais é necessário fazer uso do evento que detecta um click no mapa e inserir um marcador no mapa. Ao mesmo tempo passamos os valores de latitude e longitude para as respectivas caixas de texto existentes no topo da página.
O seguinte código demonstra como iniciar o mapa e a detecção do click no mapa. Os comentários inseridos no código devem ser suficientes para perceber o seu funcionamento.
// Váriáveis necessárias
var map;
var marker;
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(40.601203,-8.668173),
zoom: 9,
mapTypeId: 'roadmap'
};
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
// Evento que detecta o click no mapa para criar o marcador
google.maps.event.addListener(map, "click", function(event) {
// O evento "click" retorna a posição do click no mapa,
// através dos métodos latLng.lat() e latLng.lng().
// Passamos as respectivas coordenadas para as variáveis lat e lng
// para posterior referência.
// Utilizamos o método toFixed(6) para limitar o número de casas decimais.
// A API ignora os valores além da 6ª casa decimal
var lat = event.latLng.lat().toFixed(6);
var lng = event.latLng.lng().toFixed(6);
// A criação do marcador é feita na função createMarker() e
// passamos os valores das coordenadas do click através
// dos parâmetros lat e lng.
createMarker(lat, lng);
// getCoords() actualiza os valores de Latitue e Longitude
// das caixas de texto existentes no topo da página
getCoords(lat, lng);
});
}
google.maps.event.addDomListener(window, 'load', initialize);
Agora vejamos o código para a criação do marcador no mapa, com a adição do evento que detecta o arrastar do marcador para um posicionamento no mapa com maior precisão.
// Função que cria o marcador
function createMarker(lat, lng) {
// A intenção é criar um único marcador, por isso
// verificamos se já existe um marcador no mapa.
// Assim cada vez que é feito um click no mapa
// o anterior marcador é removido e é criado outro novo.
// Se a variável marker contém algum valor
if (marker) {
// remover esse marcador do mapa
marker.setMap(null);
// remover qualquer valor da variável marker
marker = "";
}
// definir a variável marker com os novos valores
marker = new google.maps.Marker({
// Define a posição do marcador através dos valores lat e lng
// que foram definidos através do click no mapa
position: new google.maps.LatLng(lat, lng),
// Esta opção permite que o marcador possa ser arrastado
// para um posicionamento com maior precisão.
draggable: true,
map: map
});
// Evento que detecta o arrastar do marcador para
// redefinir as coordenadas lat e lng e
// actualiza os valores das caixas de texto no topo da página
google.maps.event.addListener(marker, 'dragend', function() {
// Actualiza as coordenadas de posição do marcador no mapa
marker.position = marker.getPosition();
// Redefine as variáveis lat e lng para actualizar
// os valores das caixas de texto no topo
var lat = marker.position.lat().toFixed(6);
var lng = marker.position.lng().toFixed(6);
// Chamada da função que actualiza os valores das caixas de texto
getCoords(lat, lng);
});
}
A actualização dos valores de latitude e longitude das caixas de texto é feita da seguinte forma.
// Função que actualiza as caixas de texto no topo da página
function getCoords(lat, lng) {
// Referência ao elemento HTML (input) com o id 'lat'
var coords_lat = document.getElementById('lat');
// Actualiza o valor do input 'lat'
coords_lat.value = lat;
// Referência ao elemento HTML (input) com o id 'lng'
var coords_lng = document.getElementById('lng');
// Actualiza o valor do input 'lng'
coords_lng.value = lng;
}
A utilidade deste pequeno sistema de detecção de coordenadas do Google Maps é limitada. No entanto, os métodos utilizados podem ser adaptados em sistemas mais complexos e permitirem uma interacção bastante interessante com a API.
Todas as dúvidas ou comentários são bem-vindos. Por favor, utilizar a secção de comentários para que todos partilhem da informação.

Miguel, estou montando uma aplicação, e preciso de algo do tipo; ao clicar em um marcador no mapa, os valores das coordenadas possa ser guardado em uma variável. assim quando ao clicar em um segundo marcador, ele cria a rota entre os dois marcadores selecionados. talvez guardando em um vetor os valores. Grato
ResponderEliminarOlá Gabriel, podes começar por criar uma variável global do tipo array, por exemplo var pontos = []; e seguindo o exemplo deste artigo só necessitas de obter o valor dos marcadores e passar esses valores para a variável - pontos[0] = ... e pontos[1] = ...
Eliminarisso compreendi. Estou tentando usar a função indicada por ti.
Eliminargoogle.maps.event.addListener(marker, 'click', function(event) {
var latitude = event.latLng.lat().toFixed(6);
var longitude = event.latLng.lng().toFixed(6);
teste[0] = new google.maps.LatLng(latitude, longitude);
});
porém não está guardando a latitude e longitude. quando dou um alert, aparece em branco as duas
Miguel pra gerar uma URL nesse formato => https://maps.google.co.in/?ie=UTF8&ll=25.705888,76.871338&spn=1.217564,3.348083
ResponderEliminarsabe onde eu posso conseguir ? é para eu usar em um tema que, aparentemente só aceita assim pra exibir o mapa.
Grato,
Alan.
Olá Alan, esse formato de URL está algo desactualizado com a versão do Google Maps actual. Se reparares o google maps reformata esse URL. Assim, não dá para obter um URL nesse formato de forma directa. Eu estive a fazer uns testes e tu podes adaptar esse URL às tuas necessidades com algum trabalho da tua parte.
EliminarRepara no parametro ll=25.705888,76.871338 isto é a latitude e longitude do lugar. Tu podes alterar estes valores de acordo com as tuas necessidades.
O parametro spn=1.217564,3.348083 é uma latitude e longitude aproximada da área a mostrar. Ou seja, estes valores definem o nível do zoom. Se quiseres um nível de zoom mais elevado deves alterar aqueles valores para ficarem entre 1 e 0. Por exemplo este url: https://maps.google.co.in/?ie=UTF8&ll=25.705888,76.871338&spn=0.217564,0.348083 vai dar-te o mesmo lugar mas com nível de zoom mais alto. Repara que alterei somente o valor das unidades para zero.
Espero ter ajudado.
Olá Miguel!
ResponderEliminarPrimeiramente quero te parabenizar pelo post, eu gostaria de saber o seguinte, eu preciso pegar o endereço quando eu arrasto o marcador, como posso fazer isso?
Parabéns me ajudou muito, ótimo artigo !
ResponderEliminarbom dia o mapa não aparece
ResponderEliminarparece faltar a key e nescessario
Obrigada pelo artigo!
ResponderEliminar