La geocodificación consiste en convertir datos de ubicaciones (por ejemplo la dirección de una calle) en un dato geográfico (coordenadas geográficas). Esta operación tiene múltiples aplicaciones y es cada vez más empleada. La operación contraria, es decir, a partir de unas coordenadas geográficas obtener una dirección se llama geocodificación inversa. Existen varios motores de búsqueda para la geocodificación, muchos son privados y sometidos a restricciones, pero también disponemos de algunos de uso libre como Nominatim.
En artículos anteriores de este blog ya habíamos tratado la geocodificación en GIS (con herramientas como QGIS) y la geocodificación con Python (con GeoPy).
Ahora completamos este tema repasando otras herramientas para la geocodificación, con un enfoque hacia el desarrollador, ya que analizamos las APIs de Nominatim, ArcGIS, MapBox, Bing Maps, MapTiler, MapQuest. En último lugar veremos la herramienta what3words.
1. Nominatim
Nominatim es un motor de búsqueda de datos de OpenStreetMap. Puede buscar un nombre o una dirección (búsqueda directa) o buscar datos por sus coordenadas geográficas (búsqueda inversa). Cada resultado viene con un enlace a una página de detalles donde se puede inspeccionar qué datos sobre el objeto se guardan en la base de datos e investigar cómo se ha calculado la dirección del objeto. Antes de empezar a trabajar con Nominatim aconsejamos leer su política de uso.
La API de Nominatim
Nominatim indexa entidades con nombre (o numeradas) dentro del conjunto de datos de OpenStreetMap (OSM) y un subconjunto de otras entidades sin nombre (pubs, hoteles, iglesias, etc.).
Su API tiene los siguientes puntos finales para consultar los datos:
- /search – buscar objetos OSM por nombre o tipo.
- /reverse – busca objetos OSM por su ubicación.
- /lookup – busca los detalles de la dirección de los objetos OSM por su ID.
- /status – consulta el estado del servidor.
- /deletable – enumera los objetos que se han eliminado en OSM pero que se retienen en Nominatim en caso de que la eliminación haya sido accidental.
- /polygons – lista de polígonos rotos detectados por Nominatim.
- /details: muestra detalles internos de un objeto (solo para depuración).
Además la API de Nominatim permite:
- Definir el formato de salida entre los siguientes: xml, json, jsonv2, geojson y geocodejson.
- Indicar el idioma de los resultados.
- Limitar el número de resultados.
- Salida de polígono.
Ejemplo
Un ejemplo de una petición a una dirección es el siguiente:
https://nominatim.openstreetmap.org/search?q=Calle%20del%20Universo,%20Pilarica,%20Valladolid,%20Castilla%20y%20Le%C3%B3n,%2047011,%20Espa%C3%B1a&json_callback=_l_osmgeocoder_3&format=json
Como podemos observar, empleamos el parámetro q= seguido de la dirección: Calle, ciudad, región, código postal, País.
El resultado que obtenemos es:
_l_osmgeocoder_3([{"place_id":118312501,"licence":"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright","osm_type":"way","osm_id":75689481,"boundingbox":["41.6569033","41.6587214","-4.6990298","-4.6983179"],"lat":"41.6579667","lon":"-4.6988994","display_name":"Calle del Universo, Pilarica - Los Santos, Valladolid, Castilla y León, 47011, España","class":"highway","type":"residential","importance":1.13}])
2. ArcGIS
El servicio de codificación geográfica de ArcGIS puede encontrar direcciones, empresas y lugares en todo el mundo. El texto de la dirección se puede convertir en candidatos de ubicación y una ubicación se puede convertir en una dirección. El servicio proporciona candidatos de dirección sugeridos para dirección parcial y texto de nombre de lugar. Muchas direcciones también se pueden geocodificar a la vez con la geocodificación por lotes.
Las características del servicio son:
- Geocodifica direcciones y encuentra lugares en todo el mundo.
- Filtra la búsqueda de lugares por tipo de categoría.
- Devuelve candidatos en diferentes idiomas y lugares.
- Devuelve candidatos en una referencia espacial diferente .
- Refinar la búsqueda por ubicación, extensión, ciudad y código de país .
- Devuelve campos de datos específicos para cada candidato.
- Limita el número de candidatos devueltos.
- Devuelve la ubicación de la azotea o la calle para los candidatos de PointAddress.
- Especifica el tipo de nombre de ciudad o nombre de calle que se incluirá en los campos de salida.
Ejemplo
Veamos el resultado para la misma petición utilizando ArcGIS:
https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/findAddressCandidates?outSr=4326&forStorage=false&outFields=*&maxLocations=5&singleLine=Calle del Universo, Pilarica, Valladolid, Castilla y León, 47011, España&f=json
y el resultado es:
{"spatialReference":{"wkid":4326,"latestWkid":4326},"candidates":[{"address":"Calle del Universo, 47011, Pilarica-Los Santos, Valladolid, Castilla y León","location":{"x":-4.698406173043292,"y":41.652594027432421},"score":98.200000000000003,"attributes":{"Loc_name":"World","Status":"M","Score":98.200000000000003,"Match_addr":"Calle del Universo, 47011, Pilarica-Los Santos, Valladolid, Castilla y León","LongLabel":"Calle del Universo, 47011, Pilarica-Los Santos, Valladolid, Castilla y León, ESP","ShortLabel":"Calle del Universo","Addr_type":"StreetName","Type":"","PlaceName":"","Place_addr":"Calle del Universo, 47011, Pilarica-Los Santos, Valladolid, Castilla y León","Phone":"","URL":"","Rank":20,"AddBldg":"","AddNum":"","AddNumFrom":"","AddNumTo":"","AddRange":"","Side":"","StPreDir":"","StPreType":"Calle del","StName":"Universo","StType":"","StDir":"","BldgType":"","BldgName":"","LevelType":"","LevelName":"","UnitType":"","UnitName":"","SubAddr":"","StAddr":"Calle del Universo","Block":"","Sector":"","Nbrhd":"Pilarica-Los Santos","District":"Valladolid","City":"Valladolid","MetroArea":"","Subregion":"Valladolid","Region":"Castilla y León","RegionAbbr":"CL","Territory":"","Zone":"","Postal":"47011","PostalExt":"","Country":"ESP","CntryName":"España","LangCode":"SPA","Distance":0,"X":-4.698406173043292,"Y":41.652594027432421,"DisplayX":-4.698406173043292,"DisplayY":41.652594027432421,"Xmin":-4.6994061730432923,"Xmax":-4.6974061730432917,"Ymin":41.651594027432424,"Ymax":41.653594027432419,"ExInfo":""},"extent":{"xmin":-4.6994061730432923,"ymin":41.651594027432424,"xmax":-4.6974061730432917,"ymax":41.653594027432419}}]}
Además podemos utilizar este servicio mediante el plugin de Leaflet: esri-leaflet-geocoder. Debemos recordar que para utilizar el el localizador de direcciones necesitamos una clave de acceso.
3. MapBox
La API de geocodificación de Mapbox realiza dos tareas principales: geocodificación directa y geocodificación inversa. La API de codificación geográfica de Mapbox contiene fuentes de datos de gobiernos, proyectos de datos abiertos y empresas privadas. En algunos casos, los resultados de la API de codificación geográfica pueden diferir de los datos de Mapbox Streets o OpenStreetMap.
El servicio de Geocodificación de MapBox es muy completo y su documentación muy buena por lo que es la mejor forma de conocer su funcionamiento. Tiene dos partes distintas: los datos de origen que usamos para definir ubicaciones y las herramientas que usamos para buscar y devolver esas ubicaciones.
Los datos de origen de la API de codificación geográfica de Mapbox contienen los siguientes tipos de información geográfica, ordenados del más granular al más grande:
- Puntos de interés (POI): un lugar con nombre que incluye negocios comerciales, edificios públicos, monumentos y parques, entre otras características.
- Dirección: una dirección postal específica, incluido el número de dirección, si corresponde.
- Barrio: Un nombre coloquial para un área más pequeña dentro de un lugar. Los vecindarios no necesariamente tienen límites específicos definidos legalmente. Solo presente en algunos países.
- Localidad: Una unidad administrativa que es más pequeña que un lugar. Solo presente en algunos países.
- Código postal: un área geográfica del componente de la dirección que se utiliza para clasificar el correo.
- Lugar: Ciudades, pueblos y aldeas. Tenga en cuenta que algunas ciudades grandes (como Tokio y Estambul) pueden clasificarse como regiones en lugar de lugares.
- Distrito: Una unidad administrativa que es más grande que un lugar pero más pequeña que una región. Solo presente en algunos países.
- Región: Estados, provincias y prefecturas. Esta suele ser la unidad administrativa subnacional más grande de un país. Tenga en cuenta que algunas ciudades grandes (como Tokio y Estambul) pueden clasificarse como regiones en lugar de lugares.
- País: países generalmente reconocidos o, en algunos casos, como Hong Kong, un área de estado administrativo casi nacional a la que se le ha asignado un código de país designado según ISO 3166-1.
Ejemplo
Podemos hacer una petición como la siguiente:
https://api.mapbox.com/geocoding/v5/mapbox.places/Calle%20del%20Universo%2C%20Pilarica%2C%20Valladolid%2C%20Castilla%20y%20Le%C3%B3n%2C%2047011%2C%20Espa%C3%B1a.json?types=place%2Cpostcode%2Caddress&access_token=pk.eyJ1IjoibmFkaXJpbmciLCJhIjoiY2tob2phbXVoMDE4cjJ6cnN6Nmh5eWRpeSJ9.-9CD1Qdet6QZ0-la9X-WxA
Y el resultado que obtenemos es:
{"type":"FeatureCollection","query":["calle","del","universo","pilarica","valladolid","castilla","y","león","47011","españa"],"features":[{"id":"address.6646104522414774","type":"Feature","place_type":["address"],"relevance":0.667111,"properties":{"accuracy":"street"},"text":"Avenida De Castilla Y León","place_name":"Avenida De Castilla Y León, 47170 Renedo de Esgueva, Valladolid, Spain","matching_place_name":"Avenida De Castilla Y León, 47170 Renedo de Esgueva, Valladolid, España","center":[-4.62078657077973,41.6490973915293],"geometry":{"type":"Point","coordinates":[-4.62078657077973,41.6490973915293]},"context":[{"id":"postcode.14752399392272030","text":"47170"},{"id":"place.14752399393990660","wikidata":"Q965817","text":"Renedo de Esgueva"},{"id":"region.3914000952560650","short_code":"ES-VA","wikidata":"Q71097","text":"Valladolid"},{"id":"country.12507185778570100","wikidata":"Q29","short_code":"es","text":"Spain"}]},{"id":"address.8952949467012426","type":"Feature","place_type":["address"],"relevance":0.563037,"properties":{"accuracy":"street"},"text":"Calle Del Universo","place_name":"Calle Del Universo, 47011 Valladolid, Valladolid, Spain","matching_place_name":"Calle Del Universo, 47011 Valladolid, Valladolid, España","center":[-4.69815570337461,41.6537263736091],"geometry":{"type":"Point","coordinates":[-4.69815570337461,41.6537263736091]},"context":[{"id":"postcode.5701413129104160","text":"47011"},{"id":"place.12363438835560650","wikidata":"Q8356","text":"Valladolid"},{"id":"region.3914000952560650","short_code":"ES-VA","wikidata":"Q71097","text":"Valladolid"},{"id":"country.12507185778570100","wikidata":"Q29","short_code":"es","text":"Spain"}]},{"id":"postcode.18741841314104160","type":"Feature","place_type":["postcode"],"relevance":0.440074,"properties":{},"text":"47011","place_name":"47011, Castrocaro Terme e Terra del Sole, Forlì-Cesena, Italy","matching_place_name":"47011, Castrocaro Terme e Terra del Sole, Forlì-Cesena, Ý","bbox":[11.88861,44.130406,11.98557,44.210908],"center":[11.955631,44.182365],"geometry":{"type":"Point","coordinates":[11.955631,44.182365]},"context":[{"id":"place.18741841313723480","wikidata":"Q99936","text":"Castrocaro Terme e Terra del Sole"},{"id":"region.9737127769415150","short_code":"IT-FC","wikidata":"Q16180","text":"Forlì-Cesena"},{"id":"country.2840014219519910","wikidata":"Q38","short_code":"it","text":"Italy"}]},{"id":"postcode.5701413129104160","type":"Feature","place_type":["postcode"],"relevance":0.375778,"properties":{},"text":"47011","place_name":"47011, Valladolid, Valladolid, Spain","matching_place_name":"47011, Valladolid, Valladolid, España","bbox":[-4.726197,41.643888,-4.630816,41.69241],"center":[-4.711764,41.659246],"geometry":{"type":"Point","coordinates":[-4.711764,41.659246]},"context":[{"id":"place.12363438835560650","wikidata":"Q8356","text":"Valladolid"},{"id":"region.3914000952560650","short_code":"ES-VA","wikidata":"Q71097","text":"Valladolid"},{"id":"country.12507185778570100","wikidata":"Q29","short_code":"es","text":"Spain"}]},{"id":"place.12363438835560650","type":"Feature","place_type":["place"],"relevance":0.359333,"properties":{"wikidata":"Q8356"},"text":"Valladolid","place_name":"Valladolid, Valladolid, Spain","matching_place_name":"Valladolid, Valladolid, España","bbox":[-4.92818,41.523328,-4.630816,41.815508],"center":[-4.728562,41.652133],"geometry":{"type":"Point","coordinates":[-4.728562,41.652133]},"context":[{"id":"region.3914000952560650","short_code":"ES-VA","wikidata":"Q71097","text":"Valladolid"},{"id":"country.12507185778570100","wikidata":"Q29","short_code":"es","text":"Spain"}]}],"attribution":"NOTICE: © 2022 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained. POI(s) provided by Foursquare."}
Si deseamos ver el resultado de forma gráfica tenemos la posibilidad de hacerlo desde la página de MapBox:
Hay que escribir la clave de acceso y los parámetros de búsqueda.
4. Bing Maps
La API de localización de Bing Maps permite:
- Buscar una ubicación por dirección. Para obtener las coordenadas de latitud y longitud de una ubicación especificando valores como la localidad, el código postal y la dirección de la calle.
- Buscar una ubicación por coordenadas de un punto. Para obtener la información de ubicación asociada con las coordenadas de latitud y longitud.
- Buscar una ubicación por una consulta. Para obtener las coordenadas de latitud y longitud que corresponden a la información de ubicación proporcionada como una cadena de consulta.
- Reconocimiento de ubicación. Para obtener información de ubicación, como empresas locales, puntos naturales de interés y una dirección geocodificada inversa para una coordenada de latitud y longitud especificada.
- Búsqueda local. Para buscar empresas locales cercanas mediante una consulta de texto o un tipo de empresa.
Ejemplo
Hacemos la misma consulta que en los ejemplos anteriores:
http://dev.virtualearth.net/REST/v1/Locations/Calle%20del%20Universo%20Pilarica%20Valladolid%20Castilla%20y%20León%2047011%20España?o=xml&key=Tuclave
Deberás utilizar una clave de Bing en el parámetro key de la URL.
5. MapTiler
Maptiler es una plataforma para crear y publicar mapas en la nube. Dispone de una herramienta de geocodificación con las siguientes características.
- Respuestas rápidas para la búsqueda interactiva.
- Buscar con preferencia de idioma.
- Limitar la búsqueda a unos límites dados.
- Búsqueda de proximidad.
- Geocodificación inversa.
Podemos construir fácilmente un control de búsqueda con opción de autocompletado para incluir en nuestros mapas web simplemente escribiendo el siguiente código:
<!DOCTYPE html> <html> <head> <script src="https://cdn.maptiler.com/maptiler-geocoder/v1.1.0/maptiler-geocoder.js"></script> <link href="https://cdn.maptiler.com/maptiler-geocoder/v1.1.0/maptiler-geocoder.css" rel="stylesheet" /> </head> <body> <input autocomplete="off" id="search" type="text" /> <script> var geocoder = new maptiler.Geocoder({ input: 'search', key: 'lmHOKzOjrAHjj7ThE6bO' }); geocoder.on('select', function(item) { console.log('Selected', item); }); </script> </body> </html>
Insertar este control en un mapa de Leaflet y que nos centre el mapa sobre las coordenadas obtenidas lo podemos hacer de la siguiente forma:
<!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.js"></script> <script src="https://cdn.maptiler.com/maptiler-geocoder/v1.1.0/maptiler-geocoder.js"></script> <link href="https://cdn.maptiler.com/maptiler-geocoder/v1.1.0/maptiler-geocoder.css" rel="stylesheet" /> <style> #map {position: absolute; top: 0; right: 0; bottom: 0; left: 0;} </style> </head> <body> <div id="map"> <input autocomplete="off" id="search" type="text" /> <a href="https://www.maptiler.com" style="position:absolute;left:10px;bottom:10px;z-index:999;"><img src="https://api.maptiler.com/resources/logo.svg" alt="MapTiler logo"></a> </div> <p><a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a></p> <script> var map = L.map('map').setView([0, 0], 1); L.tileLayer('https://api.maptiler.com/maps/basic/{z}/{x}/{y}.png?key=lmHOKzOjrAHjj7ThE6bO',{ tileSize: 512, zoomOffset: -1, minZoom: 1, attribution: "\u003ca href=\"https://www.maptiler.com/copyright/\" target=\"_blank\"\u003e\u0026copy; MapTiler\u003c/a\u003e \u003ca href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\"\u003e\u0026copy; OpenStreetMap contributors\u003c/a\u003e", crossOrigin: true }).addTo(map); var geocoder = new maptiler.Geocoder({ input: 'search', key: 'lmHOKzOjrAHjj7ThE6bO' }); geocoder.on('select', function(item) { var x=('Selected', item.center); console.log(x); map.setView([x[1],x[0]],12) }); </script> </body> </html>
6. MapQuest
MapQuest cuenta con una API para Geocodificación y Geocodificación inversa. Pero además presenta una característica importante que el la geocodificación por lotes. Esta permite enviar varias solicitudes de geocodificación directa o inversa a la vez. Se puede enviar hasta 100 direcciones o pares de latitud y longitud en una sola solicitud por lotes.
MapQuest necesita de una clave para acceder a sus servicios.
7. what3words
what3words es un bonito proyecto que nos permite identificar un lugar empleando tres palabras.
Escribiendo la dirección en el control de búsquedas nos selecciona la ubicación:
Nos crea un enlace que podemos compartir, guardar o darnos indicaciones para llegar desde nuestra posición a ese destino.
Otras
Por supuesto la lista anterior de herramientas para la Geocodificación no es exhaustiva y hay otros servicios de geocodificación como los de Google Maps o Photon.
Tutor del curso online de Análisis GeoEspacial con Python y de los cursos online de webmapping. Echa un vistazo a todos nuestros cursos de SIG online.
Hola Jose Luis, como siempre excelente sus aportes. Quisiera aprovechar, para consultarle si ha realizado algún posteo referido a como realizar una simbología numérica, es decir si se pueden categorizar 150 puntos con un símbolo numérico del 1 al 150.
Estimados Señores: Su artículo me ha parecido de un gran interés, no obstante, en lo relativo a las direcciones soy de la opinión que la procedencia del dato es un aspecto esencial a tener en cuenta. En España, como saben, los datos de direcciones son competencia municipal, por tanto son los Ayuntamientos los únicos que dictan cómo se denomina oficialmente una vía y cual es la numeración de un edificio. Geocodificar a partir de datos que no proceden de su fuente oficial supone correr el riesgo de trabajar con información errónea o inconsistente. Por este motivo desde la Comisión Especializada de Normas Geográficas del Consejo Superior Geográfico, se ha realizado recientemente un proyecto que define un modelo de datos común de direcciones en formato CSV, muy básico y fácil de producir, con el objetivo de simplificar y automatizar la recopilación de la información de direcciones desde las Administraciones Públicas competentes, desarrollando una API de geocodificación a partir de dicho repositorio. El proyecto está en estos momentos finalizado y la API en fase de implementación, por lo que es previsible que en un plazo razonable se pueda facilitar este servicio desde el Centro Nacional de Información Geográfica.
Muchas gracias Gonzalo y Patricia por vuestros comentarios.
Por supuesto el artículo de este blog no agota el tema de la
geocodificación. Nos hemos fijado en servicios de geocodificación
globales pero como bien apuntáis existen servicios nacionales con la
ventaja de que los datos están más depurados. Tomamos nota para un
futuro artículo sobre los servicios de geocodificación oficiales de
ámbito nacional.
Saludos
Todas las propuestas son estupendas, pero también se puede hablar de aquellas herramientas de Geocodificación oficiales, como son el Geocodificador del Proyecto CartoCiudad y la posibilidad de integrarlo en un visor a través del plugin que se desarrolla con la API del CNIG, el callejero de Andalucía o el de Catastro. Para más información para desarrolladores: https://plataforma.idee.es/web/idee/inicio