jueves, 10 de julio de 2014

Geocodificación inversa: convertir coordenada GPS en dirección postal


Uno de los usos más frecuentes de las aplicaciones de mapas es el de buscar la localización exacta de una dirección determinada. Para ello, introducimos una dirección que la aplicación convierte en una posición GPS y, finalmente, en un marcador en nuestro mapa. A este proceso se le llama geocodificación. Por otra parte, otro uso habitual es el de obtener la dirección de una localización exacta conocida. Para ello, señalamos un punto en el mapa, que la aplicación convierte en una coordenada GPS y ésta en una dirección. A este procese se le llama geocodificación inversa.

Supongamos, por ejemplo, que hacemos una aplicación Web con un mapa que se centra en la posición del usuario y muestra un marcador en la misma. La posición (coordenadas GPS) podría obtenerse con las APIs de geolocalización de HTML5 que indican las coordenadas del punto más cercano a la ubicación del usuario. Sin embargo, mostrarle al usuario unas coordenadas numéricas es poco útil porque no le sirve para orientarse. De modo que tendríamos que convertir dichas coordenadas en una dirección postal; pero para ello, lamentablemente, no hay una API en HTML5, por lo que habrá que usar un servicio de algún proveedor de geocodificación inversa.

Proveedores de geocodificacón inversa


La geocodificación inversa es un proceso que requiere amplias bases de datos y depende de la disponibilidad de información que puede variar de un país o región a otro. Por eso, hay proveedores que compilan o centralizan el acceso a esa información. Algunos de estos proveedores son compañías tan conocidas como Google o Microsoft y otros menos conocidos pero más especializados, como Esri o MapQuest... 

Los proveedores de geocodificación inversa son, en sentido general, los mismos proveedores de cartografía o APIs de mapas y, en su mayoría, ofrecen el servicio previo pago o con ciertas limitaciones en su uso. Por ejemplo, no se permite el uso de la geocodificación inversa de Google si no se muestra el resultado en un mapa de Google y solo se permiten 2500 geocodificaciones diarias de forma gratuita (ver detalles de límite de uso en https://developers.google.com/maps/documentation/geocoding/?hl=es#Limits). De modo que siempre que vayamos a usar un servicio, deberíamos verificar si nuestra aplicación cumple con las políticas de uso de la API en cuestión.

Una alternativa a estos servicios de pago o con limitaciones, es el uso de proveedores gratuitos como Nominatim, asociado a los datos de OpenStreetMaps. Hay que tener presente que Nominatim, para evitar el abuso de un recurso gratuito, también tiene cierto límite en la "intensidad" de uso del servicio, limitándolo a 1 geolocalización por segundo. Sin embargo, este límite, comparado con el de la API de Google, por ejemplo, es mucho menos restrictivo pues permitiría un volumen de consultas casi 35 veces superior.

Ejemplo de geolocalización inversa mediante el servicio Nominatim


La conversion de una coordenada GPS a una dirección postal con Nominatim se realiza mediante un servicio Web fácilmente consultable. Es tan fácil como copiar la siguiente dirección y pegarla en la barra de direcciones del navegador, remplazando {lat} por la latitud y {lon} por la longitud, cuya dirección postal quiere obtenerse:

http://nominatim.openstreetmap.org/reverse?format=json&addressdetails=1&accept-language=es&zoom=18&lat={lat}&lon={lon}

Por ejemplo, si se visita la dirección siguiente:

http://nominatim.openstreetmap.org/reverse?format=json&addressdetails=0&zoom=18&lat=40.4111188922952&lon=-3.704248666763305

Se obtendría un documento en formato JSON con los siguientes detalles de la localización:
{
  "place_id":"20678078",
  "licence":"Data \u00a9 OpenStreetMap contributors, ODbL 1.0.
             http:\/\/www.openstreetmap.org\/copyright",
  "osm_type":"way",
  "osm_id":"4350172",
  "lat":"40.4090377",
  "lon":"-3.7025752",
  "display_name":"Calle del Amparo, Barrio de las Letras, Centro,
                  Madrid, \u00c1rea metropolitana de Madrid y 
                  Corredor del Henares, Comunidad de Madrid, 28012,
                  Espa\u00f1a"
}

Automatización del acceso al servicio Nominatim en JavaScript


Para realizar geocodificaciones inversas desde JavaScript, usaremos jQuery y la siguiente función

/**
 * Convierte una posición GPS a una dirección postal
 * @param lat - Latitud
 * @param lon - Longitud
 * @param callback - Función a ejecutar una vez se han obtenido 
 * los datos de la geocodificación inversa
 */
function convertirGpsADireccion(lat, lon, callback) {
    $.getJSON("http://nominatim.openstreetmap.org/reverse?" +
              "format=json&addressdetails=0&zoom=18&" +
              "lat=" + lat + "&lon=" + lon + "&json_callback=?",
        callback);
}

Para verla en funcionamiento, teclee una coordenada en los cuadros de texto siguientes y pulse en el botón Obtener geocodificación inversa.




En este caso, la función callback utilizada para mostrar la dirección obtenida fue la siguiente:

function mostrarDireccion(response) {
    $('#direccion').text(response.display_name);
}

Poniéndolo todo junto


Saber de antemano las coordenadas GPS de una posición, no es muy frecuente que digamos, de modo que, para ilustrar la geocodificación inversa en un entorno más natural, la integraremos con un mapa interactivo en el que, al pulsar en el mapa, se obtendrá la dirección postal asociada a la posición GPS del punto seleccionado. Para ver el código fuente en el que se basa este mapa, ver https://github.com/carlosbello/efectodemo/blob/master/WebMaps/Leaflet/reverse_geocoding.html


Instrucciones

Pulse en el mapa para centrarlo en dicha zona y obtebner la dirección de la localización.