Antes que nada, activamos los paquetes que vamos a utilizar para este ejercicio:

library(osmdata)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(leaflet)
library(tidyverse)
## -- Attaching packages ---------------------------------------------------------------------------------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.0     v purrr   0.3.3
## v tibble  2.1.3     v dplyr   0.8.5
## v tidyr   1.0.2     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts ------------------------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(sf)
## Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3

Ahora vamos a utilizar la función getbb para obtener las coordenadas de OpenStreetMap (la bounding box) de un lugar determinado. En este caso, continuando con nuestro ejercicio anterior, la ciudad de Londres.

bbox <- getbb("City of London, Greater London")
bbox
##          min        max
## x -0.2519983  0.0680017
## y 51.3556177 51.6756177

A continuación, utilizando la función leaflet le puedo decir que agregue mosaicos y polígonos a partir de la información que ingresé, mediante los comandos addTiles y que addPolygons.

bbox_poly <- getbb("City of London, Greater London", format_out = "sf_polygon")
leaflet(bbox_poly) %>% 
    addTiles() %>% 
    addPolygons()

Luego vamos a utilizar la add_osm_feature() para especificar qué datos queremos mapear. Para eso necesitamos saber las categorías con las que se identifican los registros en la base de Open Street Map, por lo que revisamos la lista completa en https://wiki.openstreetmap.org/wiki/Map_Features

En este breve ejercicio queremos averiguar qué tan cerca quedan las escuelas de las calles principales de Londres, sobretodo las peatonales (entendiendo como principales las “primary” and “secondary” de la clasificación de Open Street Map).

Primero mapeamos las calles principales (primary, secondary, motorways, trunks, tertiary y unclassified) Tambien obtenemos las ciclovias y las peatonales para luego poder indentificar que tan cerca de las escuelas estan. Como los archivos son muy pesados, bajamos las diferentes calles de Londres de manera separada segun la categoria.

londres_calles <- opq(bbox) %>% 
  add_osm_feature(key = "highway", value = c("primary","secondary"))

londres_calles <- londres_calles %>% 
  osmdata_sf()
londres_calles_0 <- opq(bbox) %>% 
  add_osm_feature(key = "highway", value = c("motorway","trunk"))

londres_calles_0 <- londres_calles_0 %>% 
  osmdata_sf()
londres_peatonales <- opq(bbox) %>% 
  add_osm_feature(key = "highway", value = ("pedestrian"))

londres_peatonales <- londres_peatonales %>% 
  osmdata_sf()
londres_ciclovias <- opq(bbox) %>% 
  add_osm_feature(key = "highway", value = ("cycleway"))

londres_ciclovias <- londres_ciclovias %>% 
  osmdata_sf()
londres_calles_3 <- opq(bbox) %>% 
  add_osm_feature(key = "highway", value = c("tertiary"))

londres_calles_3 <- londres_calles_3 %>% 
  osmdata_sf()
londres_calles_1 <- opq(bbox) %>% 
  add_osm_feature(key = "highway", value = c("unclassified"))

londres_calles_1 <- londres_calles_1 %>% 
  osmdata_sf()
londres_calles_2 <- opq(bbox) %>% 
  add_osm_feature(key = "highway", value = c("residential"))

londres_calles_2 <- londres_calles_2 %>% 
  osmdata_sf()

Buscamos solo la informacion que nos interesa graficar, en este caso,las osm_lines.

londres_calles_ <- londres_calles$osm_lines

londres_calles_00 <- londres_calles_0$osm_lines

londres_calles_11 <- londres_calles_1$osm_lines

londres_calles_22 <- londres_calles_2$osm_lines

londres_calles_33 <- londres_calles_3$osm_lines

londres_peatonales_ <- londres_peatonales$osm_lines

londres_ciclovias_ <- londres_ciclovias$osm_lines

Ya estamos listos para una primera versión del mapa.

ggplot() +
    geom_sf(data = londres_calles_, color = "royalblue4") +
    geom_sf(data = londres_calles_00, color = "royalblue3") +
    geom_sf(data = londres_calles_11, color = "royalblue3") +
    geom_sf(data = londres_calles_22, color = "royalblue3") +
    geom_sf(data = londres_calles_33, color = "royalblue2") +
    geom_sf(data = londres_peatonales_, color = "red")+
    geom_sf(data = londres_ciclovias_, color = "green") +
    labs(title = "Mapa de Londres Sin Limites Definidos", subtitle = "Calles, peatonales y ciclovias", caption = "Fuente:   https://openstreetmap.org") 

Este mapa contiene demasiadas calles, algunas incluso por fuera de City of London. Para eso, usaremos la herramienta st_intersection:

