Crecimiento urbano en Valencia: edificios del Catastro INSPIRE con año de construcción (dataset derivado)

datos-espaciales
urbanismo
catastro
sf
Autor/a
Afiliación

Antonio Richarte

Universitat de València

Fecha de publicación

1 de abril de 2026

Input

Se ha obtenido un conjunto de datos geoespacial de edificios del Catastro en el marco de INSPIRE, concretamente del servicio ATOM Buildings. En esta versión reproducible del documento no se realiza ninguna descarga durante el renderizado: se parte de un fichero ZIP del municipio de Valencia ya almacenado localmente dentro del proyecto.

El recurso original presenta varias limitaciones para su uso directo en análisis urbanos. En primer lugar, se distribuye como un fichero comprimido ZIP que contiene un GML con una estructura relativamente compleja y numerosas variables técnicas. En segundo lugar, la variable de fecha de construcción requiere un proceso de limpieza y normalización antes de poder utilizarse en análisis temporales. Por último, en aplicaciones de estudio del crecimiento urbano suele ser más útil trabajar con un subconjunto espacial centrado en el área urbana de interés que con la totalidad del municipio.

La fuente original es la Dirección General del Catastro, dentro de la infraestructura INSPIRE Buildings. Para garantizar la reproducibilidad desde otro equipo, este documento asume que el ZIP ya forma parte de la carpeta del proyecto.

Descripción

El objetivo de este dataset derivado es ofrecer un fichero geoespacial listo para análisis con los edificios del municipio de Valencia, enriquecido con variables útiles para estudiar el crecimiento urbano.

En concreto, el dataset final incluye:

  • la fecha de construcción normalizada;
  • el año de construcción extraído como variable numérica;
  • una clasificación temporal en intervalos por cuantiles;
  • el área estimada del footprint del edificio;
  • un recorte espacial de los edificios situados en un radio de 3 km alrededor del centro urbano de Valencia.

De esta manera, el fichero generado resulta más sencillo de utilizar que el GML original y está orientado a tareas habituales de análisis espacial, visualización y estudio de la evolución del tejido urbano.

Tratamiento

options(scipen = 999)

library(dplyr)
library(stringr)
library(readr)
library(fs)
library(sf)
library(lubridate)
library(classInt)
library(ggplot2)

dir_raw <- "../data/2526020039/data_raw/catastro"
dir_out <- "../data/2526020039/output"
fs::dir_create(dir_out, recurse = TRUE)

mun <- "VALENCIA"
radio_m <- 3000

# 1) Localizar ZIP ya descargado
zip_path <- fs::path(dir_raw, paste0(mun, ".zip"))

if (!file.exists(zip_path)) {
  stop(
    paste0(
      "No se ha encontrado el ZIP local en: ", zip_path,
      ". Guarda ahí el archivo del municipio de Valencia y vuelve a renderizar."
    )
  )
}

# 2) Descomprimir en carpeta temporal del proyecto
unzip_dir <- fs::path(dir_raw, mun)
fs::dir_create(unzip_dir)

gml_existente <- fs::dir_ls(unzip_dir, recurse = TRUE, regexp = "building\\.gml$")
if (length(gml_existente) == 0) {
  utils::unzip(zip_path, exdir = unzip_dir)
}

# 3) Leer GML
gml_file <- fs::dir_ls(unzip_dir, recurse = TRUE, regexp = "building\\.gml$")
if (length(gml_file) == 0) {
  stop("No se encontró ningún fichero 'building.gml' tras descomprimir el ZIP local.")
}

gml_file <- gml_file[1]
buildings <- sf::st_read(gml_file, quiet = TRUE)

# 4) Limpieza de fecha de construcción
buildings <- buildings %>%
  dplyr::mutate(beginning2 = stringr::str_replace(beginning, "^-", "0000")) %>%
  dplyr::mutate(beginning3 = lubridate::ymd_hms(beginning2, quiet = TRUE)) %>%
  dplyr::mutate(beginning_date = lubridate::as_date(beginning3)) %>%
  dplyr::filter(!is.na(beginning_date)) %>%
  dplyr::mutate(year = lubridate::year(beginning_date))

if (nrow(buildings) == 0) {
  stop("Tras limpiar la fecha de construcción no quedan observaciones válidas.")
}

# 5) Clases temporales por cuantiles
n_classes <- 11
breaks <- classInt::classIntervals(
  var = buildings$year,
  n = n_classes,
  style = "quantile"
)

labels <- names(print(breaks, under = "<", over = ">", cutlabels = FALSE))
style: quantile
     < 1908 1908 - 1922 1922 - 1930 1930 - 1942 1942 - 1955 1955 - 1963 
       3287        3278        2140        4424        2996        3578 
1963 - 1969 1969 - 1974 1974 - 1983 1983 - 1999      > 1999 
       3403        3155        3354        3286        3437 
buildings <- buildings %>%
  dplyr::mutate(
    year_class = cut(
      year,
      breaks$brks,
      labels = labels,
      include.lowest = TRUE
    )
  )

# 6) Recorte espacial en torno al centro de Valencia
centro <- sf::st_as_sf(
  data.frame(lon = -0.37680, lat = 39.46979),
  coords = c("lon", "lat"),
  crs = 4326
)

