Imaginemos estar leyendo una de las simpática publicinotas de La Nación, por ejemplo ésta: “Qué es el café de especialidad y dónde encontrarlo en Buenos Aires”

Al final de la nota aparece un listado de direcciones, que podemos copiar, pegar un documento de texto y convertir en un archivo .csv sin demasiado esfuerzo. Al cargarlo en R, obtenemos esto:

cafes <- read.csv("http://www.sharecsv.com/dl/1d199b4fa06d97802c8e7792688b9f3d/cafes_nota.csv", encoding = "UTF-8")

cafes

Seía útil tener las coordenadas de cada café para poder visualizarlos en un mapa. Por surte, traducir direcciones en coordenadas es una necesidad recurrente en el análisis de datos; eso significa que ya seguro existe algún paquete que ayuda a resolver el problema. Por ejemplo…

Georeferenciando mediante el servicio de Google con el paquete ggmap

ggmap incluye la funcion mutate_geocode, que en base a una las direcciones agrega campos de coordenadas al dataframe que le brindemos. Para encontrar las localizaciones consulta los servidores de Google, accediendo a un servicio online que recibe direcciones y devuelve las coordenadas geográficas del lugar. Para hacer las consultas Google requiere que tengamos una “API key”, una especie de password -una cadena de letras y números- que prueba que estamos autorizados a usar el servicio.

He aquí el quid: para obtener autorización debemos darnos de alta como clientes de los servicios digitales de google, ya que la empresa cobra por el uso. Si bien podemos usar un crédito gratuito que se otorga cada mes (y así en la práctica no pagar nada, mientras nuestro uso sea mdoerado) es obligatorio dejar los datos de una tarjeta de crédito o débito, pues sin ello no obtendremos la dichosa “API key”.

Para registrarse ante Google y obtener la key pueden seguirse los pasos de éste tutorial.

Habiendo obtenido la autorización, usamos la función register_google() para que ggmap() sepa como contectarse con Google de forma autorizada. Sólo es necesario correr el registro una vez.

library(ggmap)

#API key inventada, utilizar la que obtuvimos de Google 
api_key <- "AIzclkjsHicyUSDwdowepr0TIhd9xNaiyodAOzz0msvDoo"

register_google(api_key, write = TRUE)

Ya estamos listos para procesar el listado de direcciones a georefernciar. Nuestro dataset lo hace fácil, ya que tiene una columnas con calle más altura, y otra con la ciudad. Para asegurarnos de que Google sepa a qué dirección nos referimos en cada caso (ya que al fin y al cabo tiene un directorio mundial de sitios) podemos crear un campo de dirección detallda, que contenga tanto la calle como la ciudad, así:

library(tidyverse)

cafes <- cafes %>% 
    mutate(Dir_completa = paste(Dirección, ",", Ciudad, ", Argentina"))

cafes

Ahora si, a georeferenciar. Usamos mutate_geocode(), y para el parámetro “location” usamos la columna recén creada, “Dir_completa”:

cafes <- cafes %>% mutate_geocode(location = Dir_completa)

El resultado:

cafes

Podemos guardar el dataframe geolocalizado, con

write.csv(cafes, "cafes_geolocalizados.csv", row.names = FALSE)

Y mostrarlo en el mapa usando las funciones que ya hemos practicado

mapa_baires <- get_map("Ciudad de Buenos Aires", zoom = 12)

ggmap(mapa_baires) +
    geom_point(data = cafes, 
               aes(x = lon, y = lat), 
               size = 5, 
               alpha = .5, 
               color = "brown") +
    labs(title = "Cafés mencionados")

