Datos de universidades de la Comunidad Valenciana

UNIVERSIDADES
OSM
Autor/a
Afiliación

Silvia Miralles Navarro

Universitat de València

Fecha de publicación

1 de abril de 2026

Input

Esta segunda práctica se centra en la obtención y mejora de un conjunto de datos geoespaciales relativo a las universidades localizadas en la Comunidad Valenciana.

Los datos han sido extraídos de la base de datos colaborativa OpenStreetMap mediante la herramienta Overpass Turbo, que permite realizar consultas personalizadas y exportar los resultados en distintos formatos geoespaciales, ya incluyendo las coordenadas geográficas.
En este caso, siguiendo la metodología vista en clase, no ha sido necesario aplicar procesos de geocodificación directa (forward geocoding), ya que las entidades están georreferenciadas en el sistema WGS84 (EPSG:4326).

El conjunto de datos original se ha almacenado en formato GeoJSON dentro de la carpeta “datos” del proyecto, garantizando la reproducibilidad del análisis mediante rutas relativas.

Los datos proceden de OpenStreetMap y se distribuyen bajo la licencia Open Database License (ODbL).

# Librerias que usaremos a lo largo de la práctica:

library(sf) # Manejo de datos espaciales
library(tidyverse) # Manipulación de datos
library(tidygeocoder)  # Geocodificación inversa (reverse geocoding)
library(nominatimlite) # Geocodificación con Nominatim
library(leaflet) # Mapas interactivos
# Cargamos el dataset 
universidades_cv <- st_read("../data/2526020030/universidades_cv.geojson", quiet=T)

Descripción

Antes de limpiar los datos, es conveniente explorar su estructura básica inicial:

