Datos de las universidades de Isla de Francia
Input
Como este proyecto trata sobre la mejora de datos espaciales, en la anterior práctica detecté un error; Se trata de las universidades del territorio de la Isla de Francia, donde se sitúa la región parisina. Como hice mi erasmus en esta ciudad, decidí geolocalizar los principales atractivos para un estudiante internacional para elegir su destino erasmus: transporte público, restaurantes, ocio nocturno, y por supuesto, universidades.
Como veremos más adelante, hay una universidad que la sitúa al sur de Francia, por lo que a la hora de poner en el mapa estos equipamientos el mapa no se enfoca en el territorio analizado. Por lo que el objetivo de esta práctica es eliminar este punto para mejorar la precisión de la visualización y asegurar que el mapa refleje únicamente las universidades situadas dentro del área de estudio.
La base de datos proviene de OSM
, por lo que contiene información geoespacial de acceso libre y colaborativo, aportada por voluntarios y bajo la licencia Open Database License.
Descripción
Primero que todo, cargamos las librerías necesarias.
Definimos el área de estudio.
bbox_fr <- osmdata::getbb("Île-de-France, France")
Ahora obtenemos los datos geoespaciales de las universidades y los transformamos en formato sf
para poder tratarlos como datos espaciales. Por último, extraemos las geometrías de tipo punto y las almacenamos en el objeto uni_fr_sf
.
q5 <- bbox_fr %>%
osmdata::opq(timeout=3000) %>%
osmdata::add_osm_feature(key = "amenity", value = "university")
uni_fr <- osmdata_sf(q5)
uni_fr_sf <- uni_fr$osm_points
Antes de poner estos datos en un mapa, vamos a analizarlos.
Se ha obtenido un df
con 6027 filas y 120 columnas. Dicho de otra forma, hemos obtenido 6027 universidades con 120 variables que las describen. Ahora vamos a ver el nombre de las columnas de nuestro df
y ver qué información extra nos aportan.
colnames(uni_fr_sf)
[1] "osm_id" "name"
[3] "access" "addr:city"
[5] "addr:full" "addr:housename"
[7] "addr:housenumber" "addr:postcode"
[9] "addr:street" "alt_name"
[11] "amenity" "artist:wikidata"
[13] "artist:wikipedia" "artist_name"
[15] "artwork_subject" "artwork_type"
[17] "barrier" "bicycle"
[19] "board_type" "brand"
[21] "brand:wikidata" "brand:wikipedia"
[23] "camera:direction" "camera:mount"
[25] "camera:type" "check_date"
[27] "collection_times" "colour"
[29] "community" "community:fr"
[31] "contact:city" "contact:email"
[33] "contact:housenumber" "contact:phone"
[35] "contact:postcode" "contact:street"
[37] "contact:website" "crossing"
[39] "crossing:island" "crossing:markings"
[41] "defibrillator:location" "denomination"
[43] "department" "description"
[45] "direction" "disused:addr:housenumber"
[47] "door" "email"
[49] "emergency" "entrance"
[51] "faculty" "fee"
[53] "fixme" "foot"
[55] "height" "highway"
[57] "historic" "horse"
[59] "indoor" "information"
[61] "inscription" "inscription:fr"
[63] "inscription:fr:1" "inscription:fr:2"
[65] "internet_access" "layer"
[67] "level" "locked"
[69] "man_made" "material"
[71] "maxwidth" "maxwidth:physical"
[73] "memorial" "memorial:conflict"
[75] "motor_vehicle" "motorcar"
[77] "motorcycle" "name:de"
[79] "name:en" "note"
[81] "office" "old_name"
[83] "opening_hours" "operator"
[85] "operator:type" "operator:wikidata"
[87] "operator:wikipedia" "parking"
[89] "person:date_of_death" "phone"
[91] "photo" "power"
[93] "ref" "ref:FR:FINESS"
[95] "ref:FR:SIRET" "ref:UAI"
[97] "religion" "school:FR"
[99] "short_name" "source"
[101] "source:name" "source:ref:UAI"
[103] "start_date" "support"
[105] "surveillance" "surveillance:type"
[107] "survey" "tactile_paving"
[109] "tourism" "traffic_calming"
[111] "training" "turnstile"
[113] "type:FR:FINESS" "university"
[115] "vehicle" "waste"
[117] "website" "wheelchair"
[119] "wikidata" "wikimedia_commons"
[121] "wikipedia" "geometry"
Se puede ver que df
cuenta con muchas columnas que pueden resultar de interés para un análisis. Sin embargo, contamos con muy pocos datos en estas columnas, pues carece de mucha información y cuenta con muchos NA.
Hay un total de 707360 datos d datos faltantes, lo que es un número muy alto si tenemos en cuenta que en total el df está formado de 723240 datos (6027 filas x 120 columnas). Esto se debe a la naturaleza de OSM, que como se ha dicho antes, son datos recopilados de forma colaborativa y voluntaria, por lo que muchas universidades no cuentan con información completa en todas sus columnas.
Ahora comprobamos que todos los datos tienen geometría.
sum(is.na(st_geometry(uni_fr_sf)))
[1] 0
No hay ningún punto que no tenga geometría.
Ahora sí, vamos a situar los puntos obtenidos en un mapa.
leaflet(data = uni_fr_sf) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
radius = 5,
color = "#1f78b4",
stroke = TRUE,
weight = 1,
fillOpacity = 0.8,
popup = ~paste("ID:", osm_id) # Muestra el ID de OSM en un popup
)
Se puede ver que hay un punto situado fuera del territorio analizado, en este caso, al sur de Francia. Dicho de otra manera, hay una universidad que está situada fuera del territorio de la Isla de Francia.
Tratamiento
En la sección anterior hemos detectado un punto situado fuera de la zona de interés. Esto podría afectar a los análisis geográficos de esta base de datos, ya que la distribución geográfica de estos puntos varía. En este apartado vamos a eliminar este punto para situar de forma correcta todas las universidades.
Primero que todo, definimos de forma manual los límites de la región de Isla de Francia para luego poder hacer la intesección con los puntos que ya hemos obtenido.
Nos aseguramos de que los puntos tengan el mismo sistema de coordenadas.
uni_fr_sf <- st_transform(uni_fr_sf, crs = 4326)
Hacemos la intersección de los puntos con el polígono de la Isla de Francia.
uni_fr_idf <- st_intersection(uni_fr_sf, idf_bbox)
Por último, volvemos a hacer un mapa para comprobar que hemos eliminado el punto.
leaflet(data = uni_fr_idf) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
radius = 5,
color = "#1f78b4",
stroke = TRUE,
weight = 1,
fillOpacity = 0.8) %>%
addMiniMap(toggleDisplay = TRUE)
Sin embargo, si nos acercamos al área, aún se pueden ver algunos puntos que se sitúan fuera de el territorio, más concretamente en las ciudades de Chartres y Vernon. Entonces, vamos a eliminar también estos puntos.
Este código filtra y elimina de uni_fr_idf
los puntos cuya longitud está entre 1.4 y 1.6 y cuya latitud está entre 48.4-48.5 (Chartres) o 49.0-49.2 (Vernon), asegurando que solo queden universidades dentro del territorio.
uni_fr_idf <- uni_fr_idf %>%
filter(!(st_coordinates(.)[,1] > 1.4 & st_coordinates(.)[,1] < 1.6 &
st_coordinates(.)[,2] > 48.4 & st_coordinates(.)[,2] < 48.5)) %>%
filter(!(st_coordinates(.)[,1] > 1.4 & st_coordinates(.)[,1] < 1.6 &
st_coordinates(.)[,2] > 49.0 & st_coordinates(.)[,2] < 49.2))
Output
Visualizamos el mapa resultante.
leaflet(data = uni_fr_idf) %>%
addProviderTiles(providers$CartoDB.Positron) %>% # Mapa base moderno
addCircleMarkers(
radius = 5,
color = "#1f78b4",
stroke = TRUE,
weight = 1,
fillOpacity = 0.8,
popup = ~paste("ID:", osm_id) # Muestra el ID de OSM en un popup
) %>%
addMiniMap(toggleDisplay = TRUE)
Como se puede comprobar, se han eliminado los puntos fuera del territorio. Por esta razón la zona de estudio está centrada, ya que hemos eliminando la universidad que se situaba fuera del territorio, permitiendo que el mapa se ajuste mejor a la área de interés. También se ha añadido el mapa pequeño situado al borde inferior para poder situarnos y navegar mejor.
Guardamos los datos en formato GPKG
.
sf::st_write(uni_fr_idf, "uni_fr_idf.gpkg")
El/los fichero(s) generados con este procedimiento/técnica/metodología se puede(n) descargar de aquí.
Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394