1 Introducción

El presente informe desarrolla un análisis espacial centrado en la extracción, visualización y evaluación de información geográfica obtenida a partir de OpenStreetMap mediante el lenguaje R. A través de cuatro niveles de agregación territorial (nacional, autonómico, provincial y municipal), se examinan la densidad, calidad y los sesgos urbanos inherentes al micromapeo ciudadano. El estudio concluye contrastando estas bases de datos espaciales con registros institucionales oficiales.

2 Selección de los datos geospaciales con OSM.

2.1 Librerías

Antes de hacer uso de las funcionalidades y conjuntos de datos que OpenStreetMap ofrece, se deben instalar y cargar las librerías necesarias para el correcto tratamiento de los datos. Haremos uso de librerías como osmdata para descargar datasets directamente de OSM o ggmap para poder representar mapas base en los distintos niveles de agregación.

Mediante el siguiente código nos aseguramos de ello:

librerias <- c("tidyverse", "sf", "mapSpain", "osmdata", "ggmap", "ggspatial", "prettymapr")
librerias_instaladas <- librerias %in% rownames(installed.packages())
if (any(librerias_instaladas == F)) {install.packages(librerias[!librerias_instaladas])}
invisible(lapply(librerias, library, character.only = T))
rm(librerias, librerias_instaladas)

2.2 Visualización de etiquetas

Una vez cargados los paquetes y con el objetivo de seleccionar algunos conjuntos de datos de todos los que ofrece OSM, realizamos la siguiente consulta:

osm_features <- osmdata::available_features()

# Como se imprimen más de 300 elementos por pantalla, selecciono los primeros 10 para que sirva a modo de ejemplo.
head(osm_features, 10)
##  [1] "4wd_only"                "abandoned"              
##  [3] "abutters"                "access"                 
##  [5] "addr"                    "addr:*"                 
##  [7] "addr:city"               "addr:conscriptionnumber"
##  [9] "addr:country"            "addr:county"

El resultado es un vector de más de 300 etiquetas mediante las que podemos filtrar datos de OSM. De esta forma he podido hacerme una idea de la variedad que este programa ofrece y esto me ha permitido seleccionar datasets según mis preferencias.

2.3 Temas escogidos.

Para llevar a cabo el análisis multi-escala, se han seleccionado las siguientes temáticas y etiquetas (tags) para cada nivel de agregación:

  • Nivel 1: País (España)
    • Aeropuertos (aeroway = aerodrome)
    • Estaciones de esquí (landuse = winter_sports)
    • Infraestructura ferroviaria (railway = station)
  • Nivel 2: Comunidad Autónoma (Castilla-La Mancha)
    • Aeropuertos (aeroway = aerodrome)
    • Campings (tourism = camp_site)
    • Lagos y lagunas (natural = water + water = lake/lagoon)
  • Nivel 3: Provincia (Albacete)
    • Gimnasios (leisure = fitness_centre)
    • Lagos y lagunas (natural = water + water = lake/lagoon)
    • Infraestructura ferroviaria (railway = station)
  • Nivel 4: Municipio (Albacete Capital)
    • Gimnasios (leisure = fitness_centre)
    • Equidad espacial y accesibilidad en Farmacias (cruzado con wheelchair)
    • Confort climático: Fuentes de agua potable (amenity = drinking_water)

2.4 Justificación y objetivos del análisis.

La elección de los datasets mencionados no ha sido aleatoria, sino que he querido dar peso a mis preferencias personales en relación con alguna temática y además, he buscado establecer relaciones espaciales entre las diferentes escalas administrativas:

  • Análisis de Infraestructuras (Macro vs. Micro): Se comparará la densidad de aeropuertos comerciales y aerodromos y la red ferroviaria a nivel nacional (España) frente a la distribución autonómica (Castilla-La Mancha) y provincial (Albacete). Esto permitirá identificar patrones de centralización y conectividad. Por otro lado, ambos temas son de especial interés para mi puesto que he sido usuario frecuente tanto de aeropuertos en España por ser estudiante Erasmus como de la estructura ferroviaria al estudiar fuera del domicilio familiar.
  • Análisis Medioambiental: Se evaluará la distribución de masas de agua (lagos y lagunas) contrastando la escala regional con la provincial. Tras residir toda mi vida en Albacete conozco varios espacios de este tipo que quiero contrastar.
  • Dinámicas Urbano-Rurales: Mediante la variable de instalaciones deportivas (gimnasios), se buscará evidenciar la concentración de servicios en la capital frente a los posibles “desiertos de servicios” en los municipios rurales de la provincia. Conozco ya de antemano numerosos gimnasios en la provincia de Albacete y quiero contrastar esa información mediante este trabajo.
  • Equidad y Confort Urbano: A escala municipal, el análisis se centrará en el ciudadano, evaluando la distribución de fuentes de agua potable (refugios climáticos) y realizando un análisis de accesibilidad para personas con movilidad reducida cruzando la etiqueta wheelchair. Este último tópico me toca muy de cerca al tener familiares cercanos padecientes de dicha discapacidad.

