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.
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)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.
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:
aeroway = aerodrome)landuse = winter_sports)railway = station)aeroway = aerodrome)tourism = camp_site)natural = water +
water = lake/lagoon)leisure = fitness_centre)natural = water +
water = lake/lagoon)railway = station)leisure = fitness_centre)wheelchair)amenity = drinking_water)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:
wheelchair. Este último tópico me toca muy de
cerca al tener familiares cercanos padecientes de dicha
discapacidad.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.
A continuación cargamos los diferentes datos que se usarán en este nivel de agregación:
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)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).
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:
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
#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)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.
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))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.
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.
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.
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))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.
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.
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.
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))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.
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.
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.
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?
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"
)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"
)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"
)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"
# )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 ---
## Total de estaciones registradas: 1680
## Número de variables (columnas): 12
## Nombres de las columnas:
## [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 ---
## Total de farmacias registradas: 119
## Número de variables (columnas): 4
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).
*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.
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.