londres_calles_rec <- st_intersection(londres_calles_, bbox_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
londres_calles_0_rec <- st_intersection(londres_calles_00, bbox_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
londres_calles_1_rec <- st_intersection(londres_calles_11, bbox_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
londres_calles_2_rec <- st_intersection(londres_calles_22, bbox_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
londres_calles_3_rec <- st_intersection(londres_calles_33, bbox_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
londres_peatonales_rec <- st_intersection(londres_peatonales_, bbox_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
londres_ciclovias_rec <- st_intersection(londres_ciclovias_, bbox_poly)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

Ahora sí, obtenemos un mapa en el que se advierten las calles peatonales de la Ciudad de Londres (en rojo) y su cercanía o no a las principales calles de la Ciudad (en azul y verde).

ggplot() +
    geom_sf(data = londres_calles_rec, color = "royalblue4") +
    geom_sf(data = londres_calles_0_rec, color = "royalblue4") +
    geom_sf(data = londres_calles_1_rec, color = "royalblue3")+
    geom_sf(data = londres_calles_2_rec, color = "royalblue3")+
    geom_sf(data = londres_calles_3_rec, color = "royalblue2")+
    geom_sf(data = londres_peatonales_rec, color = "red")+
    geom_sf(data = londres_ciclovias_rec, color = "green") +
    labs(title = "Mapa de City of London", subtitle = "Calles, peatonales y ciclovias", caption = "Fuente:   https://openstreetmap.org")  

Vamos a bajar la ubicacion de las escuela de Londres y las vamos a incorporar al plano anterior. Para eso generamos la consulta de las escuelas de Londres y las intercepatamos con el bbox que contiene los limites.

bbox2 <- getbb("Greater London, United Kingdom")
bbox2
##          min        max
## x -0.5103751  0.3340155
## y 51.2867601 51.6918741
bbox_poly2 <- getbb("Greater London, United Kingdom", format_out = "sf_polygon")

leaflet(bbox_poly2) %>% 
    addTiles() %>% 
    addPolygons()
Escuelas_CityofLondon <- opq(bbox2) %>% 
  add_osm_feature(key = "amenity", value = "school") %>% 
  osmdata_sf() 

londres_escuela <- Escuelas_CityofLondon$osm_points


londres_escuela_rec <- st_intersection(londres_escuela, bbox_poly2)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

Ya estamos listos para ver la ubicacion de las escuelas en relacion a las calles.

ggplot() +
    geom_sf(data = londres_escuela_rec, color = "darksalmon",alpha = .8,size = 2) +
    labs(title = "Mapa de City of London ", subtitle = "Distribucion espacial de las escuelas", caption = "Fuente:   https://openstreetmap.org") 

MapaBaseLondres = st_read("London_Borough_Excluding_MHW.shp")
## Reading layer `London_Borough_Excluding_MHW' from data source `C:\Users\Andres\Desktop\Ciencia de Datos 23\Clase1\London\London_Borough_Excluding_MHW.shp' using driver `ESRI Shapefile'
## Simple feature collection with 33 features and 7 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: 503568.2 ymin: 155850.8 xmax: 561957.5 ymax: 200933.9
## epsg (SRID):    NA
## proj4string:    +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601272 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs
MapaBaseLondres <- MapaBaseLondres %>%
st_transform(crs = 4326)

ggplot() +
    geom_sf(data = MapaBaseLondres)+  labs(title = "Londres", subtitle = "Plano Base", caption = "Fuente:https://data.london.gov.uk/", x= "Longitud",y = "Latitud") + theme(legend.position = "bottom")

Esc_Map = st_join(londres_escuela_rec, MapaBaseLondres)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
Esc_Agrupado = Esc_Map  %>% 
    group_by(NAME) %>% 
    summarise(cantidad = n())
## Warning: Factor `NAME` contains implicit NA, consider using
## `forcats::fct_explicit_na`
MapaLondresEscuelas2= st_join(MapaBaseLondres, Esc_Agrupado, by = "NAME")
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
ggplot() +
  geom_sf(data = MapaBaseLondres)+
    geom_sf(data = MapaLondresEscuelas2,  aes(fill = cantidad))+
   scale_fill_gradient(low = "#56B1F7", high = "#132B43") +
   labs(title = "Escuelas en Londres por barrio", subtitle = "Número de las escuelas por borough", fill = "Escuelas", caption = "Fuente:   https://data.london.gov.uk/") + theme(legend.position = "bottom") + theme(text = element_text(size=10))

Para continuar un poco con el trabajo anterior hicimos el trabajo de sumar cuantas escuelas existen en Greater London. Al agrupar las escuelas que obtuvimos de open maps podemos ver que muchas escuelas aparecen subidas en el mismo lugar pero con distintas coordenadas. El total de escuelas nos da hasta 2000 por barrio, muy distinto a los 160 del ejercicio anterior. Como consecuencia de este trabajo podemos darnos cuenta la importancia de los datos publicos publicados por instituciones oficiales y como estos son generados para un correcto analisis espacial. Hay informacion muy valiosa recolectada por los usuario de open maps, pero al no ser la informacion corroborada y ordenada encontramos todo tipo de incongruencias.