3 Carga de los datasets e información obtenida.

3.1 País: España

Mediante el siguiente código se obtiene el cuadro delimitador de España sin las islas Canarias para evitar representar el tramo del oceano Atlántico que separa la península Ibérica de estas.

bbox_spain <- c(-10, 35, 5, 45)

A continuación cargamos los diferentes datos que se usarán en este nivel de agregación:

3.1.1 Aeropuertos

En la práctica he descargado los datos desde OSM con las funciones que en el siguiente código están comentadas. Al intentar renderizar todo mi RMarkdown para entregar la práctica, me está dando problemas. Voy a trabajar con los archivos .gpkg que me he descargado.

#q1_aero <- opq(bbox_spain, timeout = 3600) %>% add_osm_feature("aeroway", "aerodrome")

# Descarga de los datos en línea de OSM
#l1_aero_osm <- osmdata::osmdata_sf(q1_aero)

l1_aero_osm <- sf::st_read("N1_Aeropuertos.gpkg", quiet = TRUE)
  • Tipo de geometría: Tras analizar el objeto l1_aero_osm, se conoce que la descarga generó 23.619 puntos (osm_points), 88 líneas (osm_lines), 463 polígonos (osm_polygons) y 19 multipolígonos (osm_multipolygons). Dado que las infraestructuras aeroportuarias de gran tamaño se modelizan espacialmente como polígonos por su gran extensión, se ha optado por extraer el objeto $osm_polygons (que consta de 463 observaciones). Si quisieramos representarlo gráficamente, se calcularía su centroide matemático (st_centroid) para transformarlos en geometrías de tipo POINT.
# Obtención de las diferentes variables.
#names(l1_aero_osm$osm_polygons)

names(l1_aero_osm)
# Valores faltantes

#sum(is.na(l1_aero_osm$osm_polygons$iata))
sum(is.na(l1_aero_osm))
  • Variables Obtenidas: La extracción ha devuelto un data.frame espacial compuesto por 180 variables. Entre las más destacadas para la caracterización de estas infraestructuras se encuentran atributos identificativos como el nombre (name), los códigos aeronáuticos (iata e icao, por los cuales se filtraría con tal de conocer cuantos son aeropuertos comerciales), el operador de la instalación (operator, p. ej., Aena), la elevación del terreno (ele) y la presencia de conectividad internacional (international_flights). Además, existe una gran cantidad de campos destinados a información de contacto (contact:phone, contact:website) y traducciones del nombre a múltiples idiomas (name:en, name:ca, name:es).

  • Datos Faltantes (NAs): La variable clave utilizada para diferenciar los aeropuertos comerciales de los aeródromos privados o deportivos ha sido el código de la Asociación Internacional de Transporte Aéreo (iata). Al analizar esta variable en los 463 polígonos extraídos, se han contabilizado 383 valores faltantes (NA). Esto indica que la inmensa mayoría de las superficies etiquetadas como aerodrome en OSM corresponden a pequeñas pistas de aterrizaje, aeródromos forestales o militares que carecen de código comercial, permitiendo así un filtrado preciso de la red de interés. Se observan también altos porcentajes de valores nulos en variables cualitativas secundarias como la accesibilidad física (wheelchair) o el año de inicio de operaciones (start_date).

3.1.2 Estaciones de esquí

Cargo los datos:

#q1_ski <- opq(bbox_spain, timeout = 3600) %>% add_osm_feature("landuse", "winter_sports")
#l1_ski <- osmdata_sf(q1_ski)
#names(l1_ski$osm_polygons)
#sum(is.na(l1_ski$osm_polygons))

