Áreas con riesgo potencial significativo de inundación (ARPSI)

Autor/a
Afiliación

Álvaro Rodrigo Fernández

Universitat de València

Fecha de publicación

1 de abril de 2025

Input

El conjunto de datos empleado en esta práctica proviene del portal del Ministerio para la Transición Ecológica y el Reto Demográfico de España (MITECO), específicamente de la sección dedicada a la información geoespacial sobre el riesgo de inundaciones, disponible en su página web. Su descarga esta disponible para descargar en formato Shapefile (.shp)

Esta cartografía recopila las Áreas con Riesgo Potencial Significativo de Inundación (ARPSI), las cuales han sido identificadas mediante la evaluación preliminar del riesgo de inundación realizada por las autoridades competentes en materia de aguas, costas y protección civil. Este proceso responde a las directrices establecidas en la Directiva 2007/60/CE sobre la evaluación y gestión de los riesgos de inundación, así como a su transposición al marco normativo español.

El objetivo principal de este conjunto de datos es proporcionar información clave para la gestión y planificación del territorio, facilitando la identificación de zonas vulnerables y permitiendo la adopción de medidas preventivas y de mitigación frente a eventos extremos. Además, estos datos son de gran utilidad para administraciones públicas, investigadores y otros actores involucrados en la protección del medioambiente y la seguridad ciudadana, ya que contribuyen a mejorar la resiliencia de las poblaciones ante el riesgo de inundaciones.

Descripción

Cargamos las librerías necesarias:

library(tidyverse)
Warning: package 'purrr' was built under R version 4.4.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
Linking to GEOS 3.12.2, GDAL 3.9.3, PROJ 9.4.1; sf_use_s2() is TRUE
library(leaflet)
library(mapSpain)

Leemos el conjunto de datos y transformamos al crm con el que vamos a trabajar.

arpsi <- st_read("data/000132/ARPSIS_2C_Visor_20220624.shp")
Reading layer `ARPSIS_2C_Visor_20220624' from data source 
  `C:\Users\scorp\OneDrive - Universitat de València\01 PROFESOR\06 Innovación Educativa\2023 2024\03 Web\datasets\data\000132\ARPSIS_2C_Visor_20220624.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 2968 features and 28 fields
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: -984155.2 ymin: 3132302 xmax: 1123421 ymax: 4855185
Projected CRS: ETRS89 / UTM zone 30N
arpsi <- sf::st_transform(arpsi, 4326)

Al intentar transformar el conjunto de datos aparecen bastantes warnings. Las advertencias indican que algunas geometrías en arpsi tienen una mezcla de coordenadas en 2D y 3D (es decir, algunas tienen X, Y, Z mientras que otras solo X,Y). Esto puede generar problemas al transformarlas y visualizarlas en leaflet. Por lo que realizamos el siguiente procedimiento para evitarnos complicaciones.

arpsi <- st_zm(arpsi, drop = TRUE, what = "ZM")
arpsi <- sf::st_transform(arpsi, 4326)

Observamos que se trata de un objeto con 2968 observaciones y 29 variables. Vamos a conocer los nombres de las variables:

names(arpsi)
 [1] "CÓDIGO_SU"  "EUUOMCODE"  "DEMARCACIO" "APSFRCode"  "NameofAPSF"
 [6] "LongitudAP" "LAT"        "LON"        "Nº_DE_INU"  "FECHA_ÚLT" 
[11] "EXTENSIÓN"  "CÓDIGO_S_"  "NOMBRE_SUB" "LONGITUD_S" "ORIGEN_INU"
[16] "MECAN_INUN" "CONS_SALUD" "CONS_MA"    "CONS_PCULT" "CONS_ECONO"
[21] "CRIT_SELEC" "NOM_CCAA"   "COD_CCAA"   "COD_DEMAR"  "ESTADO"    
[26] "ORI_INU_ES" "MODIF"      "OBSERV"     "geometry"  

También vamos a ver la estructura del dataframe:

