Menú Cerrar

API de Geolocalización

Después de tres posts hablando sobre CSS3 toca hablar de otra cosa, en este caso voy a tratar sobre el API de Geolocalización que habita en los navegadores modernos. Es fácil creer que este API es parte del HTML5 ya que apareció casi al mismo tiempo, pero no es así, fue desarrollado por la W3C por separado.

Seguro que alguna vez al abrir una página con el navegador has visto abrirse un bocadillo pidiendo permiso para que el navegador pueda conocer tu ubicación. El navegador debe pedir permiso para poder utilizar el API de Geolocalización:

Lo primero para utilizar el API de Geolocalización es averiguar si lo soporta el navegador:

if (navigator.geolocation)
	// Objeto presente
else
	// Objeto no presente

Si no está soportado poco más hay que decir. Por suerte lo difícil es encontrar un navegador moderno que no lo soporte. En caso de estar soportado tenemos tres métodos disponibles:

Método Descripción
getCurrentPosition(función éxito, función error, opciones) Intenta inmediatamente conseguir la posición del dispositivo asincronamente.
watchPosition(función éxito, función error, opciones) Intenta inmediatamente conseguir la posición del dispositivo asincronamente y crea un callback que se ejecutará cada vez que se cambie de posición. Devuelve un identificador.
clearWatch(identificador) Si existe el identificador lo detiene.

Aunque la explicación es distinta, la ejecución de getCurrentPosition()watchPosition() es prácticamente la misma. Podrán tener uno, dos o tres parámetros. Un ejemplo que agrupa los tres métodos:

if (navigator.geolocation)
{
	navigator.geolocation.getCurrentPosition(function(objPosicion){
		alert("Longitud: "+objPosicion.coords.longitude+"\n"+"Latitud: "+objPosicion.coords.latitude);
	},function(objError){
		switch (objError.code)
			{
				case objError.PERMISSION_DENIED:
					alert("Permiso denegado");
					break;
				case objError.POSITION_UNAVAILABLE:
					alert("Posición no disponible");
					break;
				case objError.TIMEOUT:
					alert("Tiempo de espera superado");
					break;
				default:
					alert("Error desconocido");
					break;
			}
	},{
		maximumAge: 30000,
		timeout: 10000
	});

	identificador=navigator.geolocation.watchPosition(function(objPosicion){
		alert("Longitud: "+objPosicion.coords.longitude+"\n"+"Latitud: "+objPosicion.coords.latitude);
	},function(objError){
		switch (objError.code)
			{
				case objError.PERMISSION_DENIED:
					alert("Permiso denegado");
					break;
				case objError.POSITION_UNAVAILABLE:
					alert("Posición no disponible");
					break;
				case objError.TIMEOUT:
					alert("Tiempo de espera superado");
					break;
				default:
					alert("Error desconocido");
					break;
			}
	},{
		maximumAge: 30000,
		timeout: 10000
	});
}
else
	alert("Objeto no presente");

function detener(elIdentificador)
{
	clearWatch(identificador);
}

En caso de éxito con getCurrentPosition() o watchPosition() la función tendrá disponibles en la función las propiedades coords y timestamp:

Propiedad Descripción
timestamp Fecha y hora. Será devuelto como objeto DOMTimeStamp.
coords.latitude Latitud.
coords.longitude Longitud.
coords.accuracy Precisión.
coords.altitude Altura sobre el nivel del mar en metros.
coords.altitudeAccuracy La precisión de la altura.
coords.heading El desplazamiento en grados sobre el Norte como referencia (como una brújula).
coords.speed Velocidad en metros por segundo.

En caso de error estarían disponibles las propiedades code y message. Recomienda la W3C que la propiedad message se utilice sólo para depuración por parte del desarrollador y no para mostrar el mensaje de error directamente al usuario. Los códigos de error en code:

Error Descripción
PERMISSION_DENIED Permiso denegado para utilizar el API.
POSITION_UNAVAILABLE Posición no disponible. Hay que tener en cuenta que puede fallar algo en el dispositivo o en el mismo navegador.
TIMEOUT Se ha superado el tiempo establecido en las opciones sin conseguir el objeto Position con éxito.

Las opciones posibles son tres y no son obligatorias:

Opción Descripción
enableHighAccuracy Su valor es del tipo booleano y sirve para especificar que se quiere conseguir la mayor precisión posible. Esto significa que el navegador o el dispositivo puede necesitar más tiempo y gastar más energía en el intento.
timeout Tiempo máximo del intento de conseguir la posición indicado en milisegundos.
maximumAge Indica el tiempo máximo en milisegundos que se mantendrá la posición guardada en caché. Si se establece a 0 no será guardada.

A efectos prácticos este API nos deja datos como las coordenadas y etc, lo cual puede estar muy bien o ser muy corto. Para saber en que calle o país se encuentra el dispositivo habrá que utilizar API’s de terceros como Google Maps y algún otro.

Y así termina este post, para más información visita la página Geolocation API Specification de la W3C.

1 comentario

  1. Pingback:Detectar el idioma del navegador | David Ballester

Los comentarios están cerrados.