l1_ski <- sf::st_read("N1_Estaciones_Esqui.gpkg", quiet = TRUE)

Obtengo información sobre variables y NAs:

names(l1_ski)
sum(is.na(l1_ski))
  • Tipo de geometría: Al explorar el objeto descargado (l1_ski), se observa una enorme desagregación geométrica: 6.041 puntos, 164 líneas, 85 polígonos y 9 multipolígonos. Para este conjunto de datos se ha seleccionado la geometría de polígonos ($osm_polygons, con 85 observaciones). La justificación espacial radica en la propia naturaleza de la etiqueta principal utilizada: landuse (uso del suelo). Una estación de esquí no es una infraestructura puntual, sino una vasta extensión de terreno montañoso que engloba pistas, remontes y servicios. Por tanto, el polígono es la única geometría capaz de representar con fidelidad la huella espacial, el área ocupada y los límites reales del dominio esquiable.

  • Variables Obtenidas: El objeto espacial extraído se compone de 64 variables (columnas). Analizando la estructura de los datos, destacan variables descriptivas de la topografía y el uso deportivo, tales como ele (elevación), aerialway (presencia de infraestructuras de transporte por cable como telesillas o telecabinas), sport y descriptores específicos de las pistas como piste:type, piste:difficulty o piste:grooming (estado de preparación de la nieve). También se recogen atributos administrativos y de contacto (operator, website, name).

  • Valores faltantes: Teniendo en cuenta que el conjunto consta de 85 polígonos y 64 variables (lo que supone un total de 5.440 campos de información posibles) y muestra 4953 valores vacíos, esto evidencia que aproximadamente el 91% de la tabla de atributos está vacía. Mientras que la delimitación geométrica y el nombre de la estación (name) presentan una alta tasa de completitud, los atributos más técnicos o de gestión (aerialway:capacity, wheelchair, operator) rara vez son documentados por los usuarios

3.1.3 Infraestructura ferroviaria

#q1_tren <- opq(bbox_spain, timeout = 3600) %>% add_osm_feature("railway", "station")
#l1_trenes <- osmdata_sf(q1_tren)
#names(l1_trenes$osm_points)
#sum(is.na(l1_trenes$osm_points))

l1_trenes <- sf::st_read("N1_Estaciones_Tren.gpkg", quiet = TRUE)
names(l1_trenes)
sum(is.na(l1_trenes))
  • Tipo de Geometría: La consulta inicial devuelve una variedad de elementos geométricos, incluyendo 504 polígonos (generalmente correspondientes a las marquesinas o edificios principales de las grandes terminales). Sin embargo, para este análisis se ha seleccionado deliberadamente el objeto $osm_points, que contiene 9.456 observaciones. Modelizar las infraestructuras de transporte como puntos es la aproximación más rigurosa para estudios de conectividad, densidad y topología de red, evitando el solapamiento visual y la carga computacional que supondrían los polígonos.

  • Variables Obtenidas: La extracción ha generado un data.frame espacial de una complejidad altísima, con 316 variables. Destacan atributos esenciales para el análisis de infraestructuras como name, identificadores internacionales como uic_ref (código de la Unión Internacional de Ferrocarriles), la electrificación de la vía (electrified), la red a la que pertenece (network), y el gestor de la misma (operator, típicamente Adif, Renfe o equivalentes autonómicos). La tabla también revela el nivel de micro-mapeo que permite OSM, incluyendo columnas extremadamente específicas documentadas por los colaboradores, tales como la presencia de desfibriladores (defibrillator:location), accesibilidad (wheelchair, tactile_paving), o incluso la existencia de pianos públicos (piano).

  • Datos Faltantes (NAs): Al evaluar los valores faltantes globales, se contabilizan 2.938.959 NAs. Teniendo en cuenta las dimensiones de la matriz (9.456 observaciones por 316 variables, lo que arroja 2.988.096 campos totales), se concluye que el 98,35% de la tabla de atributos está vacía.

3.2 Comunidad autónoma: Castilla-La Mancha

Para este nivel de agregación se analizará la información obtenida de forma más resumida y en un solo bloque de código.

clm <- esp_get_ccaa("Castilla-La Mancha", epsg = "4326")
bbox_clm <- st_bbox(clm)

