Introducción a Geolocation API de JavaScript JavaScript
El API de geolocalización de JavaScript permite acceder a la información de localización geográfica del dispositivo desde el que se visita una web. Esta información se obtiene de diversas fuentes, por ejemplo, de la dirección IP, de la torre de conexión móvil o de las coordenadas GPS. JavaScript puede acceder así a la latitud y longitud del dispositivo y enviarlas al servidor web dónde se pueden utilizar con fines muy diversos, la mayoría relacionados con ofrecer recursos personalizados y cercanos al usuario.
El API de geolocalización es soportado por todos los navegadores principales, incluido IE9+, Firefox 3.5+, Chrome 5.0+ y Safari 5.0+. Si estás interesado en una alternativa para navegadores y plataformas que no soporten el API de forma nativa, échale un vistazo a geolocation.js en Github.
Privacidad
Antes de meternos de lleno en el tema hagamos un alto para atender a la privacidad. Hoy en día se le da mucha importancia a la privacidad del usuario y personalmente aún creo que debería protegerse más y que queda mucho por hacer. En cuánto al Geolocation API, has de saber que es de tipo opt-in, es decir, su uso es completamente opcional y ha de ser aprobado por el usuario.
En otras palabras, ningún navegador forzará al usuario a enviar su geolocalización sin preguntar primero. El navegador ha de lanzar un aviso alertando sobre una web que quiere acceder a los datos de geolocalización, decir específicamente de que web se trata y dar las opciones de aprobar o rechazar dicho acceso. La aprobación por parte del usuario ha de ser obligatoria, sin ninguna opción de que la web puede saltársela.
El aviso en Firefox 35.0.1 tiene esta pinta:
Además, Chrome, Firefox y WebKit solo aceptan el uso de este API bajo HTTPS.
¿Cómo se utiliza y que información se puede obtener?
El API de geolocalización se basa completamente en la propiedad geolocation del objeto global navigator: navigator.geolocation
. Este propiedad tiene tres métodos:
getCurrentPosition( successCallback, errorCallback, options )
El método getCurrentPosition
se utiliza para acceder a la posición actual del dispositivo. Puede admitir uno, dos o tres parámetros:
- successCallback: obligatorio. Función callback que recibe el objeto
Position
con la información de posición actual en caso de que se obtenga correctamente. - errorCallback: opcional. Función callback en caso de error. Recibe un objeto
PositionError
. - options: opcional. objecto con opciones. Entre las opciones que se pueden especificar están
timeout
(tiempo máximo de espera en milisegundos para recibir la información de localización. Por defecto es infinito),enableHighAccuracy
(true/false, el dispositivo intentará obtener los datos más exactos posibles, puede alargar el tiempo de respuesta. Por defecto esfalse
) ymaximumAge
(tiempo de caché de la información expresado en milisegundos, por defecto es cero, valor que deshabilita la caché).
El objeto Position
Hemos dicho que sucessCallback
recibe un objeto Position
con la información de posición actual. La información disponible en este objeto es:
coords.latitude
: grados decimalescoords.longitude
: grados decimalescoords.altitude
: metroscoords.accuracy
: metroscoords.altitudeAccuracy
: metroscoords.heading
: grados en sentido horario desde el norte verdaderocoords.speed
: metros por segundotimestamp
: objeto Date() con la fecha y hora del dispositivo
El objecto PositionError
El objeto de error que recibe errorCallback
tiene estas dos propiedades:
code
: código de errormessage
: mensaje de error correspondiente
Ejemplo
var options = {
enableHighAccuracy: true,
timeout: 6000,
maximumAge: 0
};
navigator.geolocation.getCurrentPosition( success, error, options );
function success(position) {
var coordenadas = position.coords;
console.log('Tu posición actual es:');
console.log('Latitud : ' + coordenadas.latitude);
console.log('Longitud: ' + coordenadas.longitude);
console.log('Más o menos ' + coordenadas.accuracy + ' metros.');
};
function error(error) {
console.warn('ERROR(' + error.code + '): ' + error.message);
};
watchPosition( successCallback, errorCallback, options )
El método watchPosition
hace lo mismo que getCurrentPosition
: registra un callback que recibe la posición y, opcionalmente, un callback en caso de error y un objeto de opciones. La diferencia es que el callback registrado por watchPosition se llama automáticamente cada vez que el dispositivo cambia de posición y genera un identificador de la operación:
var watchId = navigator.geolocation.watchPosition( success, error, options );
clearWatch( watchId )
Con este método se cancela el proceso iniciado con watchPosition
e identificado con watchId
:
//Inicia un proceso y se almacena el identificador
//en la variable watchId
var watchId = navigator.geolocation.watchPosition( success, error, options );
//Cancela el proceso
navigator.geolocation.clearWatch( watchId );
Ejemplo: mostrar ubicación actual en Google maps
Utilizando el Geolocation API y Google Maps API podemos mostrar la ubicación del usuario en mapa.
google.maps.event.addDomListener(window, 'load', mapInitialize);
function mapInitialize() {
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition( set_position_in_google_map );
} else {
alert("Tu navegador no soporta el API de geolocalización. Actualiza a un navegador más moderno.");
}
}
function set_position_in_google_map( position ) {
var crds = position.coords;
var mapPosition = new google.maps.LatLng(crds.latitude, crds.longitude);
var mapOptions = {
zoom: 15,
center: mapPosition
};
var map = new google.maps.Map(
document.getElementById('map-canvas'),
mapOptions
);
var infowindow = new google.maps.InfoWindow({
map: map,
position: mapPosition,
content: 'Localización encontrada utilizando Geolocation API.'
});
}
Demo
Para ver el demo en acción tendrás que compartir la ubicación aceptando el aviso que lanzará el navegador al ejecutar el Pen.
Referencias
- Geolocation API specifications. W3C Recommendation.
- Mark Pilgrim. «You Are Here (And So Is Everybody Else)». Dive Into HTML5, capítulo 6.