lunes, 18 de marzo de 2013

Geocodificar en Colombia con Open Refine y Google Geocoding API

Esta sección esta dirigida especialmente a las personas que están interesadas en geocodificar direcciones en Colombia. Aunque creo que Colombia posee un sistema lógico, no muchos esfuerzos se han hecho para poder hacer una buena geocodificación, no como Europa o Estados Unidos. Espero ante mano que les sea útil esta primera entrega y cualquier duda, comentario, corrección, adición... por favor háganme saberla.

La geocodificación es el proceso por el cual se le asigna coordenadas a un punto por medio de una dirección. Este proceso es realizado por diferentes softwares SIG usando datos propios o conectándose a servidores especializados ¿Pero que hacemos si no tenemos la posibilidad  de acceder a uno de estos programas o si no tenemos los datos necesarios? Una posible solución es basarnos en otras herramientas tales como Open Refine y Google Maps.

Open Refine[1] es una poderosa herramienta libre que trabaja con datos desordenados, limpiándolos, transformándolos de un formato a otro, extendiéndolos con servicios web y enlazándolos a bases de datos tal como Freebase. Una de las ventajas de esta aplicación es poder crear columnas a partir de datos existentes por medio de servicios Web, tal como Google Geocoding API. Esta API (Application Programming Interface) permite transformar direcciones a coordenadas geográficas.

Al usar la API debemos tener en cuenta algunas restricciones: si somos usuarios gratuitos podemos geocodificar máximo 2.500 puntos por día o, si somos usuarios API Google Maps for Business podemos geocodificar hasta 100.000 puntos por día. Otro aspecto importante es la sintaxis de la dirección, ya que Colombia no usa el sistema europeo de calles con nombres propios, debemos colocar las direcciones de un forma especifica.

En Colombia, a comparación de otros países, usamos un sistema cartesiano para definir las calles. El nombre de la calle depende de su sentido así, en Colombia tenemos Carreras, Calles, Diagonales o Transversales. Las Carreras y Transversales dividen la ciudad en este y oeste, o sea que van norte-sur, las Calles y Diagonales van de Este-Oeste dividiendo la ciudad en Norte y Sur. Para formar una dirección se ubica el inmueble sobre una calle principal y se mide la distancia a la que se encuentra de la calle transversal a la calle principal. Por ejemplo, en la imagen a continuación vemos un predio que se encuentra sobre la Calle 84 BIS, separado 42 m de la Carrera 13, por lo tanto la dirección será Calle 84 BIS N. 13-42. En Colombia las Calles y Diagonales aumentan hacia el Norte y las Carreras y Transversales hacia el Oeste. Este sistema es eficiente en cuanto a ubicación, por que una persona que no conozca el lugar puede fácilmente llegar a su destino en el momento en que se ubique pero, como es el caso de muchas ciudades en Colombia, las calles no son creadas según planes de ordenamiento territorial sino por la inserción de casas sin control, por las cuales se permite el paso vehicular y finalmente se les asigna una abreviatura.




Muchas calles poseen los mismos números con diferente letra, dichas letras van de la A-Z y algunas poseen hasta dos letras (Por ejemplo la Calle 13 C y la Calle 13 AA). En las grandes ciudades, se ha dividido el territorio en zonas norte, sur y centro, que se ve codificado en la nomenclatura con una S o Sur, N o Norte y si no especifica es centro. Para geocodificar un punto a partir de una dirección en Colombia usando Google Maps, la dirección debe tener la siguiente sintaxis:

Calle 38AS 93D 54, Bogotá, Colombia
Calle 38AS # 93D-54, Bogotá, Colombia

Como se ve, la dirección debe empezar con el nombre completo de la calle (Carrera, Calle, Diagonal o Transversal), seguido de un espacio y el número de la respectiva calle. En el caso de que la calle contenga una letra, la letra debe estar junto al número. Luego, si el usuario desea puede colocar un numeral (#) o dejar un espacio, en seguida se coloca el número de la calle transversal a la calle principal seguida de la letra (si la posee). Dejando un espacio o un guion (-) se coloca la distancia a la cual se encuentra el predio y seguido la letra si la posee. Finalmente, se coloca las especificaciones de la dirección como el barrio, localidad o comuna, ciudad, país… procurando llevar un orden ascendente.

Lo anterior es una aproximación de cómo se deben escribir las calles en Google Maps, aunque no en todas las ocasiones funcione correctamente, generalmente se obtienen buenos resultados. Ahora bien, conociendo la sintaxis de la dirección, vamos a ver primero algo sobre Open Refine y luego explicaremos el procedimiento general de cómo obtener las coordenadas longitud/latitud por medio de Google Geocoding API.

Antes de mostrar como obtener las coordenadas de nuestras direcciones, les dejo este pequeño vídeo (1 de los tres hechos) para introducirlos en Open Refine. Estos videos los encuentran en www.openrefine.org.



Ahora si, una vez exportada la tabla en la cual poseemos las direcciones a geocodificar en Open Refine, vamos a la columna donde se encuentra la dirección y damos clic en la barra desplegable, seguimos a Edit Column y Add Column by fetching URLs… Enseguida saldrá una ventana en la cual escribiremos:

http://maps.google.com/maps/api/geocode/json?sensor=false&address=’+ escape(value, ‘url’)



En esta expresión vemos el llamado de la API con un formato de salida json y  una función escape que convierte el texto contenido en value a formato URL (Mirar [2]). Esta acción va a crear una nueva columna con un respuesta que contiene los criterios de búsqueda y las coordenadas geográficas latitud/longitud que la API estableció para cada dirección. Para separar las coordenadas vamos al menú desplegable de la columna recién creada,  Edit Column/ Add column based on this column… y escribimos lo siguiente:

with(value.parseJson().results[0].geometry.location, pair, pair.lat +", " + pair.lng)

Esto creara una columna con los valores de latitud y longitud separados por una coma. Para separar estos valores vamos otra vez al menú desplegable, Split into several columns y definimos separar la columna por la coma en dos nuevas columnas.



Finalmente tendemos una tabla con las coordenadas de cada punto, que  podremos ubicar usando algún SIG o programa en línea. La API de Google no es la única opción que tenemos para geocodificar, por ejemplo tenemos el proyecto Nominatum[3] de OpenStreetMap que con pasos similares a los anteriores podemos encontrar las coordenadas para nuestras direcciones.



[1] Desde el 2 de Octubre 2012 Google dejo de dar soporte al proyecto llamado Google Refine, desde entonces personas independientes tomaron su dirección y lo llamaron Open Refine. Para más información visiten la pagina www.openrefine.org.
[2] Para más información mirar  Geocoding Open Refine y Google Geocoding API
[3] Para Mas Información ver Proyecto Nominatim.