# Carga de datos

# Aeropuertos
#q2_aero <- opq(bbox_clm, timeout = 3600) %>% 
 #   add_osm_feature(key = "aeroway", value = "aerodrome")
#l2_aero_osm <- osmdata_sf(q2_aero)
l2_aero_osm <- sf::st_read("N2_Aeropuertos.gpkg", quiet = TRUE)

# Campings  
#q2_camp <- opq(bbox_clm, timeout = 3600) %>% 
#  add_osm_feature(key = "tourism", value = "camp_site")
#l2_camp_osm <- osmdata_sf(q2_camp)
l2_camp_osm <- sf::st_read("N2_Campings.gpkg", quiet = TRUE)

# Lagos y lagunas  
#q2_lagos <- opq(bbox_clm, timeout = 3600) %>% 
#  add_osm_feature(key = "natural", value = "water") %>% 
#  add_osm_feature(key = "water", value = c("lake", "lagoon"))
#l2_lagos_osm <- osmdata_sf(q2_lagos)
l2_lagos_osm <- sf::st_read("N2_Lagos.gpkg", quiet = TRUE)
# Información sobre variables
names(l2_aero_osm)
sum(is.na(l2_aero_osm))
names(l2_camp_osm)
sum(is.na(l2_camp_osm))
names(l2_lagos_osm)
sum(is.na(l2_lagos_osm))

3.2.1 Aeropuertos

Al delimitar territorialmente el conjunto de datos a Castilla-La Mancha se aprecia una drástica reducción en la infraestructura aeroportuaria pasando de 463 aeropuertos y aerodromos a nivel nacional a tan solo 63 polígonos posibles en el nivel autonómico. Además, también se ha visto disminuido el número de variables a 73, evidenciando una menor variedad de etiquetas en esta región frente al total nacional. Se conservan las variables estructurales necesarias para el análisis: el nombre (name) y, fundamentalmente, el código comercial iata. El recuento de valores nulos asciende a 4.130 NAs.

3.2.2 Campings

Se han descargado 120 polígonos. Para la representación y análisis de infraestructuras turísticas como los campings, el uso del polígono es estrictamente necesario para poder comprender las dimensiones físicas que presentan. Estas 120 observaciones comprenden hasta 84 variables de las que se pueden destacar los identificadores de turismo (tourism), el nombre de la instalación (name) y diversas variables relativas al contacto y servicio web (website, phone). Se identificaron 9.011 valores nulos, lo que representa aproximadamente un 89,4% de escasez de datos (sobre un total de 10.080 campos posibles). Como ya se ha explicado en datasets previos, esto se debe a que OSM son servidores abiertos para usuarios y estos no suelen preocuparse por completar todas las etiquetas posibles.

3.2.3 Lagos y lagunas

Se han devuelto 752 polígonos. A escala regional, modelizar los cuerpos de agua como superficies (POLYGON) es el único enfoque metodológico válido, ya que permite estudios de morfología espacial. Aparecen 45 variables siendo los campos principales name y la categorización de la masa de agua recogida en water = lake o lagoon. El conjunto de datos hídricos presenta 30.247 NAs, es decir, un 89,4% de datos faltantes.

3.3 Provincia: Albacete

El procedimiento es el mismo:

alba_prov <- esp_get_prov("Albacete", epsg = "4326")
bbox_alba <- st_bbox(alba_prov)

# Gimnasios
#q3_gym <- opq(bbox_alba, timeout = 3600) %>% 
#  add_osm_feature("leisure", "fitness_centre")
#l3_gym_osm <- osmdata_sf(q3_gym)
l3_gym_osm <- sf::st_read("N3_Gimnasios.gpkg", quiet = TRUE)

# Lagos y lagunas
#q3_lagos <- opq(bbox_alba, timeout = 3600) %>% 
#    add_osm_feature("natural", "water") %>% 
#    add_osm_feature("water", c("lake", "lagoon"))
#l3_lagos_osm <- osmdata_sf(q3_lagos)
l3_lagos_osm <- sf::st_read("N3_Lagos.gpkg", quiet = TRUE)