centro <- sf::st_transform(centro, sf::st_crs(buildings))
buf <- sf::st_buffer(centro, dist = radio_m)
buildings_crop <- suppressWarnings(sf::st_intersection(buildings, buf))

if (nrow(buildings_crop) == 0) {
  stop("El recorte espacial ha dado 0 edificios. Revisa el CRS o el radio del buffer.")
}

# 7) Área y selección de variables finales
out_sf <- buildings_crop %>%
  dplyr::mutate(area_m2 = as.numeric(sf::st_area(geometry))) %>%
  dplyr::transmute(
    gml_id,
    beginning_date,
    year,
    year_class,
    area_m2,
    geometry
  )
# 8) Guardar outputs
out_gpkg <- fs::path(dir_out, "valencia_edificios_crecimiento_urbano.gpkg")
if (file.exists(out_gpkg)) file.remove(out_gpkg)
sf::st_write(out_sf, out_gpkg, quiet = TRUE)
summary_tbl <- out_sf %>%
  sf::st_drop_geometry() %>%
  dplyr::count(year_class, name = "n_edificios") %>%
  dplyr::arrange(year_class)

out_csv <- fs::path(dir_out, "valencia_edificios_resumen_por_clase.csv")
readr::write_csv(summary_tbl, out_csv)

# 9) Objetos a mostrar en el documento
n_edificios <- nrow(out_sf)
crs_salida <- sf::st_crs(out_sf)$input
rango_anios <- range(out_sf$year, na.rm = TRUE)
summary_tbl
    year_class n_edificios
1       < 1908        2108
2  1908 - 1922        1319
3  1922 - 1930        1736
4  1930 - 1942        1498
5  1942 - 1955        1755
6  1955 - 1963        2298
7  1963 - 1969        2369
8  1969 - 1974        1967
9  1974 - 1983        2017
10 1983 - 1999        1929
11      > 1999        1665

Resumen del tratamiento

En esta versión no se realiza ninguna descarga durante el renderizado. El procedimiento parte de un ZIP local ya incorporado al proyecto, lo descomprime, lee el GML con sf, limpia la variable beginning, extrae el año de construcción, genera clases temporales mediante cuantiles y recorta el conjunto a un radio de 3 km alrededor del centro de Valencia. Por último, calcula el área geométrica de cada edificio y guarda un GeoPackage final y un CSV resumen.

Output

Se ha obtenido un dataset derivado en formato GeoPackage con los edificios de Valencia recortados al entorno urbano central y enriquecidos con variables temporales y geométricas. Además, se ha generado un fichero CSV de resumen con el número de edificios por clase temporal.

cat("Número de edificios en el dataset final:", n_edificios, "\n")
Número de edificios en el dataset final: 20661 
cat("Rango temporal (años):", rango_anios[1], "-", rango_anios[2], "\n")
Rango temporal (años): 0 - 2025 
cat("CRS del dataset de salida:", crs_salida, "\n")
CRS del dataset de salida: ETRS89 / UTM zone 30N 
head(out_sf)
Simple feature collection with 6 features and 5 fields
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: 726841.5 ymin: 4369662 xmax: 727314.8 ymax: 4369773
Projected CRS: ETRS89 / UTM zone 30N
                      gml_id beginning_date year  year_class  area_m2
12 ES.SDGC.BU.000200100YJ26H     1920-01-01 1920 1908 - 1922 211.4330
84 ES.SDGC.BU.000301100YJ26H     1920-01-01 1920 1908 - 1922 275.6339
86 ES.SDGC.BU.000301200YJ26H     1940-01-01 1940 1930 - 1942 136.3275
89 ES.SDGC.BU.000301300YJ27B     1880-01-01 1880      < 1908 601.6432
91 ES.SDGC.BU.000301400YJ26H     1950-01-01 1950 1942 - 1955 737.8083
93 ES.SDGC.BU.000301500YJ26H     1970-01-01 1970 1969 - 1974 746.3085
                         geometry
12 POLYGON ((726845.4 4369676,...
84 POLYGON ((727281.2 4369773,...
86 POLYGON ((727032 4369746, 7...
89 MULTIPOLYGON (((727234.6 43...
91 MULTIPOLYGON (((727253.1 43...
93 POLYGON ((727267.5 4369712,...
summary_tbl
    year_class n_edificios
1       < 1908        2108
2  1908 - 1922        1319
3  1922 - 1930        1736
4  1930 - 1942        1498
5  1942 - 1955        1755
6  1955 - 1963        2298
7  1963 - 1969        2369
8  1969 - 1974        1967
9  1974 - 1983        2017
10 1983 - 1999        1929
11      > 1999        1665
ggplot(out_sf) +
  geom_sf(aes(fill = year_class), color = NA) +
  labs(
    title = "Edificios del centro de Valencia por clase temporal de construcción",
    fill = ""
  ) +
  theme_void()

El fichero principal generado con este procedimiento puede descargarse en la carpeta output/valencia_edificios_crecimiento_urbano.gpkg, mientras que el resumen tabular se guarda en output/valencia_edificios_resumen_por_clase.csv.

El/los fichero(s) generados con este procedimiento/técnica/metodología se puede descargar de aquí.



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