LS0tCnRpdGxlOiAiR2VvcmVmZXJlbmNpYW5kbyBkaXJlY2Npb25lcyIKYXV0aG9yOiAiQW50b25pbyBWw6F6cXVleiBCcnVzdCIKZGF0ZTogIjEwLzEyLzIwMTkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmBgYAoKSW1hZ2luZW1vcyBlc3RhciBsZXllbmRvIHVuYSBkZSBsYXMgc2ltcMOhdGljYSBwdWJsaWNpbm90YXMgZGUgTGEgTmFjacOzbiwgcG9yIGVqZW1wbG8gw6lzdGE6IOKAnFF1w6kgZXMgZWwgY2Fmw6kgZGUgZXNwZWNpYWxpZGFkIHkgZMOzbmRlIGVuY29udHJhcmxvIGVuIEJ1ZW5vcyBBaXJlc+KAnQoKYGBge3IgZWNobz1GQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImltYWdlbmVzL25vdGFfY2FmZXMucG5nIikKYGBgCgoKQWwgZmluYWwgZGUgbGEgbm90YSBhcGFyZWNlIHVuIGxpc3RhZG8gZGUgZGlyZWNjaW9uZXMsIHF1ZSBwb2RlbW9zIGNvcGlhciwgcGVnYXIgdW4gZG9jdW1lbnRvIGRlIHRleHRvIHkgY29udmVydGlyIGVuIHVuIGFyY2hpdm8gLmNzdiBzaW4gZGVtYXNpYWRvIGVzZnVlcnpvLiBBbCBjYXJnYXJsbyBlbiBSLCBvYnRlbmVtb3MgZXN0bzoKCmBgYHtyfQpjYWZlcyA8LSByZWFkLmNzdigiaHR0cDovL3d3dy5zaGFyZWNzdi5jb20vZGwvMWQxOTliNGZhMDZkOTc4MDJjOGU3NzkyNjg4YjlmM2QvY2FmZXNfbm90YS5jc3YiLCBlbmNvZGluZyA9ICJVVEYtOCIpCgpjYWZlcwpgYGAKClNlw61hIMO6dGlsIHRlbmVyIGxhcyBjb29yZGVuYWRhcyBkZSBjYWRhIGNhZsOpIHBhcmEgcG9kZXIgdmlzdWFsaXphcmxvcyBlbiB1biBtYXBhLiBQb3Igc3VydGUsIHRyYWR1Y2lyIGRpcmVjY2lvbmVzIGVuIGNvb3JkZW5hZGFzIGVzIHVuYSBuZWNlc2lkYWQgcmVjdXJyZW50ZSBlbiBlbCBhbsOhbGlzaXMgZGUgZGF0b3M7IGVzbyBzaWduaWZpY2EgcXVlIHlhIHNlZ3VybyBleGlzdGUgYWxnw7puIHBhcXVldGUgcXVlIGF5dWRhIGEgcmVzb2x2ZXIgZWwgcHJvYmxlbWEuIFBvciBlamVtcGxv4oCmCgojIyBHZW9yZWZlcmVuY2lhbmRvIG1lZGlhbnRlIGVsIHNlcnZpY2lvIGRlIEdvb2dsZSBjb24gZWwgcGFxdWV0ZSBgZ2dtYXBgCgpgZ2dtYXBgIGluY2x1eWUgbGEgZnVuY2lvbiBtdXRhdGVfZ2VvY29kZSwgcXVlIGVuIGJhc2UgYSB1bmEgbGFzIGRpcmVjY2lvbmVzIGFncmVnYSBjYW1wb3MgZGUgY29vcmRlbmFkYXMgYWwgZGF0YWZyYW1lIHF1ZSBsZSBicmluZGVtb3MuIFBhcmEgZW5jb250cmFyIGxhcyBsb2NhbGl6YWNpb25lcyBjb25zdWx0YSBsb3Mgc2Vydmlkb3JlcyBkZSBHb29nbGUsIGFjY2VkaWVuZG8gYSB1biBzZXJ2aWNpbyBvbmxpbmUgcXVlIHJlY2liZSBkaXJlY2Npb25lcyB5IGRldnVlbHZlIGxhcyBjb29yZGVuYWRhcyBnZW9ncsOhZmljYXMgZGVsIGx1Z2FyLiBQYXJhIGhhY2VyIGxhcyBjb25zdWx0YXMgR29vZ2xlIHJlcXVpZXJlIHF1ZSB0ZW5nYW1vcyB1bmEgIkFQSSBrZXkiLCB1bmEgZXNwZWNpZSBkZSBwYXNzd29yZCAtdW5hIGNhZGVuYSBkZSBsZXRyYXMgeSBuw7ptZXJvcy0gcXVlIHBydWViYSBxdWUgZXN0YW1vcyBhdXRvcml6YWRvcyBhIHVzYXIgZWwgc2VydmljaW8uCgpIZSBhcXXDrSBlbCBxdWlkOiBwYXJhIG9idGVuZXIgYXV0b3JpemFjacOzbiBkZWJlbW9zIGRhcm5vcyBkZSBhbHRhIGNvbW8gY2xpZW50ZXMgZGUgbG9zIHNlcnZpY2lvcyBkaWdpdGFsZXMgZGUgZ29vZ2xlLCB5YSBxdWUgbGEgZW1wcmVzYSBjb2JyYSBwb3IgZWwgdXNvLiBTaSBiaWVuIHBvZGVtb3MgdXNhciB1biBjcsOpZGl0byBncmF0dWl0byBxdWUgc2Ugb3RvcmdhIGNhZGEgbWVzICh5IGFzw60gZW4gbGEgcHLDoWN0aWNhIG5vIHBhZ2FyIG5hZGEsIG1pZW50cmFzIG51ZXN0cm8gdXNvIHNlYSBtZG9lcmFkbykgZXMgb2JsaWdhdG9yaW8gZGVqYXIgbG9zIGRhdG9zIGRlIHVuYSB0YXJqZXRhIGRlIGNyw6lkaXRvIG8gZMOpYml0bywgcHVlcyBzaW4gZWxsbyBubyBvYnRlbmRyZW1vcyBsYSBkaWNob3NhICJBUEkga2V5Ii4KClBhcmEgcmVnaXN0cmFyc2UgYW50ZSBHb29nbGUgeSBvYnRlbmVyIGxhIF9rZXlfIHB1ZWRlbiBzZWd1aXJzZSBsb3MgcGFzb3MgZGUgW8Opc3RlIHR1dG9yaWFsXShodHRwczovL3d3dy5hZXVyb3dlYi5jb20vY2xhdmUtYXBpLWdvb2dsZS1tYXBzLykuIAoKSGFiaWVuZG8gb2J0ZW5pZG8gbGEgYXV0b3JpemFjacOzbiwgdXNhbW9zIGxhIGZ1bmNpw7NuIGByZWdpc3Rlcl9nb29nbGUoKWAgcGFyYSBxdWUgYGdnbWFwKClgIHNlcGEgY29tbyBjb250ZWN0YXJzZSBjb24gR29vZ2xlIGRlIGZvcm1hIGF1dG9yaXphZGEuIFPDs2xvIGVzIG5lY2VzYXJpbyBjb3JyZXIgZWwgcmVnaXN0cm8gdW5hIHZlei4KCmBgYHtyIGVjaG89RkFMU0V9CmxpYnJhcnkoZ2dtYXApCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KbGlicmFyeShnZ21hcCkKCiNBUEkga2V5IGludmVudGFkYSwgdXRpbGl6YXIgbGEgcXVlIG9idHV2aW1vcyBkZSBHb29nbGUgCmFwaV9rZXkgPC0gIkFJemNsa2pzSGljeVVTRHdkb3dlcHIwVEloZDl4TmFpeW9kQU96ejBtc3ZEb28iCgpyZWdpc3Rlcl9nb29nbGUoYXBpX2tleSwgd3JpdGUgPSBUUlVFKQpgYGAKCllhIGVzdGFtb3MgbGlzdG9zIHBhcmEgcHJvY2VzYXIgZWwgbGlzdGFkbyBkZSBkaXJlY2Npb25lcyBhIGdlb3JlZmVybmNpYXIuIE51ZXN0cm8gZGF0YXNldCBsbyBoYWNlIGbDoWNpbCwgeWEgcXVlIHRpZW5lIHVuYSBjb2x1bW5hcyBjb24gY2FsbGUgbcOhcyBhbHR1cmEsIHkgb3RyYSBjb24gbGEgY2l1ZGFkLiBQYXJhIGFzZWd1cmFybm9zIGRlIHF1ZSBHb29nbGUgc2VwYSBhIHF1w6kgZGlyZWNjacOzbiBub3MgcmVmZXJpbW9zIGVuIGNhZGEgY2FzbyAoeWEgcXVlIGFsIGZpbiB5IGFsIGNhYm8gdGllbmUgdW4gZGlyZWN0b3JpbyBtdW5kaWFsIGRlIHNpdGlvcykgcG9kZW1vcyBjcmVhciB1biBjYW1wbyBkZSBkaXJlY2Npw7NuIGRldGFsbGRhLCBxdWUgY29udGVuZ2EgdGFudG8gbGEgY2FsbGUgY29tbyBsYSBjaXVkYWQsIGFzw606CgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCgpjYWZlcyA8LSBjYWZlcyAlPiUgCiAgICBtdXRhdGUoRGlyX2NvbXBsZXRhID0gcGFzdGUoRGlyZWNjacOzbiwgIiwiLCBDaXVkYWQsICIsIEFyZ2VudGluYSIpKQoKY2FmZXMKYGBgCgpBaG9yYSBzaSwgYSBnZW9yZWZlcmVuY2lhci4gVXNhbW9zIGBtdXRhdGVfZ2VvY29kZSgpYCwgeSBwYXJhIGVsIHBhcsOhbWV0cm8g4oCcbG9jYXRpb27igJ0gdXNhbW9zIGxhIGNvbHVtbmEgcmVjw6luIGNyZWFkYSwg4oCcRGlyX2NvbXBsZXRh4oCdOgoKYGBge3J9CmNhZmVzIDwtIGNhZmVzICU+JSBtdXRhdGVfZ2VvY29kZShsb2NhdGlvbiA9IERpcl9jb21wbGV0YSkKYGBgCgpFbCByZXN1bHRhZG86CgpgYGB7cn0KY2FmZXMKYGBgCgpQb2RlbW9zIGd1YXJkYXIgZWwgZGF0YWZyYW1lIGdlb2xvY2FsaXphZG8sIGNvbgoKYGBge3IgZXZhbD1GQUxTRX0Kd3JpdGUuY3N2KGNhZmVzLCAiY2FmZXNfZ2VvbG9jYWxpemFkb3MuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKWSBtb3N0cmFybG8gZW4gZWwgbWFwYSB1c2FuZG8gbGFzIGZ1bmNpb25lcyBxdWUgeWEgaGVtb3MgcHJhY3RpY2FkbwoKYGBge3J9Cm1hcGFfYmFpcmVzIDwtIGdldF9tYXAoIkNpdWRhZCBkZSBCdWVub3MgQWlyZXMiLCB6b29tID0gMTIpCgpnZ21hcChtYXBhX2JhaXJlcykgKwogICAgZ2VvbV9wb2ludChkYXRhID0gY2FmZXMsIAogICAgICAgICAgICAgICBhZXMoeCA9IGxvbiwgeSA9IGxhdCksIAogICAgICAgICAgICAgICBzaXplID0gNSwgCiAgICAgICAgICAgICAgIGFscGhhID0gLjUsIAogICAgICAgICAgICAgICBjb2xvciA9ICJicm93biIpICsKICAgIGxhYnModGl0bGUgPSAiQ2Fmw6lzIG1lbmNpb25hZG9zIikKCmBgYAoK