# Estructura ferroviaria
#q3_tren <- opq(bbox_alba, timeout = 3600) %>% 
#    add_osm_feature("railway", "station")
#l3_tren_osm <- osmdata_sf(q3_tren)
l3_tren_osm <- sf::st_read("N3_Estaciones_Tren.gpkg", quiet = TRUE)
names(l3_gym_osm)
sum(is.na(l3_gym_osm))
names(l3_lagos_osm)
sum(is.na(l3_lagos_osm))
names(l3_tren_osm)
sum(is.na(l3_tren_osm))

3.3.1 Gimnasios

Para el análisis a escala provincial se ha optado por extraer la geometría de puntos ($osm_points), arrojando un total de 136 observaciones. Representar las instalaciones deportivas como puntos es la técnica óptima para medir la dispersión territorial que puede haber en zonas más rurales frente a la posible concentración de centros deportivos en el núcleo urbano albaceteño. Los datos presentan un total de 32 variables de las que se pueden destacar la etiqueta principal leisure o el nombre del establecimiento name. Al igual que todos los datasets que se han cargado previamente, el porcentaje de valores vacíos es alto con 3651 NAs.

3.3.2 Lagos y lagunas

Se han cargado 166 polígonos a diferencia de los 752 en la escala regional. También se han visto reducidas las variables a tan solo 16 y los NAs totales a 1827.

3.3.3 Infraestructura ferroviaria

La extracción devolvió 84 puntos con 18 variables ($osm_points) frente a las más de 9000 observaciones posibles a nivel nacional. Se registraron 1.256 valores faltantes, lo que se traduce en un 83,1% de la tabla vacía (sobre 1.512 campos posibles). En una provincia como Albacete, con un fuerte componente de patrimonio ferroviario histórico, muchas de estas 84 estaciones corresponden a apeaderos antiguos o líneas clausuradas.

3.4 Municipio: Albacete

alba_mun <- esp_get_munic(region = "Albacete", munic = "Albacete", epsg = "4326")
bbox_mun <- st_bbox(alba_mun)
  
# Gimnasios
#q4_gym <- opq(bbox_mun, timeout = 3600) %>% add_osm_feature("leisure", "fitness_centre")
#l4_gym_osm <- osmdata_sf(q4_gym)
l4_gym_osm <- sf::st_read("N4_Gimnasios.gpkg", quiet = TRUE)

# Farmacias
#q4_farma <- opq(bbox_mun, timeout = 3600) %>% add_osm_feature("amenity", "pharmacy")
#l4_farma_osm <- osmdata_sf(q4_farma)
l4_farma_osm <- sf::st_read("N4_Farmacias.gpkg", quiet = TRUE)

# Fuentes de agua
#q4_agua <- opq(bbox_mun, timeout = 3600) %>% add_osm_feature("amenity", "drinking_water")
#l4_agua_osm <- osmdata_sf(q4_agua)
l4_agua_osm <- sf::st_read("N4_Fuentes_Agua.gpkg", quiet = TRUE)
names(l4_gym_osm)
sum(is.na(l4_gym_osm))
names(l4_farma_osm)
sum(is.na(l4_farma_osm))
names(l4_agua_osm)
sum(is.na(l4_agua_osm))

3.4.1 Gimnasios

En el entorno estrictamente municipal, se han extraído 68 puntos ($osm_points), lo que es curioso porque es justamente la mitad de los gimnasios que se habían extraído para toda la provincia (136). Esto deja claro que la mayoría de gimnasios se encuentran el núcleo urbano. Se ha generado una matriz de 25 variables y se han contabilizado hasta 1200 NAs, lo que representa hasta un 70% de campos vacíos. Se observa así una ligera mejoría en la completitud de los datos.

3.4.2 Farmacias

También se trabajarán con puntos (106) puesto que la geolocalización exacta de estos equipamientos sanitarios básicos es el pilar metodológico para cruzar su ubicación con la variable de accesibilidad. Se obtuvo una tabla muy acotada de 20 variables donde destacan atributos esenciales como amenity, el nombre comercial (name), los horarios de guardia (dispensing) y la variable cualitativa crítica para este estudio: la accesibilidad física (wheelchair, con valores yes, no o limited). Por otro lado, este es el conjunto de datos más robusto y completo de todo el análisis. Con 1.373 NAs sobre un total de 2.120 campos (106 observaciones x 20 variables), la tasa de datos faltantes desciende al 64,8%. No obstante, el principal reto analítico residirá en aislar los valores nulos que recaigan específicamente sobre la variable wheelchair, ya que la falta de etiquetado sobre la existencia de rampas o escalones en ciertas farmacias introduce un sesgo de incertidumbre en el mapa de equidad ciudadana.

