Nesse artigo irei mostrar como utilizar geolocalização com HTML5. O uso dessa API é muito simples, e as possibilidades de aplicações que ela nos traz são fantásticas, sendo assim um recurso muito bacana para sites e aplicações web modernas.
Geolo… quê?
Entre as diversas novas API’s que chegaram com o HTML5, está a Geolocation API. O que essa API faz? Simples. Com ela nós podemos descobrir onde o usuário está localizado de maneira bem precisa, e capturar alguns dados como suas coordenadas de latitude e longitude.
Com esses dados em “mãos” por exemplo, você pode usar a Google Maps API para exibir um mapa mostrando onde o usuário está, traçar uma rota para ajudá-lo a chegar em determinado local, exibir locais úteis como restaurantes, lojas, etc. que estão por perto do usuário e podem interessá-lo, enfim, o limite será sua criatividade. O legal é explorar as possibilidades e não ficar apenas no “creme de papaia de sempre”.
Que browsers suportam a API de Geolocalização?
O suporte à API de Geolocalização é bem amplo, funciona na grande maioria dos browsers, com exceção apenas o IEca8- e o Opera Mini 5.0 - 7.0. Você pode conferir esses dados no site Can I Use.
Para verificar se o browser suporta a API de geolocalização HTML5, podemos utilizar a biblioteca Modernizr ou fazer uma checagem simples com JavaScript “puro”:
if( ! 'geolocation' in navigator ) {
// Não suporta Geolocation HTML5...
} else {
// Suporta Geolocation HTML5. Vamos em frente!
}
Mergulhando mais a fundo
Agora vamos realmente entender como as coisas funcionam nessa API. Se você abrir o console Firebug ou outra ferramenta de inspeção em seu browser favorito, verá que o objeto geolocation é composto por três métodos, que são: clearWatch()
, getCurrentPosition()
e watchPosition()
. Veremos como trabalhar com cada um desses métodos.
O método getCurrentPosition()
Para fins didáticos, vamos começar analisando o método getCurrentPosition()
. Esse método pode receber três argumentos que são:
- successCallback: Uma função que será executada caso a posição do usuário seja localizada com sucesso;
- errorCallback: Uma função que será utilizada para tratar eventuais erros ao se tentar obter a localização do usuário. Esse parâmetro é opcional;
- PositionOptions: Um objeto com propriedades de configurações adicionais. Esse parâmetro também é opcional.
getCurrentPosition()
é chamado da seguinte forma:
navigator.geolocation.getCurrentPosition( geoSuccess );
Quando esse método é chamado, ele exibe uma notificação solicitando permissão do usuário para detectar sua posição, e caso o usuário concorde (não, você não pode acessar a localização do usuário sem que ele permita), ele executa uma requisição assíncrona para detectar sua posição atual e chama um callback para tratar os dados retornados. Por isso você sempre deve especificar o primeiro argumento de getCurrentPosition()
.
A função callback de sucesso, recebe um único argumento e retorna um objeto com duas propriedades: coords e timestamp. A propriedade timestamp serve apenas para armazenar a data e o horário de quando a localização foi calculada. E a propriedade coords é um objeto com propriedades interessantes como latitude e longitude.
Após implementar a função callback geoSuccess()
nosso código ficou assim:
function geoSuccess( pos ) {
// armazena as coordenadas de latitude e longitude
var lat = pos.coords.latitude,
lng = pos.coords.longitude;
// crie qualquer coisa legal usando as coordenadas
};
navigator.geolocation.getCurrentPosition( geoSuccess );
Tratando erros
Durante o ciclo de uso da geolocalização alguns erros podem ocorrer, e a API nos fornece recursos para tratar esses possíveis erros de maneira bem simples. Para isso, basta usar o segundo parâmetro que é uma função callback para tratar erros, conforme já citado anteriormente. Cada erro retornado é referenciado por um código. Os erros que podem ser retornados e seus respectivos códigos são:
- 1 - PERMISSION_DENIED: O usuário não aceitou compartilhar sua posição. O ideal nesse caso é não incomodar o usuário com mensagens de erro.
- 2 - POSITION_UNAVAILABLE: O usuário está desconectado, não foi possível alcancar os satélites de GPS ou algo do tipo.
- 3 - TIMEOUT: A requisição demorou demais para retornar a posição do usuário. Você pode determinar qual é o tempo limite máximo, veremos como fazer isso.
- 0 - UNKNOWN_ERROR: Ocorreu um erro desconhecido.
function geoSuccess( pos ) {
// armazena as coordenadas de latitude e longitude
var lat = pos.coords.latitude,
lng = pos.coords.longitude;
// crie qualquer coisa legal usando as coordenadas
}
function geoError( err ) {
switch( err.code ) {
case 1:
// permissão negada pelo usuario
break;
case 2:
// nao foi possível alcançar os satélites GPS
break;
case 3:
// a requisição demorou demais para retornar
break;
case 0:
// ocorreu um erro desconhecido...
break;
}
}
navigator.geolocation.getCurrentPosition( geoSuccess, geoError );
Configurações adicionais
Agora que já temos uma função para capturar a posição do usuário e outra para tratar os possíveis erros, podemos também opicionalmente utilizar um terceiro parâmetro, que é o objeto PositionOptions. Esse objeto possui três proriedades que são:
- enableHighAccuracy: Um valor boolean, por padrão false. Se definir como true, e o dispositivo do usuário suportar tal funcionalidade, irá tentar utilizar GPS para aumentar a precisão da localização, por exemplo.
- timeout: Aqui definimos o tempo máximo em milisegundos que a requisição poderá demorar antes de disparar um erro TIMEOUT que vimos acima.
- maximumAge: O tempo máximo em milisegundos que o dispositivo pode fazer um cache da localização do usuário.
function geoSuccess( pos ) {
// armazena as coordenadas de latitude e longitude
var lat = pos.coords.latitude,
lng = pos.coords.longitude;
// crie qualquer coisa legal usando as coordenadas
}
function geoError( err ) {
switch( err.code ) {
case 1:
// permissão negada pelo usuario
break;
case 2:
// nao foi possível alcançar os satélites GPS
break;
case 3:
// a requisição demorou demais para retornar
break;
case 0:
// ocorreu um erro desconhecido...
break;
}
}
var geoOptions = {
enableHighAccuracy: true,
timeout: 30000,
maximumAge: 3000
};
navigator.geolocation.getCurrentPosition( geoSuccess, geoError, geoOptions );
watchPosition() e clearWatch()
Ao invés de apenas pegar a localização do usuário, nós podemos também acompanhar continuamente sua posição, atualizando as coordenadas sempre que o usuário se mover. Para isso nós utilizamos o método watchPosition(). Esse método funciona da mesma forma que o getCurrentPosition(), a única diferença é que a função geoSuccess() do nosso exemplo será chamada toda vez que o usuário se locomover, e o método watchPosition() retorna um número, para que possamos parar de rastrear a posição do usuário quando desejarmos.
Para parar de rastrear a posição do usuário, basta utilizarmos o método clearWatch() passando à ele como argumento o número retornado pelo método watchPosition(). Veja agora um exemplo:
// callback para tratar posição do usuário
function geoSuccess( pos ) {
// armazena as coordenadas de latitude e longitude
var lat = pos.coords.latitude,
lng = pos.coords.longitude;
// crie qualquer coisa legal usando as coordenadas
}
// callback para tratar erros
function geoError( err ) {
switch( err.code ) {
case 1:
// permissão negada pelo usuario
break;
case 2:
// nao foi possível alcançar os satélites GPS
break;
case 3:
// a requisição demorou demais para retornar
break;
case 0:
// ocorreu um erro desconhecido...
break;
}
}
var geoOptions = {
enableHighAccuracy: true,
timeout: 30000,
maximumAge: 3000
};
// um botão "stop"
var btnStop = document.getElementById( 'btn-stop' );
// rastreia posicao do usuario continuamente
var watch = navigator.geolocation.watchPosition( geoSuccess, geoError, geoOptions );
// para de rastrear posiçãoo do usuário ao clicar no botão "stop"
btnStop.addEventListener( "click", function() {
navigator.geolocation.clearWatch( watch );
}, false );
Finalizando
Neste artigo você conheceu a API de Geolocalização HTML5 e viu alguns exemplos de código para se trabalhar com ela. Essa API sem dúvida será de grande ajuda para tornar suas aplicações mais ricas e interativas. Conforme já mencionado no artigo, você pode integrar o uso dessa API com outros serviços, API’s sociais etc., para criar coisas muito legais.
Você já usou a API de Geolocalização HTML5 em algum projeto? Gostou do artigo e pretende fazer algum experimento? Não gostou do artigo ou tem dúvidas? Fique a vontade para compartilhar suas experiências nos comentários.