dim(universidades_cv)
[1] 108  58
glimpse(universidades_cv)
Rows: 108
Columns: 58
$ id                      <chr> "relation/3007519", "relation/3007521", "relat…
$ X.id                    <chr> "relation/3007519", "relation/3007521", "relat…
$ addr.city               <chr> NA, NA, NA, NA, "València", NA, NA, NA, NA, NA…
$ addr.housenumber        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ addr.postcode           <chr> NA, NA, NA, NA, "46022", NA, NA, NA, NA, NA, N…
$ addr.street             <chr> NA, NA, NA, NA, "Camí de Vera", NA, NA, NA, NA…
$ alt_name                <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ alt_name.ca             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ alt_name.en             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ alt_name.es             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ amenity                 <chr> "university", "university", "university", "uni…
$ building                <chr> "yes", "yes", "yes", NA, NA, "yes", "yes", "ye…
$ building.colour         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ building.levels         <chr> "1", "1", "2", NA, NA, NA, "2", NA, NA, NA, NA…
$ building.material       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ building.part           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ campus                  <chr> NA, NA, NA, NA, "Campus de Vera", NA, NA, NA, …
$ check_date              <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ contact.email           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ designation             <chr> NA, NA, NA, NA, "Campus de Vera (Valencia)", N…
$ education               <chr> "university", "university", "university", "uni…
$ email                   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ fax                     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ height                  <chr> NA, "5", "8", NA, NA, NA, NA, NA, NA, NA, NA, …
$ internet_access         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ internet_access.fee     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ internet_access.ssid    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ isced.2011.level        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ isced.level             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ layer                   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ leisure                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "sports_ce…
$ min.height              <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ name                    <chr> "Rectorado y Servicios Generales", "E.U. de Óp…
$ name.ca                 <chr> NA, NA, "Edifici Polivalent 3", "Campus de Bla…
$ name.en                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ name.es                 <chr> NA, NA, "Edificio Polivalente 3", NA, NA, NA, …
$ name.etymology.wikidata <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Q4985…
$ nohousenumber           <chr> NA, NA, NA, NA, "yes", NA, NA, NA, NA, NA, NA,…
$ official_name           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ opening_hours           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ operator                <chr> NA, NA, NA, "Universitat de València", "Univer…
$ operator.en             <chr> NA, NA, NA, NA, "Polytechnic University of Val…
$ operator.es             <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Universidad d…
$ operator.type           <chr> NA, NA, NA, NA, "public", NA, NA, NA, "public"…
$ phone                   <chr> NA, NA, NA, NA, "+34 96 387 70 00", NA, NA, NA…
$ roof.shape              <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ school.gender           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ short_name              <chr> NA, NA, NA, NA, "UPV", NA, NA, NA, NA, NA, NA,…
$ site                    <chr> NA, NA, NA, "university", NA, NA, NA, NA, NA, …
$ source                  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ toilets.wheelchair      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ type                    <chr> "multipolygon", "multipolygon", "multipolygon"…
$ website                 <chr> NA, NA, NA, NA, "https://www.upv.es/otros/como…
$ wheelchair              <chr> "yes", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ wikidata                <chr> NA, NA, NA, "Q104523211", "Q2003976", NA, NA, …
$ wikipedia               <chr> NA, NA, NA, "ca:Campus de Blasco Ibáñez", "es:…
$ X.geometry              <chr> "center", "center", "center", "center", "cente…
$ geometry                <POINT [°]> POINT (-0.5120483 38.3847), POINT (-0.51…
names(universidades_cv)
 [1] "id"                      "X.id"                   
 [3] "addr.city"               "addr.housenumber"       
 [5] "addr.postcode"           "addr.street"            
 [7] "alt_name"                "alt_name.ca"            
 [9] "alt_name.en"             "alt_name.es"            
[11] "amenity"                 "building"               
[13] "building.colour"         "building.levels"        
[15] "building.material"       "building.part"          
[17] "campus"                  "check_date"             
[19] "contact.email"           "designation"            
[21] "education"               "email"                  
[23] "fax"                     "height"                 
[25] "internet_access"         "internet_access.fee"    
[27] "internet_access.ssid"    "isced.2011.level"       
[29] "isced.level"             "layer"                  
[31] "leisure"                 "min.height"             
[33] "name"                    "name.ca"                
[35] "name.en"                 "name.es"                
[37] "name.etymology.wikidata" "nohousenumber"          
[39] "official_name"           "opening_hours"          
[41] "operator"                "operator.en"            
[43] "operator.es"             "operator.type"          
[45] "phone"                   "roof.shape"             
[47] "school.gender"           "short_name"             
[49] "site"                    "source"                 
[51] "toilets.wheelchair"      "type"                   
[53] "website"                 "wheelchair"             
[55] "wikidata"                "wikipedia"              
[57] "X.geometry"              "geometry"               

Como podemos apreciar, el conjunto de datos original presenta una estructura compleja, con más de 50 variables derivadas del sistema de etiquetado de OpenStreetMap.

Entre estas variables se incluyen atributos de localización (addr.city, addr.street, addr.postcode…), características del edificio (building, building.levels, building.material, building.colour…), así como diferentes denominaciones de las universidades en varios idiomas (name, alt_name, alt_name.es, alt_name.en, alt_name.ca…).

Asimismo, aparecen campos como campus, designation, education o amenity, siendo este último el que permite identificar el tipo de equipamiento (en este caso, universidades).

El dataset también contiene identificadores propios de OpenStreetMap (id, X.id) y presenta una notable heterogeneidad geométrica, incluyendo nodos, vías y relaciones. Esto implica que las entidades pueden estar representadas mediante geometrías puntuales, lineales o poligonales.

Además, se observa una elevada presencia de valores ausentes (NA) en múltiples variables, especialmente en aquellas relacionadas con direcciones o información de contacto, lo que refleja el carácter colaborativo de OpenStreetMap.

El sistema de referencia espacial utilizado es WGS84 (EPSG:4326), estándar en datos geoespaciales y cartografía web.

En conjunto, se trata de un dataset rico en información pero con redundancias, valores faltantes y una estructura heterogénea, lo que hace necesario un proceso de limpieza y mejora.

Tratamiento

En esta fase se realiza un proceso de depuración y mejora del conjunto de datos con el objetivo de simplificar su estructura, aumentar su calidad y facilitar su uso en análisis espaciales posteriores. En primer lugar, se seleccionan las variables más relevantes. Además del nombre de la entidad (name) y su geometría (geometry), se incorporan algunos atributos adicionales relacionados con la localización y caracterización de las universidades, como la ciudad (city), el código postal (postcode) y el campus. Esta selección permite enriquecer el dataset final evitando mantener variables redundantes o con escasa información.

# Selección  de variables relevantes
universidades_cv_selec <- universidades_cv %>%
  select(name, city = "addr.city", postcode = "addr.postcode", campus, geometry)

Como podemos apreciar, universidades_cv_selec devuelve muchos valores NA en city, postcode y campus, los cuales se irán completando para que la base de datos final quede totalmente enriquecida. A continuación, se eliminan los registros sin nombre y se depuran posibles duplicados, garantizando que cada universidad esté representada una única vez.

# Limpieza de datos
universidades_cv_limpio <- universidades_cv_selec %>%
  filter(!is.na(name)) %>%           # eliminamos sin nombre
  distinct(name, .keep_all = TRUE)  # eliminamos duplicados

Este dataset universidades_cv_limpio conserva la misma información que el anterior pero con menos observaciones, al eliminar registros sin nombre o repetidos.

Seguidamente, se transforma la geometría mediante el cálculo de su centroide, representando todas las entidades como puntos. Esto homogeneiza la estructura geométrica y facilita el análisis espacial, especialmente cuando algunas entidades están representadas mediante geometrías más complejas, como polígonos.

# Conversión a puntos (centroides)
universidades_cv_puntos <- st_centroid(universidades_cv_limpio)

Posteriormente, se extraen las coordenadas geográficas (latitud y longitud) a partir de la geometría, lo que permite aplicar técnicas de geocodificación inversa (reverse geocoding).

# Extraer coordenadas
coords <- st_coordinates(universidades_cv_puntos)

universidades_cv_puntos <- universidades_cv_puntos %>%
  mutate(lat = coords[,2], long = coords[,1])

Siguiendo los apuntes de la asignatura, se aplica geocodificación inversa (reverse geocoding), que permite obtener información adicional de localización, como dirección, calle o código postal, enriqueciendo el dataset original. En este caso se utiliza el servicio Nominatim basado en OpenStreetMap, que es el método por defecto del paquete tidygeocoder.

# Reverse geocoding
universidades_cv_geo <- universidades_cv_puntos %>%
  reverse_geocode(lat = lat, long = long, full_results = TRUE)
Passing 88 coordinates to the Nominatim single coordinate geocoder
Query completed in: 89.6 seconds
New names:
• `name` -> `name...1`
• `city` -> `city...2`
• `postcode` -> `postcode...3`
• `name` -> `name...20`
• `city` -> `city...23`
• `postcode` -> `postcode...29`

El dataset universidades_cv_geo contiene un gran número de variables, incluyendo información de la ciudad, tipo de entidad, calle, provincia, código postal y otros elementos que no corresponden a las universidades (como pitch, tree, artwork, clinic…).

Por ello, se filtran únicamente las entidades que corresponden a universidades, seleccionando los registros cuya clasificación en OpenStreetMap indica type = “university” y addresstype = “amenity”. Esto elimina elementos secundarios no relevantes.

# Filtrar solo universidades
universidades_cv_geo2 <- universidades_cv_geo %>%
  filter(
    type == "university",
    addresstype == "amenity")

Finalmente, se seleccionan las variables de interés, manteniendo únicamente la información esencial para el análisis: nombre, coordenadas, calle, provincia y código postal.

universidades_cv_mejorado <- universidades_cv_geo2 %>%
  select(
    name = "name...1",
    lat, long,
    street = road,
    province, 
    postcode = "postcode...29")

Este proceso reduce el dataset inicial de 108 a 52 observaciones y de 58 a 6 variables. La información retenida es muy útil, ya que incluye: el nombre de la universidad, la calle para ubicarla con precisión, la provincia para situarla dentro de la Comunidad Valenciana, el código postal y las coordenadas geográficas (latitud y longitud), fundamentales para análisis espaciales.

Por último, el conjunto de datos limpio y mejorado se exporta en formato gpkg, garantizando su interoperabilidad y facilidad de uso en sistemas de información geográfica.

# Guardamos el resultado en formato GeoPackage
# sf::st_write(universidades_cv_mejorado,"output/universidades_comunidadvalenciana_limpio.gpkg")

Output

Por tanto, como resultado del proceso de limpieza y mejora, se ha obtenido un conjunto de datos simplificado y estructurado, que contiene exclusivamente la información esencial sobre las universidades de la Comunidad Valenciana.

El dataset final presenta una mayor calidad, al haber reducido la redundancia de variables, eliminado valores inconsistentes y homogeneizado tanto la información nominal como la geometría. Además, se ha garantizado la reproducibilidad del análisis mediante el uso de rutas relativas y formatos interoperables adecuados para SIG.

Además de generar el dataset limpio, se incluye un mapa interactivo utilizando leaflet y el paquete nominatimlite. Este mapa permite visualizar de manera más intuitiva y geográficamente precisa la ubicación de cada universidad, mostrando los nombres al hacer clic sobre cada marcador. Así, se complementa la información tabular del GeoPackage con una representación visual que facilita la interpretación espacial del conjunto de datos.

universidades_nomintim <- nominatimlite::reverse_geo_lite(
  lat = universidades_cv_mejorado$lat,
  long = universidades_cv_mejorado$long,
  progressbar = F)

universidades_nomintim <- universidades_nomintim %>%
  dplyr::mutate(name = universidades_cv_mejorado$name)

leaflet(universidades_nomintim) %>%
  leaflet::addTiles() %>%
  leaflet::addMarkers(popup = ~name)
Assuming "lon" and "lat" are longitude and latitude, respectively

El carácter colaborativo de OpenStreetMap implica cierta heterogeneidad y la posible presencia de valores incompletos, lo que pone de manifiesto la importancia de los procesos de limpieza, validación y enriquecimiento en el análisis de datos espaciales.

Por su parte, el uso del formato GeoJSON facilita la integración del dataset en sistemas de información geográfica (SIG) y en diversas herramientas de visualización espacial.

El fichero generado puede descargarse aquí.



Proyecto de Innovación Educativa Emergente (PIEE-3898312)