3.4.3 Fuentes de agua potable

La consulta extrajo una sorprendente densidad de 251 puntos que forman parte de una tabla de atributos que consta de 21 variables. Al tratarse de un mobiliario urbano tan específico, las etiquetas se reducen al identificador principal (amenity), y ocasionalmente a descripciones sobre su ubicación exacta en un parque. El recuento global arroja 4.051 valores nulos.

4 Representación gráfica

No he podido hacer uso de la función annotation_map_tile para gráficar el mapa base en cada nivel de agregación puesto que me crasheaba el programa y no renderizaba los mapas. ¿Puede que sea problema de almacenamiento del ordenador?

4.1 Nivel 1: País

Para el nivel nacional he escogido representar gráficamente la red de estaciones e infraestructuras ferroviarias por toda la península y las islas Baleares. Las islas Canarias han quedado fuera puesto que para poder representarlas gráficamente se pierde una gran dimensión de espacio en el mapa debido al tramo del oceano Atlántico que las separan de la península.

# Descargo el molde de la península y las islas Baleares para usarlo de fondo
peninsula_base <- esp_get_country(moveCAN = FALSE, resolution = "20", epsg = "4326")

# Intersecto los trenes con la base del mapa de España para que no se dibujen puntos por Portugal, Sur de Francia etc.
trenes_solo_espana <- st_intersection(l1_trenes, peninsula_base)
  
  # Dibujo el mapa
  ggplot() +
    geom_sf(data = peninsula_base, fill = "#f2f2f2", color = "darkgray", linewidth = 0.5) +
    geom_sf(data = trenes_solo_espana, color = "#005A9C", size = 0.5, alpha = 0.6) +
    # Recorto el encuadre
    coord_sf(xlim = c(-9.5, 4.5), ylim = c(35.5, 44), expand = FALSE) +
    theme_void() + 
    labs(
      title = "Nivel 1: Red de Infraestructura Ferroviaria en España",
      subtitle = "Península y Baleares",
      caption = "Datos: OpenStreetMap | Cartografía base: mapSpain"
    )

4.2 Nivel 2: Comunidad autónoma

Para la representación visual a escala autonómica he escogido las masas de agua tales como lagos, lagunas o embalses en Castilla-La Mancha con tal de representar polígonos con su morfología exacta. * ¡NOTA!: En el código he aplicado un grosor en el trazo de los polígonos mayor con tal de que se puedan visualizar bien las distintas masas de agua, pues sin este eran apenas perceptibles frente a la vasta extensión territorial de la Comunidad Autónoma. Con esto busco explicar que los poligonos representados no tienen ese tamaño en la realidad.

# Realizo la intersección. El mapa base de CLM ya lo había cargado previamente.
lagos_solo_clm <- st_intersection(l2_lagos_osm, clm)

ggplot() +
    geom_sf(data = clm, fill = "#f2f2f2", color = "darkgray", linewidth = 0.6) +
    # Tus lagos perfectamente recortados
    geom_sf(data = lagos_solo_clm, color = "mediumblue", linewidth = 1.5) +
    # Tema limpio tipo póster sin coordenadas
    theme_void() +
    labs(
      title = "Nivel 2: Masas de agua en Castilla-La Mancha",
      subtitle = "Lagos y lagunas (Geometrías recortadas al límite autonómico)",
      caption = "Datos: OpenStreetMap | Cartografía base: mapSpain | Filtrado: st_intersection"
    )

4.3 Nivel 3: Provincia

La visualización a escala provincial revela una concentración extrema de la distribución de los gimnasios en el término municipal de Albacete capital. Desde el punto de vista del análisis de datos espaciales, esto no refleja necesariamente la realidad comercial de la provincia (puesto que núcleos poblacionales importantes como Hellín o Almansa cuentan con estas infraestructuras), sino que evidencia un sesgo urbano consecuencia de que OSM esté construido por voluntarios. Las áreas metropolitanas concentran un mayor número de usuarios activos y mapeadores en OpenStreetMap, generando una sobrerrepresentación de datos urbanos frente a un “desierto cartográfico” en las áreas rurales, las cuales sufren una notable brecha digital en este tipo de plataformas colaborativas.

