R que R

Mapas con información georreferenciada de Google en R con {ggmap}

Sat, Jan 4, 2020
R
#mapas #google #ggmap

Re

Otra forma de realizar mapas es mediante la utilización de información georreferenciada obtenida de recursos de la web a través de API´s. Este post muestra cómo utilizar {ggmap} con datos de Google.


Introducción


En el post anterior expusimos algunas nociones básicas que pueden sernos de utilidad a la hora de realizar mapas utilizando información de Open Street Map (OSM) con el paquete {osmdata}. Además, previamente, en diversos posts se ha ido exponiendo diferentes mecanismos mediante los cuales podemos realizar mapas con R, bien sea utilizando coordinadas geográficas, con archivos shapefile, utilizando datos de Eurostat, etc. En esta línea, para continuar la exposición de posibilidades a la hora de querer realizar mapas con R, el presente post tiene como objetivo exponer cómo podemos hacerlo utilizando información georreferenciada de Google con el paquete {ggmap}.


Como bien sabemos, Google es uno de los principales proveedores de información georreferenciada. Sin embargo, para trabajar con dicha información en R debemos, en primer lugar, obtener una API (Application Programme Interface) a Google. Para ello accedemos a la librería de API´s de Google y habilitamos Map Static API y Geocoding API. Asimismo, debemos crear un nuevo proyecto y crear credenciales, es decir, crear una clave API para acceder a las API´s activadas e identificar el proyecto creado. Nótese que Google provee este servicio de forma gratuita para un número determinado de consultas diarías. Si se requiere este servicio para consultas de mayor envergadura puede que sea necesario adquirir una licencia.


Al realizar el procedimiento descrito Google nos provee una clave de API (API key) que deberemos registrar posteriormente en R. Conviene proteger o restringir esta clave para evitar usos no autorizados con ella y/o el robo de cuotas. Durante el proceso Google ofrece diversas posibilidades para restringir y proteger la clave generada.


Una vez hemos obtenido nuestra API key abrimos la sesión de R donde vamos a trabajar y registramos dicha clave con la función register_gogle(key = "API key"). Llevado a cabo este proceso podemos empezar a utilizar información proveniente de Google de una forma muy sencilla.


Antes de empezar a realizar los mapas debemos cargar algunos paquetes en nuestra sesión de R que vamos a utilizar a lo largo del ejercicio.



library(tidyverse)
library(ggmap)
library(tibble)


Mapas con la función qmap()


Una posibilidad para obtener cualquier mapa con información de Google consiste en utilizar directamente la función qmap(). Para ello indicamos el lugar que nos interesa representar geográficamente y, en caso de ser necesario, podemos indicar un zoom determinado según nuestras necesidades específicas. Veamos, por ejemplo, como obtener un mapa de Zaragoza y otro de Barcelona:



qmap("Zaragoza, Spain", zoom = 13)

qmap("Barcelona, Spain", zoom = 13)


Téngase en cuenta que la información geográfica que tiene Google es inmensa, lo que permite obtener imágenes/mapas de sitios remotos. Por ejemplo, pongamos que queremos que Google nos devuelva un mapa de Leh, un pequeño y pintoresco pueblo de la India situado en la cordillera del Himalaya, que tuve la suerte de poder visitar hace unos años:



qmap("Leh, India", zoom = 14)


Mapas con la función get_map()


Una segunda forma de generar los mapas en base a la información facilitada por Google es con la función get_map(). Su funcionamiento es sencillo, en primer lugar descargamos el mapa deseado con la función mencionada (resultado que viene a ser una imagen raster) y, posteriormente, graficamos dicha imagen con la función ggmap(). La sintaxis de ggmap() es similar a la utilizada en ggplot2, lo que nos facilita enormemente su manejo y manipulación.



zgz_map <- get_map("Zaragoza", zoom = 13)
ggmap(zgz_map) +
  ggtitle("Zaragoza")


bcn_map <- get_map("Barcelona", zoom = 13)
ggmap(bcn_map) +
  ggtitle("Barcelona") +
  theme_void()


Tipos de mapas


Por defecto, la imagen obtenida es la que se denomina terrain, donde se incluyen montañas, rios, etc. Este tipo de mapa es el generado en los apartados previos para los mapas de Zaragoza, Barcelona y Leh. Veamos cómo sería este tipo de mapa para la ciudad de Londres y sus alrededores (Greater London):



lnd <- geocode("London, UK", zoom = 11)
lnd
## # A tibble: 1 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.128  51.5

# Terrain maps (default)
ggmap(get_map(lnd, maptype = "terrain"))


Estableciendo la orden maptype = "terrain-labels" obtenemos únicamente nombres de las localidades mientras que si indicamos maptype = "terrain-lines" el resultado nos muestra únicamente las carreteras, autopistas etc.



# Labels
ggmap(get_map(lnd, maptype = "terrain-labels"))


# Lines
ggmap(get_map(lnd, maptype = "terrain-lines"))


Por su parte, maptype= "roadmap" devuelve un mapa similar al obtenido con la función maptype= "terrain", pero en el mapa destaca la red de carreteras.



# Roadmap
ggmap(get_map(lnd, maptype = "roadmap"))


Existen tres modalidades para realizar mapas en blanco y negro: toner, toner-lite, toner-background, cada una con sus particularidades. toner-background resulta similar al modelo toner, aunque en toner-background se omiten los nombres de las localidades.