glimpse(arpsi)
Rows: 2,968
Columns: 29
$ CÓDIGO_SU  <chr> "ES064", "ES070/0001-01", "ES070/0001-03", "ES070/0001-02",…
$ EUUOMCODE  <chr> "ES070", "ES070", "ES070", "ES070", "ES070", "ES070", "ES07…
$ DEMARCACIO <chr> "SEGURA", "SEGURA", "SEGURA", "SEGURA", "SEGURA", "SEGURA",…
$ APSFRCode  <chr> "ES070_APSFR_0021", "ES070_APSFR_0001", "ES070_APSFR_0001",…
$ NameofAPSF <chr> "RAMBLAS COSTERAS", "SEGURA", "SEGURA", "SEGURA", "MUNDO", …
$ LongitudAP <dbl> 14.39, 5.54, 5.54, 5.54, 16.44, 16.44, 8.64, 8.64, 8.64, 8.…
$ LAT        <chr> "37.3333", "38.391", "38.391", "38.391", "38.5638", "38.563…
$ LON        <chr> "-1.72411", "-2.03332", "-2.03332", "-2.03332", "-1.62724",…
$ Nº_DE_INU  <dbl> 2, 1, 1, 1, 4, 4, 5, 5, 5, 5, 3, 17, 17, 52, 52, 52, 52, 52…
$ FECHA_ÚLT  <date> 2016-12-15, 2018-05-29, 2018-05-29, 2018-05-29, 2018-05-29…
$ EXTENSIÓN  <chr> "Pulpí, Cuevas de Almanzora, Los Alcázares", "Férez, Socovo…
$ CÓDIGO_S_  <chr> "ES070/0021-09", "ES070/0001-01", "ES070/0001-03", "ES070/0…
$ NOMBRE_SUB <chr> "BARRANCO DE LOS CABALLOS", "SIN NOMBRE (SOCOVOS)", "ARROYO…
$ LONGITUD_S <dbl> 1.30, 1.02, 1.34, 1.68, 2.17, 2.54, 1.18, 3.44, 1.32, 2.70,…
$ ORIGEN_INU <chr> "Fluvial", "Fluvial", "Fluvial", "Fluvial", "Fluvial", "Flu…
$ MECAN_INUN <chr> "Superación natural de la capacidad", "Superación natural d…
$ CONS_SALUD <chr> "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI",…
$ CONS_MA    <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO",…
$ CONS_PCULT <chr> "NO", "NO", "NO", "NO", "NO", "NO", "SI", "SI", "SI", "SI",…
$ CONS_ECONO <chr> "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI",…
$ CRIT_SELEC <chr> "HISTÓRICO", "POTENCIAL", "POTENCIAL", "POTENCIAL", "HISTÓR…
$ NOM_CCAA   <chr> "Andalucía", "Castilla La Mancha", "Castilla La Mancha", "C…
$ COD_CCAA   <int> 61, 42, 42, 42, 42, 42, 62, 62, 62, 62, 62, 62, 62, 62, 62,…
$ COD_DEMAR  <int> 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,…
$ ESTADO     <chr> "APROBADA", "APROBADA", "APROBADA", "APROBADA", "APROBADA",…
$ ORI_INU_ES <chr> "Fluvial / Pluvial", "Fluvial", "Fluvial", "Fluvial", "Fluv…
$ MODIF      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ OBSERV     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ geometry   <MULTILINESTRING [°]> MULTILINESTRING ((-1.679594..., MULTILINEST…

Hay alguna variable que no resulta útil o es redundante (como longitud y latitud) y otras que pese a que nos aportan información valiosa, podrían ser mejor aprovechadas.

Realizamos una primera exploración del mapa para analizar la distribución de las Áreas con Riesgo Potencial Significativo de Inundación (ARPSI). Para ello, utilizamos Leaflet, que permite representar los datos de manera interactiva. Esta previsualización nos ayuda a identificar patrones espaciales y comprender mejor la disposición de las zonas de riesgo.

m <- leaflet(arpsi) %>%
  addTiles() %>%
  addPolylines(color = "darkblue",
               weight = 2,
               opacity = 0.9)

m

Tratamiento

En primer lugar vamos a deshacernos de las variables que no nos resultan importantes y realizar una estandarización de los nombres de los campos.

arpsi <- arpsi %>%
  select(-c(LON, LAT))
  
arpsi <- arpsi %>%
  rename(
    codigo_su = CÓDIGO_SU,
    codigo_euuom = EUUOMCODE,
    demarcacion = DEMARCACIO,
    codigo_apsfr = APSFRCode,
    nombre_apsfr = NameofAPSF,
    longitud_apsfr = LongitudAP,
    num_inundaciones = Nº_DE_INU,
    fecha_ultima = FECHA_ÚLT,
    extension = EXTENSIÓN,
    codigo_subarea = CÓDIGO_S_,
    nombre_subarea = NOMBRE_SUB,
    longitud_subarea = LONGITUD_S,
    origen_inundacion = ORIGEN_INU,
    mecanismo_inundacion = MECAN_INUN,
    impacto_salud = CONS_SALUD,
    impacto_medioambiental = CONS_MA,
    impacto_patrimonio = CONS_PCULT,
    impacto_economico = CONS_ECONO,
    criterio_seleccion = CRIT_SELEC,
    nombre_ccaa = NOM_CCAA,
    codigo_ccaa = COD_CCAA,
    codigo_demarcacion = COD_DEMAR,
    estado = ESTADO,
    origen_inundacion_es = ORI_INU_ES,
    modificaciones = MODIF,
    observaciones = OBSERV,
    geometria_rios = geometry
  )

A continuación, se calcula un índice de vulnerabilidad, basado en distintos tipos de impacto asociados a las inundaciones.

En primer lugar, se transforman varias variables categóricas en valores numéricos. Las columnas impacto_salud, impacto_medioambiental, impacto_economico e impacto_patrimonio contienen información sobre los efectos de las inundaciones en diferentes aspectos. Originalmente, estas variables están representadas con valores “SI” y “NO”, por lo que se usa la función ifelse() para convertir “SI” en 1 y “NO” en 0. Esta conversión es fundamental, ya que permite realizar cálculos matemáticos con estas variables.

Una vez transformadas, se calcula el índice de vulnerabilidad, el cual se obtiene promediando las cuatro variables de impacto. Este índice representa el nivel de vulnerabilidad de cada área en función de la cantidad de impactos presentes. Si una zona tiene los cuatro impactos marcados como “SI”, su índice será 1, lo que indica una alta vulnerabilidad. Por el contrario, si no presenta ninguno, su índice será 0, reflejando una baja vulnerabilidad. Los valores intermedios indican diferentes grados de afectación.

arpsi <- arpsi %>%
  mutate(
    impacto_salud = ifelse(impacto_salud == "SI", 1, 0),
    impacto_medioambiental = ifelse(impacto_medioambiental == "SI", 1, 0),
    impacto_economico = ifelse(impacto_economico == "SI", 1, 0),
    impacto_patrimonio = ifelse(impacto_patrimonio == "SI", 1, 0),
    indice_vulnerabilidad = (impacto_salud + impacto_medioambiental + impacto_economico + impacto_patrimonio) / 4
  )

head(arpsi %>% select(impacto_salud, impacto_medioambiental, impacto_economico, impacto_patrimonio, indice_vulnerabilidad))
Simple feature collection with 6 features and 5 fields
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: -2.103489 ymin: 37.35019 xmax: -1.525219 ymax: 38.57829
Geodetic CRS:  WGS 84
  impacto_salud impacto_medioambiental impacto_economico impacto_patrimonio
1             1                      0                 1                  0
2             1                      0                 1                  0
3             1                      0                 1                  0
4             1                      0                 1                  0
5             1                      0                 1                  0
6             1                      0                 1                  0
  indice_vulnerabilidad                 geometria_rios
1                   0.5 MULTILINESTRING ((-1.679594...
2                   0.5 MULTILINESTRING ((-1.992457...
3                   0.5 MULTILINESTRING ((-2.016726...
4                   0.5 MULTILINESTRING ((-2.099095...
5                   0.5 MULTILINESTRING ((-1.536123...
6                   0.5 MULTILINESTRING ((-1.640345...

Ahora vamos a incluir las geometrías de los municipios afectados por las Áreas con Riesgo Potencial Significativo de Inundación (ARPSI). Estas geometrías corresponden a las áreas geográficas delimitadas de cada municipio.

Primero, se obtiene la información geoespacial de los municipios, seleccionando únicamente los nombres y las geometrías. Luego, identificamos los municipios que intersectan con las Áreas con Riesgo Potencial Significativo de Inundación (ARPSI) utilizando st_intersects().

municipios <- esp_get_munic_siane() %>% select(name)

# Corregimos geometrías no válidas, ya que sino no podemos hacer el st_intersects
municipios <- sf::st_make_valid(municipios)
municipios <- sf::st_transform(municipios, 4326)

mun_arpsi <- municipios[apply(st_intersects(municipios, arpsi, sparse = FALSE), 1, any), ]

mun_arpsi <- sf::st_transform(mun_arpsi, 4326)

Seleccionamos un vector de municipios (vector_muni) extraído de la variable extension en arpsi, el cual contiene nombres de municipios afectados. Dado que algunas observaciones incluyen múltiples municipios en una sola entrada, se separan en filas individuales para obtener las geometrías de cada municipio. Luego, se unen estos municipios con el conjunto previamente filtrado (mun_arpsi) para obtener las geometrías correspondientes.

Las geometrías obtenidas se transforman en objetos de tipo MULTIPOLYGON, después las combinamos y agrupamos de acuerdo con su identificación original en extension. Finalmente, se unen nuevamente con el conjunto arpsi, incorporando las geometrías a la base de datos de áreas de riesgo, lo que permite visualizar y analizar espacialmente qué municipios tienen territorios dentro de zonas con riesgo de inundación.

vector_muni <- arpsi$extension

# vector_muni es un vector de caracteres, lo convertimos en un DataFrame
# y añadimos un identificador único para cada fila original
vector_muni <- data.frame(
  name = vector_muni,
  id = 1:length(vector_muni)  
)

# Separamos los nombres de los municipios en vector_muni, ya que muchas observaciones contienen más de un municipio
vector_muni_expanded <- vector_muni %>%
  separate_rows(name, sep = ", ") %>%  
  distinct()  

# Unimos con mun_arpsi para obtener las geometrías
vector_muni_geom <- vector_muni_expanded %>%
  left_join(mun_arpsi, by = "name")  # Une por la columna "name"
Warning in left_join(., mun_arpsi, by = "name"): Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 39 of `x` matches multiple rows in `y`.
ℹ Row 921 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship =
  "many-to-many"` to silence this warning.
# Geometrías de tipo MULTIPOLYGON
vector_muni_geom <- vector_muni_geom %>%
  mutate(geometry = st_cast(geom, "MULTIPOLYGON"))

# Combinamos las geometrías por grupo original en extension (usando el id)
vector_muni_final <- vector_muni_geom %>%
  group_by(id) %>%  
  summarise(geometry = st_union(geometry)) %>% 
  ungroup()

# Recuperamos los nombres originales de los municipios
vector_muni_final <- vector_muni_final %>%
  left_join(vector_muni %>% select(id, name), by = "id")

# Convertir a objeto sf
vector_muni_final <- st_as_sf(vector_muni_final)
vector_muni_final <- sf::st_transform(vector_muni_final, 4326)

arpsi <- cbind(arpsi, vector_muni_final$geometry)

arpsi <- arpsi %>%
  rename(
    geometria_municipios = geometry)

arpsi$geometria_municipios <- st_cast(arpsi$geometria_municipios, "MULTIPOLYGON")

El siguiente mapa representa zonas de riesgo y municipios afectados en España, utilizando capas de polilíneas y polígonos para visualizar la información espacial. Se observa que los ríos, representados en color azul oscuro, delimitan posibles áreas de peligro, mientras que los municipios afectados aparecen en rojo con bordes negros, permitiendo identificar con claridad las zonas comprometidas. Se ha incorporado un control de capas que permite activar o desactivar la visualización de los diferentes elementos, lo que hace que el mapa sea más interactivo y adaptable a distintos análisis.

map <- leaflet() %>%
  
  addTiles() %>%
  addPolylines(
    data = arpsi$geometria_rios,
    color = "darkblue",  
    weight = 2,
    opacity = 0.9,
    group = "Zonas de riesgo"
  ) %>%

  addPolygons(
    data = arpsi$geometria_municipios,
    fillColor = "red", 
    fillOpacity = 0.5,
    color = "black", 
    weight = 1, 
    opacity = 1,
    group = "Municipios afectados",
  ) %>%
  
  addLayersControl(
    overlayGroups = c("Zonas de riesgo", "Municipios afectados"),
    options = layersControlOptions(collapsed = FALSE)
  )


map

Output

Se ha obtenido un fichero geopackage (.gpkg) que es más completo. Se han eliminado variables innecesarias y se han estandarizado los nombres para hacer el conjunto de datos más claro y manejable. Además, se ha incorporado un índice de vulnerabilidad, que permite evaluar el riesgo de inundación en función de diversos factores como la infraestructura y la densidad poblacional. También se han añadido las geometrías de los municipios afectados, lo que facilita la visualización y análisis espacial de las áreas en riesgo.

Para obtener este fichero, hemos almacenado cada una de las geometrías en una capa, ya que no es posible guardar dos variables que incluyen geometrías en un solo layer.

# Crear dos objetos sf separados para cada geometría
sf_rios <- st_as_sf(arpsi, sf_column_name = "geometria_rios")
sf_municipios <- st_as_sf(arpsi, sf_column_name = "geometria_municipios")

# Eliminar la columna geométrica no utilizada en cada objeto sf
sf_rios <- sf_rios %>% select(-geometria_municipios)
sf_municipios <- st_drop_geometry(arpsi)

file.remove("data/arpsis_20220624.gpkg")
# Guardar en un GeoPackage con dos capas
st_write(sf_rios, "data/arpsis_20220624.gpkg", layer = "rios")
st_write(sf_municipios, "data/arpsis_20220624.gpkg", layer = "municipios")

Por otro lado, se ha creado un archivo .xlsx con información detallada sobre las variables presentes en el conjunto de datos relacionado con las áreas con riesgo potencial de inundación. Este archivo tiene como objetivo proporcionar una mejor comprensión y facilitar la utilización del conjunto de datos, ayudando a los usuarios a interpretar correctamente la información contenida en él.

Los ficheros generados con este procedimiento se pueden descargar de aquí.



Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394