l3_gym_points <- l3_gym_osm
  
# Intersección espacial
gimnasios_solo_alba <- st_intersection(l3_gym_points, alba_prov)
  
ggplot() +
    geom_sf(data = alba_prov, fill = "#f2f2f2", color = "darkgray", linewidth = 0.6) +
    geom_sf(data = gimnasios_solo_alba, color = "#FF8C00", size = 1.5, alpha = 0.8) +
    theme_void() +
    labs(
      title = "Nivel 3: Distribución de Gimnasios en la Provincia de Albacete",
      subtitle = "Concentración de servicios deportivos urbanos frente a dispersión rural",
      caption = "Datos: OpenStreetMap | Cartografía base: mapSpain | Filtrado: st_intersection"
    )

4.4 Nivel 4: Municipio

La representación a escala municipal de las farmacias en Albacete revela dos patrones clave:

  • Aglomeración Centro-Periferia: Existe una altísima concentración de equipamientos en el núcleo urbano consolidado, frente a una cobertura mínima y muy dispersa en las extensas áreas periféricas del municipio.

  • El reto del Micromapeo (VGI): Al evaluar la accesibilidad física (wheelchair), destaca visualmente la gran cantidad de puntos “Sin documentar” (NAs en gris). Esto evidencia un sesgo clásico en OpenStreetMap: los usuarios geolocalizan eficientemente el local comercial, pero omiten registrar información detallada sobre barreras arquitectónicas (como los escalones de entrada).

He tenido que comentar el visual porque no me carga el RMarkdown.

farmacias_alba_puntos <- sf::st_transform(l4_farma_osm, 4326)


  #ggplot() +
    # 1. El mapa de fondo. Zoom 14 suele ser perfecto para ver calles sin saturar.
    #ggspatial::annotation_map_tile(type = "cartolight", zoom = 15) +
    
    # 2. Tus farmacias
    #geom_sf(data = farmacias_alba_puntos, aes(color = wheelchair), size = 1, alpha = 0.9) +
    
    # 3. Colores
    #scale_color_manual(
     # values = c("yes" = "#229E6B", "no" = "#D9534F", "limited" = "#F0AD4E"),
     # na.value = "gray70", 
     # name = "Acceso Silla de Ruedas",
     # labels = c("yes" = "Sí", "no" = "No", "limited" = "Limitado", "NA" = "Sin documentar")
    #) +
    
    # 4. Temas y estilo
    #theme_void() +
    #theme(
      #legend.position = "bottom",
      #plot.title = element_text(size = 14, face = "bold", hjust = 0),
      #plot.subtitle = element_text(size = 11, hjust = 0),
      #plot.margin = margin(10, 10, 10, 10)
   # ) +
   # labs(
   #   title = "Nivel 4: Accesibilidad en Farmacias de Albacete Capital",
   #   subtitle = "Análisis de equidad espacial y barreras arquitectónicas",
    #  caption = "Datos: OpenStreetMap | Mapa base: CartoLight"
   # )

5 Contraste de los datos con fuentes alternativas

En primer lugar, cargo:

  • Los datos relacionados con la infraestructura ferroviaria a nivel nacional extraídos del Portal de Datos Abiertos de Renfe (data.renfe.com).

  • Los datos representativos del total de farmacias en Albacete extraídos del Portal de Datos Abiertos de Castilla-La Mancha.

library(readr)
library(readxl)

# Cargo los datos
renfe_oficial <- read_csv2("estaciones.csv")

