Este trabajo analiza los riesgos de inundación en la Comunidad Valenciana utilizando mapas interactivos y diversos indicadores, como el Riesgo Inundación, el Riesgo Integrado y el Riesgo PATRICOVA. Estos indicadores evalúan los posibles daños en propiedades, población, economía y ecosistemas debido al cambio climático. Además, se visualizan datos sobre la distribución de la población y las viviendas, destacando la concentración en el litoral. Los riesgos se presentan para resaltar su gravedad sin aplicar descuentos, ofreciendo una perspectiva informada sobre los posibles impactos.
En este trabajo analizaremos por encima diversos indicadores de riesgo de inundación para el territorio de la Comunidad Valenciana.
Llamamos Riesgo Inundación al mapa de riesgos del daño anual en propiedades inmobiliarias según distintos escenarios. Es decir, el porcentaje del capital inmobiliario municipal afectado por inundaciones si no se aplican medidas de adaptación al cambio climático. En concreto, cogemos el escenario 3, que se caracteriza por suponer un horizonte temporal de 50 años y tener en cuenta el aumento del nivel del mar según el criterio de RCP4.5.
Posteriormente, nos referimos al Riesgo Integrado como un índice para evaluar daños por erosión e inundación costera en población, economía, patrimonio y ecosistemas terrestres. Es decir, tiene en cuenta muchos más factores que el anterior, que solo afecta al capital inmobiliario municipal. También se tiene en cuenta el mismo escenario (horizonte temporal 50 años y aumento del nivel del mar) para mantener la coherencia.
Ambos indicadores de riesgo se presentan “sin descuento”, es decir, sin aplicar un ajuste que tenga en cuenta el valor del dinero a través del tiempo o la preferencia demporal. Se muestran como valor completo. Esto se hace con tal de mostrar la gravedad de la posible situación. En ningún momento se pretende tener una visión catastrofista.
Finalmente, el indicador más interesante como opinión subjetiva, es el que llamamos Riesgo PATRICOVA. Aquí, se calcula el riesgo de inundación en un territorio combinando dos factores: la peligrosidad de las inundaciones (probabilidad de que ocurran) y la vulnerabilidad del suelo (daño potencial en las posibles areas afectadas). En el leafmap del final del trabajo, es interesante pinchar sobre el “Riesgo Patricova” y buscar nuestro pueblo a través de la lupa para ver si está dentro de la zona considerada con riesgo, o no.
Código
# Sf de Valencia (SI EL CÓDIGO NO VA, PONER UN VALOR MÁS ELEVADO EN RESOLUCIÓN Y MÁS BAJO EN Z)valencia_sf <- giscoR::gisco_get_nuts(year ="2016",epsg ="4326",resolution ="1",nuts_level ="2",country ="ES") %>%filter(NUTS_ID =="ES52")# Elevaciónvalencia_elevacion <-get_elev_raster(locations = valencia_sf, z =9,clip ="locations") # Convertir a dfelevation_df <-as.data.frame(valencia_elevacion, xy =TRUE) %>%na.omit() %>%setNames(c("x", "y", "elevation"))# Mapaggplot() +geom_tile(data = elevation_df, aes(x = x, y = y, fill = elevation)) +theme(axis.text =element_blank(),axis.title =element_blank(),axis.ticks =element_blank(),legend.position ="none",panel.grid =element_blank(),plot.title =element_text(size=18, hjust=1),panel.background =element_rect(fill ="white"),plot.margin =margin(0, 0, 0, 0) )
2. Población y Viviendas
En este apartado, dado que los datos relativos a los riesgos se calculan teniendo en cuenta, entre otras variables, la población y las viviendas, se realizará una visualización de datos sobre la vivienda y la población municipal de la Comunidad Valenciana.
2.1 Treemap Interactivo
En este treemap realizado con el paquete d3treeR y treemap, se puede apreciar de manera interactiva la población de la Comunidad Valenciana distribuida entre las 3 provincias principales y estas, a su vez, subdivididas entre todos sus municipios. Esto ayuda a hacernos una idea de dónde se concentra la mayor parte de la población.
Sin duda, este gráfico ha sido el más sencillo de hacer con diferencia en comparación a los demás. El único inconveniente que he encontrado ha sido que se generaba tanto el treemap normal como el interactivo. Se ha solucionado dividiendo el código en 2 chunks y poniendo el atributo fig.show: “hide” para el treemap normal.
d3tree2(p,rootname ="Habitantes por municipios de la Comunidad Valenciana (5.316.541)",height ="800px",width ="100%")
2.2 Tabla Interactiva
Esta tabla nos muestra un gráfico de la evolución de la población por cada municipio de la Comunidad Valenciana. Podemos buscar el municipio que queramos y ver su evolución de la población. Encontramos de todo: tanto municipios que han aumentado su población, como municipios que han ido disminuyendo su población.
Finalmente, podemos visualizar aquí la cantidad total de viviendas primarias y secundarias de cada municipio. Es interesante ver cómo la mayoría se concentra en el territorio litoral, cercano a la costa. De estos datos, y también con la ayuda de los anteriores, podemos sacar la conclusión de que la mayor concentración poblacional está en el litoral.
Para realizar mi gráfico, me he inspirado en este. Para dejar algún comentario extra, este ha sido el gráfico más aburrido de hacer en cuanto a lo tedioso que ha sido manejar los datos, al no estar de manera idonea para realizar un left_joint.
Código
# 1.DESCARGAR DATOS#url_ce <- "https://bdo.gva.es/bdo/res_optimo_static.php?cons=V2868_C1D3002&idioma=cas&form=pcaxis"destino_ce <-"./datos/censo.px"#curl::curl_download(url_ce, destino_ce)# 2. IMPORTAR DATOSdf_ce <- pxR::read.px(destino_ce) %>%as_tibble() %>% janitor::clean_names()# 3. LIMPIEZA DE DATOSdf_ce <- df_ce %>% dplyr::filter(tipo_de_vivienda_viviendas_principales_no_principales =="Total") %>%slice(-1:-37) %>%mutate(municipios =sub("^[0-9]{5} - ", "", municipios),municipios =stri_trans_general(municipios, "latin-ascii") )# 3.1. cambio manual del nombre de los municipios para hacer el left joint ya que solo hay el nombre como variable común.df_ce <- df_ce %>%mutate(municipios =case_when( municipios =="Elx / Elche"~"Elche / Elx", municipios =="Alacant / Alicante"~"Alicante / Alacant", municipios =="Xixona / Jijona"~"Jijona / Xixona", municipios =="Alcoi / Alcoy"~"Alcoy / Alcoi", municipios =="Moixent / Mogente"~"Mogente / Moixent", municipios =="Xodos / Chodos"~"Chodos / Xodos", municipios =="Useres, les / Useras"~"Useras / Useres, les", municipios =="Castelló de la Plana"~"Castellon de la Plana / Castello de la Plana", municipios =="Almassora"~"Almazora", municipios =="Suera / Sueras"~"Sueras / Suera", municipios =="Xilxes / Chilches"~"Chilches / Xilxes", municipios =="Nàquera/Náquera"~"Naquera", municipios =="Alfarb"~"Alfarp", municipios =="Castelló"~"Villanueva de Castellon", municipios =="Genovés, el"~"Genoves", municipios =="Novetlè"~"Novele / Novetle", municipios =="Vila Joiosa, la / Villajoyosa"~"Villajoyosa / Vila Joiosa, la", municipios =="Orxa, l' / Lorcha"~"Lorcha / Orxa, l'", municipios =="Alcosser"~"Alcocer de Planes", municipios =="Torre de les Maçanes, la / Torremanzanas"~"Torremanzanas / Torre de les Macanes, la", municipios =="Fageca"~"Facheca", municipios =="Camp de Mirra, el / Campo de Mirra"~"Campo de Mirra / Camp de Mirra, el", municipios =="Xàbia / Jávea"~"Javea / Xabia", municipios =="Poble Nou de Benitatxell, el / Benitachell"~"Benitachell / Poble Nou de Benitatxell, el", municipios =="Orpesa / Oropesa del Mar"~"Oropesa del Mar / Orpesa", municipios =="Vilafranca / Villafranca del Cid"~"Villafranca del Cid / Vilafranca",TRUE~ municipios ))#- Recordatorio de que he tardado más en buscar y cambiar manualmente los pueblos que en hacer el gráfico :')# 4.CONSIGO LAS GEOMETRIAS DE LOS MUNICIPIOS GRACIAS A MAPSPAIN munis <- mapSpain::esp_get_munic()munis <- munis %>%filter(ine.ccaa.name =="Comunitat Valenciana")munis <- munis %>%mutate(name =stri_trans_general(name, "latin-ascii"))# 5. HAGO EL LEFT JOIN CON UN NUEVO PAQUETE PARA NO TENER QUE CAMBIAR A MANO 100 PUEBLOS. ESTE PAQUETE APROXIMA LOS NOMBRES AUNQUE NO SEAN 100% IGUALES.munis_ce <-stringdist_join( munis %>%mutate(name =tolower(name) %>% stringi::stri_trans_general("Latin-ASCII")), df_ce %>%mutate(municipios =tolower(municipios) %>% stringi::stri_trans_general("Latin-ASCII")),by =c("name"="municipios"),method ="jw",max_dist =0.1,distance_col ="dist",mode ="left") %>%filter(dist <=0.1) %>% dplyr::select(name, value, geometry) %>% sf::st_as_sf()munis_ce <- munis_ce %>%filter(duplicated(name) ==FALSE)# 6. POR FIN, EL PLOTplot_muni <-ggplot(data = munis_ce) +geom_sf(aes(fill = value), linewidth =0.0001, alpha =0.9, color ="white") +scale_fill_fermenter(name ="Número de Viviendas",breaks =c(100, 500, 1000, 5000, 10000, 50000, 100000, 400000),labels =c("", "500", "", "5.000", "", "50.000", "", "400.000"), direction =1,palette ="YlGnBu") +labs(title ="Viviendas por Municipio en la Comunidad Valenciana",subtitle ="Año 2021",caption ="Datos: IVE | Autor: Marius Bulat | bulat@alumni.uv.es",caption.vjust =10 ) +theme_map() +theme(legend.title =element_blank(),legend.position ="top",legend.justification =0.5,legend.key.size =unit(1.25, "cm"),legend.key.width =unit(1.5, "cm"),legend.text =element_text(size =10),legend.margin =margin(),plot.title =element_text(size =20, hjust =0.5, face ="bold"),plot.subtitle =element_text(hjust =0.5, size =18, face ="plain"),plot.caption =element_text(hjust =0.5, size =10, face ="italic"))plot_muni
3. Mapa Interactivo
El Mapa Interactivo hecho con leaflet es sin duda alguna la parte central y principal de este trabajo. Es el que más tiempo ha llevado de todos con bastante diferencia.
Este mapa se ha inspirado del visor.gva.es. El objetivo era recrear un visor geográfico que mostrase ciertos datos de interés actuales en R, pero de modo más simple, minimalista e intuitivo.
Hay varias opciones para facilitar y agilizar el uso del mapa. Para empezar, abajo a la izquierda vemos un botón con el ícono de una casa, que sirve para centrar en el mapa la Comunidad Valenciana en caso de que nos hayamos perdido buscando cosas y queremos volver rápidamente al punto de partida.
Para continuar, arriba a la izquierda se incorpora una lupa para buscar el pueblo/ciudad/calle que queramos para ver si está en una zona de riesgo, y si lo está, ver qué tipo de riesgo es.
Para finalizar, arriba a la derecha vemos un rectángulo donde podemos seleccionar tres estilos del mapa: si lo queremos ver simple, normal o realista.
Ahora solo queda estar unos cuantos minutos viendo qué correlaciones podemos encontrar, buscar nuestro pueblo, explorar los datos y un largo etcétera. ¡Anímate! Realmente es curioso y divertido.
Para acceder al mapa en pantalla completa, pulsa aquí.
Código
#- Datos RAWvalencia <-esp_get_ccaa(ccaa ="Comunidad Valenciana")df <-st_read("./datos/inundacion.gpkg")df_1 <-st_read("./datos/integrado.gpkg")df_2 <-read_sf("./datos/patricova.shp")#- Datos TIDY#- % daño efectivo anual propiedades / stock capital. T=100. Horizonte 2050 + ^NVM (lvl Mar)df_inu <- df %>% dplyr::select(cod_ine, provincia, municipio, porcperd_e3) %>% dplyr::rename(geometry = geom) %>%mutate(porcperd_e3 =round(porcperd_e3, 4)) %>%drop_na()df_inu <- df_inu %>%mutate(percentil =ntile(porcperd_e3, 4)) %>%relocate(percentil, .after = porcperd_e3)df_inu <- df_inu %>%mutate(riesgo =case_when( percentil ==1~"Bajo", percentil ==2~"Moderado", percentil ==3~"Moderado-Alto", percentil ==4~"Alto")) %>%relocate(riesgo, .before = geometry)color_inu <-colorFactor(palette =c("darkgreen", "yellow", "orange", "red"),domain = df_inu$percentil)#- Riesgo Inundacion Integrado. T=100 + ^NVM. Horizonte 2050.df_int <- df_1 %>% dplyr::select(cod_ine, provincia, municipio, riesgo_e3) %>% dplyr::rename(geometry = geom) %>%drop_na()df_int <- df_int %>%mutate(percentil =case_when( riesgo_e3 =="Bajo"~1, riesgo_e3 =="Moderado"~2, riesgo_e3 =="Moderado-Alto"~3, riesgo_e3 =="Alto"~4, )) %>%relocate(percentil, .before = geometry)color_int <-colorFactor(palette =c("darkgreen", "yellow", "orange", "red"),domain = df_int$percentil)#- Riesgo inundacion territorio. Peligrosidad inu + vulnerabilidad suelo. PATRICOVA prevención riesgo.df_pat <- df_2 %>% dplyr::select(leyenda, geometry) %>%drop_na() %>% dplyr::rename(riesgo = leyenda)df_pat <- df_pat %>%mutate(percentil =case_when( riesgo =="Muy Bajo"~1, riesgo =="Bajo"~2, riesgo =="Medio"~3, riesgo =="Alto"~4, riesgo =="Muy Alto"~5, )) %>%relocate(percentil, .before = geometry)color_pat <-colorFactor(palette =c("darkgreen", "yellow", "orange", "red", "black"),domain = df_pat$percentil)rm(df, df_1, df_2, df_3)#- Capas del mapakapas <-c("Zona DANA", "Riesgo Inundación", "Riesgo Integrado", "Riesgo PATRICOVA")#- Transformar datos para que funcione (no se por que pero hay que hacerlo)df_inu <-st_transform(df_inu, crs =4326)df_int <-st_transform(df_int, crs =4326)df_pat <-st_transform(df_pat, crs =4326)#- EL MAPAcapas <-leaflet() %>%addProviderTiles(providers$CartoDB.Positron, group ="Simple") %>%addTiles(group ="Normal") %>%addProviderTiles(providers$Esri.WorldImagery, group ="Realista") %>%addLayersControl(baseGroups =c("Simple", "Normal", "Realista"), options =layersControlOptions(collapsed =FALSE)) %>%onRender(" function(el, x) { var controls = document.getElementsByClassName('leaflet-control-layers')[0]; var title = document.createElement('div'); title.className = 'leaflet-control-title'; title.innerHTML = '<b>Estilo del mapa:</b>'; controls.prepend(title); // Estilo control de capas controls.style.border = '2px solid blue'; controls.style.backgroundColor = 'rgba(255, 255, 255, 1)'; // Fondo blanco semitransparente controls.style.borderRadius = '8px'; // Bordes redondeados controls.style.padding = '5px'; // Espaciado interno } " ) %>%#- EasyButton "centrar"addEasyButton(easyButton(icon ="fa-home",position ="bottomleft",title ="CENTRAR",onClick =JS("function(btn, map) { map.setView([39.5, -0.75], 7); }") )) %>%onRender(" function(el, x) { var btn = document.querySelector('.easy-button-button'); btn.style.border = '2px solid blue'; btn.style.backgroundColor = 'rgba(255, 255, 255, 1)'; } ") %>%#- CapasaddLayersControl(baseGroups =c("Simple", "Normal", "Realista"),overlayGroups = kapas, options =layersControlOptions(collapsed =FALSE ) ) %>%hideGroup(kapas) %>%#- Capa DANA (MODIFICADA 1/04/2025 razon: ya no iba el código antiguo porque llamaba al area de la dana desde un servicio de internet que parece que ya no va)addWMSTiles(baseUrl ="https://terramapas.icv.gva.es/00_DANA2024",layers ="DANA2024.ZonasInundadas.HuellaInundacion",options =WMSTileOptions(format ="image/png", transparent =TRUE),group ="Zona DANA" ) %>%addLayersControl(baseGroups =c("Simple", "Normal", "Realista"),overlayGroups = kapas, options =layersControlOptions(collapsed =FALSE ) ) %>%hideGroup(kapas) %>%#- Capa InundacionaddPolygons(data = df_inu,fillColor =~color_inu(percentil),color ="black",opacity =1,weight =2, fillOpacity =0.5,group ="Riesgo Inundación",label =~riesgo) %>%addLegend("bottomright", pal = color_inu, values = df_inu$percentil, title ="Cuartiles Riesgo: 1 = Bajo",opacity =1,group ="Riesgo Inundación",className ="info legend inundación-legend") %>%onRender(" function(el, x) { var map = this; // Ocultar la leyenda inicialmente var legend = document.querySelector('.inundación-legend'); if (legend) { legend.style.display = 'none'; } } ") %>%#- Capa Riesgo IntegradoaddPolygons(data = df_int,fillColor =~color_int(percentil),color ="black",opacity =1,weight =2, fillOpacity =0.5,group ="Riesgo Integrado",label =~riesgo_e3) %>%addLegend("bottomright", pal = color_int, values = df_int$percentil, title ="Cuartiles Riesgo: 1 = Bajo",opacity =1,group ="Riesgo Integrado",className ="info legend integrado-legend") %>%onRender(" function(el, x) { var map = this; // Ocultar la leyenda inicialmente var legend = document.querySelector('.integrado-legend'); if (legend) { legend.style.display = 'none'; } } ") %>%#- Riesgo PATRICOVAaddPolygons(data = df_pat,fillColor =~color_pat(percentil),color =~color_pat(percentil),opacity =1,weight =2, fillOpacity =0.5,group ="Riesgo PATRICOVA",label =~riesgo) %>%addLegend("bottomright", pal = color_pat, values = df_pat$percentil, title ="Quintiles Riesgo: 1 = Muy Bajo",opacity =1,group ="Riesgo PATRICOVA",className ="info legend patricova-legend") %>%onRender(" function(el, x) { var map = this; // Ocultar la leyenda inicialmente var legend = document.querySelector('.patricova-legend'); if (legend) { legend.style.display = 'none'; } } ") %>%#- Polígono ValenciaaddPolygons(data = valencia, color ="#000000", weight =3, opacity =1, fillOpacity =0) %>%#- Añadir Lupa para buscaraddSearchOSM(options =searchOptions(hideMarkerOnCollapse =TRUE, position ="topleft"))#- Visualizar:capassaveWidget(capas, "mapa_riesgos.html", selfcontained =TRUE)
4. Conclusiones
Vamos a ver algunas conclusiones que pueden sacarse de todo lo anterior:
Al activar la capa Riesgo PATRICOVA y la capa Zona DANA, podemos ver como la mayoría de la zona afectada, ya estaba bajo indicadores de riesgo según el análisis realizado por el PATRICOVA.
Viendo las zonas que marca el Riesgo Integrado y el Riesgo Inundación, podemos entender por encima el posible daño que puede realizar el aumento del nivel del mar, dentro del escenario estático del análisis, a todas las viviendas y habitantes de la zona litoral (gráfico 2.3).
En el caso particular de mi pueblo, si activamos la capa Riesgo PATRICOVA y buscamos con la lupa Ondara, podemos ver varias zonas marcadas con diferentes riesgos. En las zonas marcadas en amarillo y negro, se sabe que hace algunas décadas efectivamente hubo una inundación en esa zona.
¿Qué conclusiones puedes sacar tú con toda esta información?
Información sobre la sesión
Abajo muestro mi entorno de trabajo y paquetes utilizados
---title: | Análisis de diversos riesgos sobre el territorio de la Comunidad Valencianadescription: | Breve visualización de datos sobre el riesgo territorial a la comunidad valencianaabstract: Este trabajo analiza los riesgos de inundación en la Comunidad Valenciana utilizando mapas interactivos y diversos indicadores, como el Riesgo Inundación, el Riesgo Integrado y el Riesgo PATRICOVA. Estos indicadores evalúan los posibles daños en propiedades, población, economía y ecosistemas debido al cambio climático. Además, se visualizan datos sobre la distribución de la población y las viviendas, destacando la concentración en el litoral. Los riesgos se presentan para resaltar su gravedad sin aplicar descuentos, ofreciendo una perspectiva informada sobre los posibles impactos.author:- name: Marius Bulat (bulat.alumni@uv.es) affiliation: Universitat de València affiliation-url: https://www.uv.esdate: todaycategories: [trabajo BigData, riesgo, patricova] format: html: self-contained: true highlight-style: a11y page-layout: full fontcolor: black embed-resources: true title-block-banner: "#060270"title-block-style: default title-block-banner-color: whitecode-fold: trueeval: truewarning: falseerror: false message: false---## Librerías y Obtención de DatosLos datos se han obtenido a través del [portal de datos abiertos](https://portaldadesobertes.gva.es/es/){target="_blank"} de la generalitat valencian, del [INE](https://ine.es/){target="_blank"} y del [IVE](https://pegv.gva.es/es/censos-de-poblaci%C3%B3-i-habitatges-2021){target="_blank"}.Aquí se pueden ver las librerías usadas en el trabajo.```{r}library(leaflet)library(leaflet.extras)library(mapSpain)library(tidyverse)library(sf)library(htmlwidgets)library(elevatr)library(terra)library(giscoR)library(treemap)library(pxR)library(d3treeR)library(reactable)library(base64enc)library(scales)library(stringi)library(ggthemes)library(fuzzyjoin)```## 1. IntroducciónEn este trabajo analizaremos por encima diversos indicadores de riesgo de inundación para el territorio de la **Comunidad Valenciana**.Llamamos **Riesgo Inundación** al mapa de riesgos del daño anual en propiedades inmobiliarias según distintos escenarios. Es decir, el porcentaje del capital inmobiliario municipal afectado por inundaciones si no se aplican medidas de adaptación al cambio climático. En concreto, cogemos el escenario 3, que se caracteriza por suponer un horizonte temporal de 50 años y tener en cuenta el aumento del nivel del mar según el criterio de [RCP4.5](https://es.wikipedia.org/wiki/Trayectorias_de_concentraci%C3%B3n_representativas){target="_blank"}.Posteriormente, nos referimos al **Riesgo Integrado** como un índice para evaluar daños por erosión e inundación costera en población, economía, patrimonio y ecosistemas terrestres. Es decir, tiene en cuenta muchos más factores que el anterior, que solo afecta al capital inmobiliario municipal. También se tiene en cuenta el mismo escenario (horizonte temporal 50 años y aumento del nivel del mar) para mantener la coherencia.Ambos indicadores de riesgo se presentan "sin descuento", es decir, sin aplicar un ajuste que tenga en cuenta el valor del dinero a través del tiempo o la preferencia demporal. Se muestran como valor completo. Esto se hace con tal de mostrar la gravedad de la posible situación. En ningún momento se pretende tener una visión catastrofista.Finalmente, el indicador más interesante como opinión subjetiva, es el que llamamos [**Riesgo PATRICOVA**](https://construalicante.com/plan-patricova-que-es-y-por-que-todos-deberiamos-conocerlo/){target="_blank"}. Aquí, se calcula el riesgo de inundación en un territorio combinando dos factores: la peligrosidad de las inundaciones (probabilidad de que ocurran) y la vulnerabilidad del suelo (daño potencial en las posibles areas afectadas). En el leafmap del final del trabajo, es interesante pinchar sobre el "Riesgo Patricova" y buscar nuestro pueblo a través de la lupa para ver si está dentro de la zona considerada con riesgo, o no.```{r}#| dpi: 300# Sf de Valencia (SI EL CÓDIGO NO VA, PONER UN VALOR MÁS ELEVADO EN RESOLUCIÓN Y MÁS BAJO EN Z)valencia_sf <- giscoR::gisco_get_nuts(year ="2016",epsg ="4326",resolution ="1",nuts_level ="2",country ="ES") %>%filter(NUTS_ID =="ES52")# Elevaciónvalencia_elevacion <-get_elev_raster(locations = valencia_sf, z =9,clip ="locations") # Convertir a dfelevation_df <-as.data.frame(valencia_elevacion, xy =TRUE) %>%na.omit() %>%setNames(c("x", "y", "elevation"))# Mapaggplot() +geom_tile(data = elevation_df, aes(x = x, y = y, fill = elevation)) +theme(axis.text =element_blank(),axis.title =element_blank(),axis.ticks =element_blank(),legend.position ="none",panel.grid =element_blank(),plot.title =element_text(size=18, hjust=1),panel.background =element_rect(fill ="white"),plot.margin =margin(0, 0, 0, 0) )```## 2. Población y ViviendasEn este apartado, dado que los datos relativos a los riesgos se calculan teniendo en cuenta, entre otras variables, la población y las viviendas, se realizará una visualización de datos sobre la vivienda y la población municipal de la Comunidad Valenciana.### 2.1 Treemap InteractivoEn este **treemap** realizado con el paquete *d3treeR* y *treemap*, se puede apreciar de manera interactiva la población de la Comunidad Valenciana distribuida entre las 3 provincias principales y estas, a su vez, subdivididas entre todos sus municipios. Esto ayuda a hacernos una idea de dónde se concentra la mayor parte de la población.Sin duda, este gráfico ha sido el más sencillo de hacer con diferencia en comparación a los demás. El único inconveniente que he encontrado ha sido que se generaba tanto el treemap normal como el interactivo. Se ha solucionado dividiendo el código en 2 chunks y poniendo el atributo *fig.show: "hide"* para el treemap normal.```{r}#| fig.show: "hide"#url_cast <- "https://ine.es/jaxiT3/files/t/es/px/2865.px?nocab=1"destino_cast <-"./datos/castellon.px"#curl::curl_download(url_cast, destino_cast)#url_alic <- "https://ine.es/jaxiT3/files/t/es/px/2856.px?nocab=1"destino_alic <-"./datos/alicante.px"#curl::curl_download(url_alic, destino_alic)#url_vlc <- "https://ine.es/jaxiT3/files/t/es/px/2903.px?nocab=1"destino_vlc <-"./datos/valencia.px"#curl::curl_download(url_vlc, destino_vlc)df_cast <- pxR::read.px(destino_cast) %>%as_tibble() %>% janitor::clean_names()df_alic <- pxR::read.px(destino_alic) %>%as_tibble() %>% janitor::clean_names()df_vlc <- pxR::read.px(destino_vlc) %>%as_tibble() %>% janitor::clean_names()rm(destino_alic, destino_cast, destino_vlc, url_alic, url_cast, url_vlc)df_cast <- df_cast %>%filter(periodo =="2024", sexo =="Total") %>%separate(municipios, into =c("cp", "municipios"), sep =" ", extra ="merge")df_alic <- df_alic %>%filter(periodo =="2024", sexo =="Total") %>%separate(municipios, into =c("cp", "municipios"), sep =" ", extra ="merge")df_vlc <- df_vlc %>%filter(periodo =="2024", sexo =="Total") %>%separate(municipios, into =c("cp", "municipios"), sep =" ", extra ="merge")cv_pob <-bind_rows( df_cast %>%mutate(provincia ="Castellón (615.849)"), df_alic %>%mutate(provincia ="Alicante (1.991.259)"), df_vlc %>%mutate(provincia ="Valencia (2.709.433)")) cv_pob <- cv_pob %>%mutate(municipios_modificados =paste(municipios, "(", value, ")", sep =""))cv_pob <- cv_pob %>%filter(cp !="12", cp !="46", cp !="03")#- TREEMAP POB CVp <-treemap( cv_pob,index =c("provincia", "municipios_modificados"),vSize ="value",type ="index",palette =c("#FF9999", "#66B2FF", "#99FF99"), )``````{r}d3tree2(p,rootname ="Habitantes por municipios de la Comunidad Valenciana (5.316.541)",height ="800px",width ="100%")```### 2.2 Tabla InteractivaEsta tabla nos muestra un gráfico de la evolución de la población por cada municipio de la Comunidad Valenciana. Podemos buscar el municipio que queramos y ver su evolución de la población. Encontramos de todo: tanto municipios que han aumentado su población, como municipios que han ido disminuyendo su población.```{r}destino_cast <-"./datos/castellon.px"destino_alic <-"./datos/alicante.px"destino_vlc <-"./datos/valencia.px"df_cast <- pxR::read.px(destino_cast) %>%as_tibble() %>% janitor::clean_names()df_alic <- pxR::read.px(destino_alic) %>%as_tibble() %>% janitor::clean_names()df_vlc <- pxR::read.px(destino_vlc) %>%as_tibble() %>% janitor::clean_names()rm(destino_alic, destino_cast, destino_vlc)cv_pob1 <-bind_rows( df_cast %>%mutate(provincia ="Castellón"), df_alic %>%mutate(provincia ="Alicante"), df_vlc %>%mutate(provincia ="Valencia") ) %>%separate(municipios, into =c("cp", "municipios"), sep =" ", extra ="merge") %>%filter(cp !="12", cp !="46", cp !="03")cv_pob1 <- cv_pob1 %>%mutate(periodo =as.numeric(as.character(periodo)))cv_pob1 <- cv_pob1 %>%filter(sexo =="Total")# Tidy datos 2cv_pob2 <- cv_pob1 %>% dplyr::group_by(municipios) %>% dplyr::arrange(periodo) %>% dplyr::summarise(datos_evol =list(tibble(periodo = periodo,value = value )),ultimo_total = dplyr::last(value) ) %>% dplyr::ungroup() # Reactabletabla <-reactable(pagination =FALSE,searchable =TRUE,striped =FALSE,highlight =TRUE,theme =reactableTheme(highlightColor ="lightgrey"),language =reactableLang(searchLabel ="Buscar",searchPlaceholder ="Buscar"),defaultPageSize =1000, cv_pob2,columns =list(municipios =colDef(name ="Municipio",minWidth =150,align ="center",vAlign ="center",style =list(fontSize ="28px"),headerStyle =list(textAlign ="center",fontSize ="30px"),sortable =FALSE ),ultimo_total =colDef(name ="Población 2024",format =colFormat(separators =TRUE),minWidth =150,align ="center",vAlign ="center",style =list(fontSize ="28px"),headerStyle =list(textAlign ="center",fontSize ="30px"),sortable =TRUE ),datos_evol =colDef(name ="Evolución Población (1996-2024)",cell =function(value, index) { datos_df <-as.data.frame(value) %>%drop_na() plot <-ggplot(datos_df, aes(x = periodo, y = value)) +geom_line(color ="orange", size =2) +geom_label(data = datos_df %>%filter(periodo =="2000"),aes(x = periodo, y = value, label = value),color ="grey",size =8) +theme_minimal() +theme(axis.title.x =element_blank(),axis.title.y =element_blank(),axis.text.y =element_blank(),axis.text.x =element_blank(),axis.ticks.y =element_blank(),axis.ticks.x =element_blank(),panel.grid =element_blank())# Renderizar gráfico como SVG (más eficiente que PNG) svg <-tempfile(fileext =".svg")ggsave(svg, plot, width =6, height =2, bg ="transparent", device ="svg") svg_uri <- base64enc::dataURI(file = svg, mime ="image/svg+xml")unlink(svg)htmltools::tags$img(src = svg_uri, style ="width: 100%; height: auto;") },minWidth =300,headerStyle =list(textAlign ="center",fontSize ="30px"),sortable =FALSE) ),)tabla_con_scroll <- tabla %>% htmltools::tags$div(style ="height: 800px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;",)tabla_con_scroll```### 2.3 Mapa ViviendasFinalmente, podemos visualizar aquí la cantidad total de viviendas primarias y secundarias de cada municipio. Es interesante ver cómo la mayoría se concentra en el territorio litoral, cercano a la costa. De estos datos, y también con la ayuda de los anteriores, podemos sacar la conclusión de que la mayor concentración poblacional está en el litoral.Para realizar mi gráfico, me he inspirado en [este](https://r-graph-gallery.com/web-choropleth-barchart-map.html){target="_blank"}. Para dejar algún comentario extra, este ha sido el gráfico más aburrido de hacer en cuanto a lo tedioso que ha sido manejar los datos, al no estar de manera idonea para realizar un *left_joint*.```{r}#| fig.width: 12#| fig.height: 10#| dpi: 300# 1.DESCARGAR DATOS#url_ce <- "https://bdo.gva.es/bdo/res_optimo_static.php?cons=V2868_C1D3002&idioma=cas&form=pcaxis"destino_ce <-"./datos/censo.px"#curl::curl_download(url_ce, destino_ce)# 2. IMPORTAR DATOSdf_ce <- pxR::read.px(destino_ce) %>%as_tibble() %>% janitor::clean_names()# 3. LIMPIEZA DE DATOSdf_ce <- df_ce %>% dplyr::filter(tipo_de_vivienda_viviendas_principales_no_principales =="Total") %>%slice(-1:-37) %>%mutate(municipios =sub("^[0-9]{5} - ", "", municipios),municipios =stri_trans_general(municipios, "latin-ascii") )# 3.1. cambio manual del nombre de los municipios para hacer el left joint ya que solo hay el nombre como variable común.df_ce <- df_ce %>%mutate(municipios =case_when( municipios =="Elx / Elche"~"Elche / Elx", municipios =="Alacant / Alicante"~"Alicante / Alacant", municipios =="Xixona / Jijona"~"Jijona / Xixona", municipios =="Alcoi / Alcoy"~"Alcoy / Alcoi", municipios =="Moixent / Mogente"~"Mogente / Moixent", municipios =="Xodos / Chodos"~"Chodos / Xodos", municipios =="Useres, les / Useras"~"Useras / Useres, les", municipios =="Castelló de la Plana"~"Castellon de la Plana / Castello de la Plana", municipios =="Almassora"~"Almazora", municipios =="Suera / Sueras"~"Sueras / Suera", municipios =="Xilxes / Chilches"~"Chilches / Xilxes", municipios =="Nàquera/Náquera"~"Naquera", municipios =="Alfarb"~"Alfarp", municipios =="Castelló"~"Villanueva de Castellon", municipios =="Genovés, el"~"Genoves", municipios =="Novetlè"~"Novele / Novetle", municipios =="Vila Joiosa, la / Villajoyosa"~"Villajoyosa / Vila Joiosa, la", municipios =="Orxa, l' / Lorcha"~"Lorcha / Orxa, l'", municipios =="Alcosser"~"Alcocer de Planes", municipios =="Torre de les Maçanes, la / Torremanzanas"~"Torremanzanas / Torre de les Macanes, la", municipios =="Fageca"~"Facheca", municipios =="Camp de Mirra, el / Campo de Mirra"~"Campo de Mirra / Camp de Mirra, el", municipios =="Xàbia / Jávea"~"Javea / Xabia", municipios =="Poble Nou de Benitatxell, el / Benitachell"~"Benitachell / Poble Nou de Benitatxell, el", municipios =="Orpesa / Oropesa del Mar"~"Oropesa del Mar / Orpesa", municipios =="Vilafranca / Villafranca del Cid"~"Villafranca del Cid / Vilafranca",TRUE~ municipios ))#- Recordatorio de que he tardado más en buscar y cambiar manualmente los pueblos que en hacer el gráfico :')# 4.CONSIGO LAS GEOMETRIAS DE LOS MUNICIPIOS GRACIAS A MAPSPAIN munis <- mapSpain::esp_get_munic()munis <- munis %>%filter(ine.ccaa.name =="Comunitat Valenciana")munis <- munis %>%mutate(name =stri_trans_general(name, "latin-ascii"))# 5. HAGO EL LEFT JOIN CON UN NUEVO PAQUETE PARA NO TENER QUE CAMBIAR A MANO 100 PUEBLOS. ESTE PAQUETE APROXIMA LOS NOMBRES AUNQUE NO SEAN 100% IGUALES.munis_ce <-stringdist_join( munis %>%mutate(name =tolower(name) %>% stringi::stri_trans_general("Latin-ASCII")), df_ce %>%mutate(municipios =tolower(municipios) %>% stringi::stri_trans_general("Latin-ASCII")),by =c("name"="municipios"),method ="jw",max_dist =0.1,distance_col ="dist",mode ="left") %>%filter(dist <=0.1) %>% dplyr::select(name, value, geometry) %>% sf::st_as_sf()munis_ce <- munis_ce %>%filter(duplicated(name) ==FALSE)# 6. POR FIN, EL PLOTplot_muni <-ggplot(data = munis_ce) +geom_sf(aes(fill = value), linewidth =0.0001, alpha =0.9, color ="white") +scale_fill_fermenter(name ="Número de Viviendas",breaks =c(100, 500, 1000, 5000, 10000, 50000, 100000, 400000),labels =c("", "500", "", "5.000", "", "50.000", "", "400.000"), direction =1,palette ="YlGnBu") +labs(title ="Viviendas por Municipio en la Comunidad Valenciana",subtitle ="Año 2021",caption ="Datos: IVE | Autor: Marius Bulat | bulat@alumni.uv.es",caption.vjust =10 ) +theme_map() +theme(legend.title =element_blank(),legend.position ="top",legend.justification =0.5,legend.key.size =unit(1.25, "cm"),legend.key.width =unit(1.5, "cm"),legend.text =element_text(size =10),legend.margin =margin(),plot.title =element_text(size =20, hjust =0.5, face ="bold"),plot.subtitle =element_text(hjust =0.5, size =18, face ="plain"),plot.caption =element_text(hjust =0.5, size =10, face ="italic"))plot_muni```## 3. Mapa InteractivoEl Mapa Interactivo hecho con *leaflet* es sin duda alguna la parte central y principal de este trabajo. Es el que más tiempo ha llevado de todos con bastante diferencia.Este mapa se ha inspirado del [visor.gva.es](https://visor.gva.es/visor/){target="_blank"}. El objetivo era recrear un visor geográfico que mostrase ciertos datos de interés actuales en R, pero de modo más simple, minimalista e intuitivo.Hay varias opciones para facilitar y agilizar el uso del mapa. Para empezar, abajo a la izquierda vemos un botón con el ícono de una [**casa**]{.underline}, que sirve para centrar en el mapa la Comunidad Valenciana en caso de que nos hayamos perdido buscando cosas y queremos volver rápidamente al punto de partida.Para continuar, arriba a la izquierda se incorpora una [**lupa**]{.underline} para buscar el pueblo/ciudad/calle que queramos para ver si está en una zona de riesgo, y si lo está, ver qué tipo de riesgo es.Para finalizar, arriba a la derecha vemos un rectángulo donde podemos seleccionar [**tres estilos del mapa**]{.underline}: si lo queremos ver simple, normal o realista.Ahora solo queda estar unos cuantos minutos viendo qué correlaciones podemos encontrar, buscar nuestro pueblo, explorar los datos y un largo etcétera. ¡Anímate! Realmente es curioso y divertido.::: {.alert .alert-info}Para acceder al mapa en pantalla completa, pulsa [<mark>aquí</mark>](mapa_riesgos.html){target="_blank"}.:::```{r}#| eval: false #- Datos RAWvalencia <-esp_get_ccaa(ccaa ="Comunidad Valenciana")df <-st_read("./datos/inundacion.gpkg")df_1 <-st_read("./datos/integrado.gpkg")df_2 <-read_sf("./datos/patricova.shp")#- Datos TIDY#- % daño efectivo anual propiedades / stock capital. T=100. Horizonte 2050 + ^NVM (lvl Mar)df_inu <- df %>% dplyr::select(cod_ine, provincia, municipio, porcperd_e3) %>% dplyr::rename(geometry = geom) %>%mutate(porcperd_e3 =round(porcperd_e3, 4)) %>%drop_na()df_inu <- df_inu %>%mutate(percentil =ntile(porcperd_e3, 4)) %>%relocate(percentil, .after = porcperd_e3)df_inu <- df_inu %>%mutate(riesgo =case_when( percentil ==1~"Bajo", percentil ==2~"Moderado", percentil ==3~"Moderado-Alto", percentil ==4~"Alto")) %>%relocate(riesgo, .before = geometry)color_inu <-colorFactor(palette =c("darkgreen", "yellow", "orange", "red"),domain = df_inu$percentil)#- Riesgo Inundacion Integrado. T=100 + ^NVM. Horizonte 2050.df_int <- df_1 %>% dplyr::select(cod_ine, provincia, municipio, riesgo_e3) %>% dplyr::rename(geometry = geom) %>%drop_na()df_int <- df_int %>%mutate(percentil =case_when( riesgo_e3 =="Bajo"~1, riesgo_e3 =="Moderado"~2, riesgo_e3 =="Moderado-Alto"~3, riesgo_e3 =="Alto"~4, )) %>%relocate(percentil, .before = geometry)color_int <-colorFactor(palette =c("darkgreen", "yellow", "orange", "red"),domain = df_int$percentil)#- Riesgo inundacion territorio. Peligrosidad inu + vulnerabilidad suelo. PATRICOVA prevención riesgo.df_pat <- df_2 %>% dplyr::select(leyenda, geometry) %>%drop_na() %>% dplyr::rename(riesgo = leyenda)df_pat <- df_pat %>%mutate(percentil =case_when( riesgo =="Muy Bajo"~1, riesgo =="Bajo"~2, riesgo =="Medio"~3, riesgo =="Alto"~4, riesgo =="Muy Alto"~5, )) %>%relocate(percentil, .before = geometry)color_pat <-colorFactor(palette =c("darkgreen", "yellow", "orange", "red", "black"),domain = df_pat$percentil)rm(df, df_1, df_2, df_3)#- Capas del mapakapas <-c("Zona DANA", "Riesgo Inundación", "Riesgo Integrado", "Riesgo PATRICOVA")#- Transformar datos para que funcione (no se por que pero hay que hacerlo)df_inu <-st_transform(df_inu, crs =4326)df_int <-st_transform(df_int, crs =4326)df_pat <-st_transform(df_pat, crs =4326)#- EL MAPAcapas <-leaflet() %>%addProviderTiles(providers$CartoDB.Positron, group ="Simple") %>%addTiles(group ="Normal") %>%addProviderTiles(providers$Esri.WorldImagery, group ="Realista") %>%addLayersControl(baseGroups =c("Simple", "Normal", "Realista"), options =layersControlOptions(collapsed =FALSE)) %>%onRender(" function(el, x) { var controls = document.getElementsByClassName('leaflet-control-layers')[0]; var title = document.createElement('div'); title.className = 'leaflet-control-title'; title.innerHTML = '<b>Estilo del mapa:</b>'; controls.prepend(title); // Estilo control de capas controls.style.border = '2px solid blue'; controls.style.backgroundColor = 'rgba(255, 255, 255, 1)'; // Fondo blanco semitransparente controls.style.borderRadius = '8px'; // Bordes redondeados controls.style.padding = '5px'; // Espaciado interno } " ) %>%#- EasyButton "centrar"addEasyButton(easyButton(icon ="fa-home",position ="bottomleft",title ="CENTRAR",onClick =JS("function(btn, map) { map.setView([39.5, -0.75], 7); }") )) %>%onRender(" function(el, x) { var btn = document.querySelector('.easy-button-button'); btn.style.border = '2px solid blue'; btn.style.backgroundColor = 'rgba(255, 255, 255, 1)'; } ") %>%#- CapasaddLayersControl(baseGroups =c("Simple", "Normal", "Realista"),overlayGroups = kapas, options =layersControlOptions(collapsed =FALSE ) ) %>%hideGroup(kapas) %>%#- Capa DANA (MODIFICADA 1/04/2025 razon: ya no iba el código antiguo porque llamaba al area de la dana desde un servicio de internet que parece que ya no va)addWMSTiles(baseUrl ="https://terramapas.icv.gva.es/00_DANA2024",layers ="DANA2024.ZonasInundadas.HuellaInundacion",options =WMSTileOptions(format ="image/png", transparent =TRUE),group ="Zona DANA" ) %>%addLayersControl(baseGroups =c("Simple", "Normal", "Realista"),overlayGroups = kapas, options =layersControlOptions(collapsed =FALSE ) ) %>%hideGroup(kapas) %>%#- Capa InundacionaddPolygons(data = df_inu,fillColor =~color_inu(percentil),color ="black",opacity =1,weight =2, fillOpacity =0.5,group ="Riesgo Inundación",label =~riesgo) %>%addLegend("bottomright", pal = color_inu, values = df_inu$percentil, title ="Cuartiles Riesgo: 1 = Bajo",opacity =1,group ="Riesgo Inundación",className ="info legend inundación-legend") %>%onRender(" function(el, x) { var map = this; // Ocultar la leyenda inicialmente var legend = document.querySelector('.inundación-legend'); if (legend) { legend.style.display = 'none'; } } ") %>%#- Capa Riesgo IntegradoaddPolygons(data = df_int,fillColor =~color_int(percentil),color ="black",opacity =1,weight =2, fillOpacity =0.5,group ="Riesgo Integrado",label =~riesgo_e3) %>%addLegend("bottomright", pal = color_int, values = df_int$percentil, title ="Cuartiles Riesgo: 1 = Bajo",opacity =1,group ="Riesgo Integrado",className ="info legend integrado-legend") %>%onRender(" function(el, x) { var map = this; // Ocultar la leyenda inicialmente var legend = document.querySelector('.integrado-legend'); if (legend) { legend.style.display = 'none'; } } ") %>%#- Riesgo PATRICOVAaddPolygons(data = df_pat,fillColor =~color_pat(percentil),color =~color_pat(percentil),opacity =1,weight =2, fillOpacity =0.5,group ="Riesgo PATRICOVA",label =~riesgo) %>%addLegend("bottomright", pal = color_pat, values = df_pat$percentil, title ="Quintiles Riesgo: 1 = Muy Bajo",opacity =1,group ="Riesgo PATRICOVA",className ="info legend patricova-legend") %>%onRender(" function(el, x) { var map = this; // Ocultar la leyenda inicialmente var legend = document.querySelector('.patricova-legend'); if (legend) { legend.style.display = 'none'; } } ") %>%#- Polígono ValenciaaddPolygons(data = valencia, color ="#000000", weight =3, opacity =1, fillOpacity =0) %>%#- Añadir Lupa para buscaraddSearchOSM(options =searchOptions(hideMarkerOnCollapse =TRUE, position ="topleft"))#- Visualizar:capassaveWidget(capas, "mapa_riesgos.html", selfcontained =TRUE)```## 4. ConclusionesVamos a ver algunas conclusiones que pueden sacarse de todo lo anterior:1. Al activar la capa **Riesgo PATRICOVA** y la capa **Zona DANA**, podemos ver como la mayoría de la zona afectada, ya estaba bajo indicadores de riesgo según el análisis realizado por el PATRICOVA.2. Viendo las zonas que marca el **Riesgo Integrado** y el **Riesgo Inundación**, podemos entender por encima el posible daño que puede realizar el aumento del nivel del mar, dentro del escenario estático del análisis, a todas las viviendas y habitantes de la zona litoral (gráfico 2.3).3. En el caso particular de mi pueblo, si activamos la capa **Riesgo PATRICOVA** y buscamos con la lupa Ondara, podemos ver varias zonas marcadas con diferentes riesgos. En las zonas marcadas en amarillo y negro, se sabe que hace algunas décadas efectivamente hubo una inundación en esa zona.4. ¿Qué conclusiones puedes sacar tú con toda esta información?### Información sobre la sesiónAbajo muestro mi entorno de trabajo y paquetes utilizados```{r}#| echo: falsesessioninfo::session_info() %>% details::details(summary ='current session info') ```