libs <- c("tidyverse", "sf", "mapSpain", "osmdata", "ggspatial","leaflet")
installed_libs <- libs %in% rownames(installed.packages())
if (any(installed_libs == F)) {install.packages(libs[!installed_libs])}
invisible(lapply(libs, library, character.only = T))
rm(libs, installed_libs)
Datos en Open Street Maps (OSM)
Input
Uno de los objetivos de la asignatura Datos Espaciales y Espacio-temporales es la familiarización con el uso de la herramienta Open Street Maps (OSM). Se trata de un proyecto colaborativo en el que se busca crear un mapa del mundo de código abierto y editable por cualquier persona, donde la información geográfica se aporta de manera voluntaria, utilizando los Sistemas de Información Geográfica (SIG) o los datos recopilados mediante dispositivos GPS, entre otros. Cuenta con cantidad de opciones de datos y temáticas donde elegir.
En este caso, se ha escogido exponer las zonas de aterrizajes de emergencia de helicópteros. Se trata de áreas cuya utilidad básica es que, en caso de que se produzca una situación de emergencia, un helicóptero médico pueda aterrizar. La ubicación de estos datos será España.
Descripcion
Uno de los principales problemas que encontramos al utilizar esta herramienta es que, debido a que los datos se aportan de manera voluntaria, muchas áreas no están cubiertas. Esto quiere decir que muchos de los lugares que deberían estar localizados no aparecen y, por tanto, los resultados obtenidos no son del todo completos.
Al hacer uso de estos datos para una tarea obtuve otro error grave y es que al representar los puntos obtenidos sobre un mapa, muchos de los puntos aparecían fuera del territorio escogido.
A continuación se muestra este problema y como ha sido resuelto:
En primer lugar abrimos las librerías necesarias.
Como he indicado anteriormente, la zona en la que se van a posicionar los datos es España. Por ello, utilizaremos mapSpain()
para delimitar el territorio. Se van a excluir de estas delimitaciones las Islas Canarias, Ceuta y Melilla. Además, he establecido el CRS (Coordinate Reference System) en “4326”.
comunidades_autonomas <- mapSpain::esp_get_ccaa(epsg="4326")
espana_CCAA <- comunidades_autonomas %>% filter(!codauto %in% c("05","18","19"))
espana_mapa <- espana_CCAA %>%
group_by() %>%
summarise()
espana <- sf::st_bbox(espana_mapa)
El siguiente paso será crear la consulta con la que obtener los datos que busco en OSM. En este caso, se utilizará emergency como key y el value se corresponderá con landing_site.
pais <- espana %>%
osmdata::opq() %>%
osmdata::add_osm_feature(key = "emergency", value = "landing_site")
aterrizaje_emergencia <- osmdata::osmdata_sf(pais)
aterrizaje_sf <- aterrizaje_emergencia$osm_points
st_write(aterrizaje_sf, "aterrizajes_emergencia.gpkg")
Representamos en un mapa los resultados obtenidos.
ggplot() +
ggspatial::annotation_map_tile(type="cartolight", zoom = 7) +
geom_sf(data = aterrizaje_sf, color = "darkcyan", size = 2.5, alpha = 0.5)
Zoom: 7
Tras obtener la representación de los datos vemos que algunos de los puntos aparecen en Francia y en Portugal, lo que no se corresponde con la delimitaciones establecidas.
Tratamiento
Primero se detectan aquellos puntos que no se corresponden con la cartografía seleccionada. Para ello utilizaremos la función st_difference
la cual encuentra diferencias entre pares de geometrías de dos objetos.
puntos_out <- sf::st_difference(aterrizaje_sf,espana_mapa)
print(puntos_out)
Simple feature collection with 118 features and 5 fields
Geometry type: POINT
Dimension: XY
Bounding box: xmin: -8.473414 ymin: 36.99258 xmax: 1.441792 ymax: 43.68347
Geodetic CRS: WGS 84
First 10 features:
osm_id name aeroway emergency operator
1407527932 1407527932 <NA> <NA> <NA> <NA>
1407528020 1407528020 <NA> <NA> <NA> <NA>
1407528022 1407528022 <NA> <NA> <NA> <NA>
2509646017 2509646017 <NA> <NA> <NA> <NA>
2509646027 2509646027 <NA> <NA> <NA> <NA>
2509646039 2509646039 <NA> <NA> <NA> <NA>
2509646040 2509646040 <NA> <NA> <NA> <NA>
2509646041 2509646041 <NA> <NA> <NA> <NA>
2509646042 2509646042 <NA> <NA> <NA> <NA>
2509646043 2509646043 <NA> <NA> <NA> <NA>
geometry
1407527932 POINT (1.34975 43.27219)
1407528020 POINT (1.349756 43.27281)
1407528022 POINT (1.34849 43.27282)
2509646017 POINT (-7.860264 43.68329)
2509646027 POINT (-7.860225 43.68326)
2509646039 POINT (-7.860288 43.68332)
2509646040 POINT (-7.860176 43.68324)
2509646041 POINT (-7.860296 43.68336)
2509646042 POINT (-7.860122 43.68324)
2509646043 POINT (-7.859968 43.68337)
Por tanto, 10 de los puntos representados en el mapa anterior no se corresponden con lo que buscamos.
El siguiente paso realizado ha sido utilizar la función intersection()
. Esta función realiza justo lo contrario a la anterior, y obtendrá la intersección de dos geometrías. La utilizaremos con el fin de quedarnos exclusivamente con aquellos puntos que sí se encuentran dentro de las delimitaciones.
puntos_aterrizajes <- st_intersection(aterrizaje_sf,espana_mapa)
Output
Una vez hemos obtenido la intersección es momento de volver a representar el mapa anterior para comprobar que ya contamos con los puntos correctos.
ggplot() +
ggspatial::annotation_map_tile(type="cartolight", zoom = 7) +
geom_sf(data = puntos_aterrizajes, color = "slategrey", size = 2.5, alpha = 0.5)
Zoom: 7
Ahora sí que aparecen todos los puntos dentro del territorio de España.
Proyecto de Innovación Educativa Emergente (PIEE-2737007)