# Obtengo información clave para contrastar 
cat("--- DATOS OFICIALES: RENFE ---\n")
## --- DATOS OFICIALES: RENFE ---
cat("Total de estaciones registradas:", nrow(renfe_oficial), "\n")
## Total de estaciones registradas: 1680
cat("Número de variables (columnas):", ncol(renfe_oficial), "\n")
## Número de variables (columnas): 12
cat("Nombres de las columnas:\n")
## Nombres de las columnas:
print(colnames(renfe_oficial))
##  [1] "CODIGO"      "DESCRIPCION" "LATITUD"     "LONGITUD"    "DIRECION"   
##  [6] "CP"          "POBLACION"   "PROVINCIA"   "PAIS"        "CERCANIAS"  
## [11] "FEVE"        "COMUN"
# Repito con las farmacias
farmacias_oficial <- read_excel("FARMACIAS ALBACETE.xlsx")
cat("\n--- DATOS OFICIALES: COLEGIO DE FARMACÉUTICOS / SESCAM ---\n")
## 
## --- DATOS OFICIALES: COLEGIO DE FARMACÉUTICOS / SESCAM ---
cat("Total de farmacias registradas:", nrow(farmacias_oficial), "\n")
## Total de farmacias registradas: 119
cat("Número de variables (columnas):", ncol(farmacias_oficial), "\n")
## Número de variables (columnas): 4

5.1 Infraestructura Ferroviaria Nacional (OSM vs. Datos Abiertos Renfe)

  • Volumen y Alcance Territorial: La consulta a OSM devolvió 9.456 puntos, mientras que el dataset oficial descargado del portal de Renfe contabiliza únicamente 1.680 estaciones. Esta abismal diferencia se explica por la naturaleza del dato: Renfe solo publica su red comercial activa (Cercanías, FEVE, Media y Larga Distancia). Por el contrario, OSM incluye redes autonómicas (FGC, Euskotren), metros, tranvías y, de forma muy notable, patrimonio ferroviario (estaciones clausuradas o líneas abandonadas), lo que hace a OSM mucho más útil para estudios geográficos históricos.

  • Estructura de Variables: El archivo de Renfe presenta 12 variables altamente estructuradas y estandarizadas (código postal, población, provincia, indicadores booleanos de red), sin valores nulos. OSM generó 316 variables con un 98% de NAs, fruto del micromapeo libre.

  • Geometría e Interoperabilidad: La fuente oficial requiere un preprocesamiento espacial. Al ser un archivo tabular (CSV), las coordenadas se entregan en dos columnas de texto (LATITUD, LONGITUD), obligando al analista a proyectar los datos manualmente con funciones como st_as_sf(). En contraste, el paquete osmdata devuelve las infraestructuras con su topología espacial nativa (POINT).

5.2 Farmacias en Albacete Capital (OSM vs. Registro Oficial / SESCAM)

  • *Completitud del Censo: El registro oficial en formato Excel (.xlsx) certifica la existencia de 119 farmacias operativas en el municipio. Nuestra extracción comunitaria de OSM logró capturar 106 farmacias. Esto evidencia una cobertura de VGI del 89%, un dato excelente, pero que revela la latencia de OpenStreetMap a la hora de actualizarse frente a licencias o aperturas de nuevos negocios de forma inmediata.

  • Riqueza de Atributos: El Excel oficial es extremadamente espartano, contando con apenas 4 variables básicas de contacto (Poblacion, farmacia, direccion, telefono). OSM, aun con menor número de registros, aporta una tabla de 20 variables que incluye metadatos de alto valor analítico para el urbanismo, como la accesibilidad física (wheelchair) o los horarios detallados de apertura (opening_hours).

  • Dificultades de Mapeo (El “Secuestro Espacial”): La principal barrera detectada en la fuente oficial es la carencia total de coordenadas. Para representar en un mapa las 119 farmacias oficiales, el analista está obligado a realizar un proceso de geocodificación masiva (transformar la cadena de texto de la “dirección” en coordenadas X/Y mediante APIs de terceros). Este proceso es lento, propenso a errores por ambigüedades en el callejero y a menudo requiere pago por uso. OSM soluciona este cuello de botella entregando el nodo cartográfico directo.

6 Conclusión Final de la Práctica

El análisis multicriterio y multiescalar realizado a lo largo de este documento demuestra que no existe una fuente de datos espaciales perfecta. Los repositorios oficiales garantizan la veracidad censal y jurídica (como las 119 farmacias exactas), pero a menudo fallan en la interoperabilidad técnica y la riqueza descriptiva. Por su parte, OpenStreetMap se consolida como una herramienta de un valor incalculable para la Geografía y los SIG, ofreciendo inmediatez cartográfica, variables cualitativas avanzadas y una granularidad urbana excepcional, asumiendo a cambio el reto analítico de lidiar con la dispersión de atributos (NAs) y el sesgo espacial de la colaboración voluntaria.