# toner
ggmap(get_map(lnd, maptype = "toner"))

ggmap(get_map(lnd, maptype = "toner-lite"))

ggmap(get_map(lnd, maptype = "toner-background")) #removes lables


El modelo maptype = "satellite" nos devuelve imágenes en modo satélite, como las que estamos acostumbrados a ver al utilizar Google maps.



# satelite
ggmap(get_map(lnd, maptype = "satellite"))


maptype = "hybrid" genera mapas con características observadas en otros modelos de mapas, como el satélite, el terrain o el roadmap.



# Hybrid
ggmap(get_map(lnd, maptype = "hybrid"))


Además, el paquete {ggmap} nos ofrece una posibilidad para generar mapas, que en cierta medida podemos denominar artísticos, utilizando la función: maptype = "watercolor".



# watercolor
ggmap(get_map(lnd, maptype = "watercolor"))


Representación geográfica con la función geocode()


Pongamos que nuestro objetivo consiste en localizar en un mapa determinados emplazamientos. Podemos para ello identificar las coordenadas geográficas de dichos emplazamientos y, posteriormente, identificarlos en un mapa similar a los obtenidos previamente.


A modo de ejemplo vamos a localizar en un mapa de Zaragoza, ciudad que me vio crecer, un conjunto de negocios relacionados con la música rock. Esto no pretende ser un análisis extensivo sobre la localización de este tipo de negocios en la ciudad de Zaragoza sino que simplemente voy a seleccionar un número reducido de locales, que ahora mismo me vienen a la mente, aunque, evidentemente, no son todos los que están ni están todos los que son.


Para localizar y ubicar en un mapa cualquier emplazamiento necesitamos identificar sus coordenadas geográficas. Para obtener las coordenadas de los negocios a representar utilizamos la función geocode() de la siguiente forma:



# Tienda Leyenda-Rock
leyenda <- geocode("leyenda-rock, Zaragoza")
leyenda
## # A tibble: 1 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.891  41.6

# Sala Z
salaZ <- geocode("Sala Z, Zaragoza")
salaZ
## # A tibble: 1 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.892  41.6

# Pub Trilogy
trilogy <- geocode("Pub Trilogy, Zaragoza")
trilogy
## # A tibble: 1 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.896  41.6

# Rock & Blues Café
rockandblues <- geocode("Rock and Blues café, Zaragoza")
rockandblues
## # A tibble: 1 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.881  41.7

# Pub Posturas
posturas <- geocode("Pub Posturas, Zaragoza")
posturas
## # A tibble: 1 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.888  41.6

# Pub DPche Rock
DPche <- geocode("DPch rock, Zaragoza")
DPche
## # A tibble: 1 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.885  41.7


De esta forma resulta sencillo ubicar en un mapa de Zaragoza cualquiera de estos establecimientos. Pongamos que quiero situar, con un punto rojo, el emplazamiento del Pub DPche-Rock, sitio que suelo visitar bastante, sobre un mapa de Zaragoza.



zgz <- geocode("Zaragoza, Spain")

ggmap(get_map(zgz, zoom=15, maptype = "toner-background")) +
  geom_point(aes(x=lon, 
                 y=lat), 
             color = "red", 
             size = 4,
             data = DPche) +
  ggtitle("Ubicación del Pub DPche-Rock en Zaragoza")


Ahora bien, pongamos que queremos ubicar en el mapa todos los emplazamientos enunciados previamente. Para ello conviene previamente crear un dataframe o un tibble que incluya para cada uno de los establecimientos sus coordenadas geográficas. Una vez tenemos la información necesaria recogida en un dataset resulta sencillo localizarlos conjuntamente en un mismo mapa.



lugares <- c("leyenda-rock", 
             "sala Z", 
             "pub trilogy, Zaragoza", 
             "Rock and Blues Cafe, Zaragoza", 
             "Pub Posturas", 
             "DPch rock zaragoza")

geocodes <- geocode(lugares)
geocodes
## # A tibble: 6 x 2
##      lon   lat
##    <dbl> <dbl>
## 1 -0.891  41.6
## 2 -0.892  41.6
## 3 -0.896  41.6
## 4 -0.881  41.7
## 5 -0.888  41.6
## 6 -0.885  41.7

lugares_rock <- tibble(name=lugares, 
                       lat= geocodes$lat,
                       lon=geocodes$lon)


lugares_rock$name[1] = "Leyenda"
lugares_rock$name[2] = "Sala Z"
lugares_rock$name[3] = "Trilogy"
lugares_rock$name[4] = "Rock & Blues"
lugares_rock$name[5] = "Posturas"
lugares_rock$name[6] = "DPch"

lugares_rock
## # A tibble: 6 x 3
##   name           lat    lon
##   <chr>        <dbl>  <dbl>
## 1 Leyenda       41.6 -0.891
## 2 Sala Z        41.6 -0.892
## 3 Trilogy       41.6 -0.896
## 4 Rock & Blues  41.7 -0.881
## 5 Posturas      41.6 -0.888
## 6 DPch          41.7 -0.885



ggmap(get_map(zgz, zoom=15, maptype = "terrain-lines")) +
  geom_point(aes(x=lon, 
                 y=lat), 
             color = "red", 
             data = lugares_rock) +
  geom_text(aes(x=lon, y=lat, label=name),
            color= "black", 
            data = lugares_rock,
            size = 3.5,
            nudge_y = -0.0004)