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.


12 comentarios:

  1. Hola Nelson, gracias por tu artículo, muy interesante!! Pero me quedé tan solo en la primera parte. No he podido instlar google refine,. Cuando doy click al .exe, no me parece la ventana del navegador. He intentado cambiar configuraciones del internet, pero nada. Me puedes dar una mano con eso? Mil gracias.

    ResponderEliminar
    Respuestas
    1. Hola, Buenos días, muchas gracias por tu comentario...en cuanto a tu pregunta, cuando abres google-refine.exe normalmente aparece una ventana de MS-DOS donde instala el programa y después abre la ventana de inicio en el explorador. Open Refine fue un producto de Google y por lo tanto te recomiendo que tengas Google Chrome instalado y como navegador predeterminado. Otra opción es que dentro del archivo .zip, hay un archivo que se llama refine.bat que abrirá la ventana MS-DOS que ya te había mencionado....Espero que te sea útil y una vez muchas gracias

      Eliminar
  2. Hola Nelson!. Hecho!!! Pude solucionar la descarga del programa. Y logré los resultados esperados, un listado de coordenadas de mi listado de direcciones en Cali, Colombia.

    Mil gracias!

    ResponderEliminar
  3. yo segui los pasos que dices pero no me funciono

    ResponderEliminar
    Respuestas
    1. Hola Victor, tocaría que fueras mas especifico con lo que pasa para poderte ayudar...

      Eliminar
  4. Buen día, mira si me funciono pero la posición no corresponde a la dirrecion exacta, me una posición lejana a la que deberia estar

    ResponderEliminar
    Respuestas
    1. Hola Victor...Hay ocasiones en las que no sirven la geocodificación, la verdad trate de exponer la mejor manera de poner las direcciones pero ya se me sale de las manos la forma en que google realiza la operación. Ademas que el blog dice "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"....gracias por tu comentario y voy a mirar como mejorar la precisión de la geocodificación.

      Eliminar
  5. Hola nelson.
    He hecho varias pruebas pero las direcciones que tienen letra en la "generadora" (ejemplo: carrera 15 66A 02) la ubica en la 66 y no en la 66A. Y así sucesivamente, no geocodifica las que tienen letra en la segunda posición. Qué estoy haciendo mal?
    Gracias por tu ayuda

    ResponderEliminar
    Respuestas
    1. Hola, que pena contestarte hasta ahora :/, pero la verdad no sabría decirte el porqué. La verdad creería que esta en la forma en como Google tiene codificadas nuestras calles, pero lo que estoy diciendo es especulaciones, lo siento por no poderte ayudar

      Eliminar
  6. Buen dia... muy buena la información...las instrucciones son claras y funcionan perfentamente, solo quiero aportar que las cooordenadas que trae el procedimiento son las de la primera coincidencia que encuentra google y aveces no son las adecuadas... por ello y dado que es free, es recomendable en generar el KML y desplegarlo en google earth y revisar los puntos por si algunos se deben mover...

    ResponderEliminar
  7. Hola, gracias por el comentario. ¿Còmo genero el KML?

    ResponderEliminar