Esta página cuenta cuántas edificaciones y personas están dentro del alcance de la vegetación combustible, por franjas de distancia (3.2.a), y las agrega por unidad de análisis. Es una medida de exposición (cuántos elementos están cerca de la vegetación), no una estimación de daño: no hay una función de vulnerabilidad aceptada para vivienda urbana frente a incendios de cobertura. Siguiendo a CCDR-tools, cuando no hay función de vulnerabilidad se reporta la exposición Amadio, 2024.
Exposición: edificaciones y vegetación¶
import numpy as np
import pandas as pd
from IPython.display import Markdown, display
from sidro import exposicion, process, viz
from sidro.analisis import espacial, indices
from sidro.config import parametros, rutas
from sidro.fetch import obtener_capa
edif = intentar(exposicion.edificaciones, mensaje="No se pudo construir la exposición de edificaciones")
ruta_cob = intentar(obtener_capa, "cobertura_suelo", mensaje="No se pudo obtener la cobertura del suelo")
ruta_dem = intentar(obtener_capa, "dem", mensaje="No se pudo obtener el modelo digital de elevación")
bosque = None
if ruta_cob is not None:
clases = parametros()["incendio_forestal"]["clases_bosque_worldcover"]
bosque = espacial.poligonos_de_clase(process.abrir_raster(ruta_cob), clases)
listo = edif is not None and bosque is not None and len(bosque) > 0
if edif is not None and not listo:
display(Markdown(":::{warning}\nSin vegetación combustible no se puede calcular la interfaz.\n:::"))Warning 1: DeprecationWarning: 'Memory' driver is deprecated since GDAL 3.11. Use 'MEM' onwards. Further messages of this type will be suppressed.
Franjas de interfaz¶
if listo:
exp = espacial.franjas_interfaz(edif, bosque)
orden = [f"{a}–{b} m" for a, b in zip(parametros()["incendio_forestal"]["franjas_interfaz_m"][:-1],
parametros()["incendio_forestal"]["franjas_interfaz_m"][1:])]
orden.append(f"> {parametros()['incendio_forestal']['franjas_interfaz_m'][-1]} m")
if ruta_dem is not None:
pend = process.pendiente_grados(process.abrir_raster(ruta_dem))
exp["pendiente_deg"] = process.muestrear(pend, exp, "pendiente_deg")
crit = parametros()["incendio_forestal"]["pendiente_critica_grados"]
exp["pendiente_critica"] = exp["pendiente_deg"] > crit
else:
exp["pendiente_deg"], exp["pendiente_critica"] = np.nan, False
tabla = (exp.groupby("franja_interfaz")
.agg(edificaciones=("id_edif", "count"), personas=("ocupantes_est", "sum"),
valor_millones_cop=("valor_cop", lambda s: s.sum() / 1e6),
en_pendiente_critica=("pendiente_critica", "sum"))
.reindex(orden).fillna(0))
tabla.loc["Total"] = tabla.sum()
display(tabla.round(0).astype(int))La columna de pendiente crítica cuenta las edificaciones que además están en una ladera de más de
30°, donde el fuego avanza más rápido. Las personas
son residentes estimados: área construida de uso habitacional ÷ 110 m² brutos por residente, calibrados con las viviendas de la UAECD y las personas por hogar del DANE (ver config/parametros.yaml). No incluyen la población flotante de oficinas, comercio o colegios.
if listo:
m = viz.mapa_base()
viz.capa(m, bosque, nombre="Vegetación combustible", color="#2d6a4f")
viz.capa(m, exp, "franja_interfaz", nombre="Franja de interfaz", categorica=True, cmap="YlOrRd_r",
tooltip=["franja_interfaz", "dist_bosque_m", "pisos", "pendiente_deg"])
viz.cerrar(m)
else:
m = None
mAgregación por unidad de análisis¶
La medida de riesgo por unidad son las personas estimadas a menos de 300 m de la vegetación.
if listo:
exp["cerca"] = exp["dist_bosque_m"] <= 300
exp["personas_cerca"] = exp["ocupantes_est"].where(exp["cerca"], 0.0)
exp["edif_cerca"] = exp["cerca"].astype(int)
unidades = process.unidades_analisis()
agg = process.agregar(exp, unidades, {
"n_edificaciones": ("id_edif", "count"),
"edificaciones_cerca": ("edif_cerca", "sum"),
"personas_cerca": ("personas_cerca", "sum"),
"dist_media_bosque_m": ("dist_bosque_m", "mean"),
"pendiente_media_deg": ("pendiente_deg", "mean"),
})
agg["vulnerabilidad_social"] = indices.vulnerabilidad_social(agg)
print(f"Unidades: {len(agg)} (origen: {unidades.attrs.get('origen')})")
display(agg.drop(columns="geometry").sort_values("personas_cerca", ascending=False).head(10).round(1))WARNING sidro.fetch: manzanas_censo: falló nivel nacional/usuario -> Archivo de usuario no encontrado: /Users/mauricio/Documents/Data-science-local/SIDRo/data/user/dane_mgn_manzanas_cnpv2018.gpkg
WARNING sidro.process: Unidades: manzanas_censo no disponible (No se pudo obtener 'manzanas_censo'. Intentos: [{'nivel': 'nacional', 'tipo': 'usuario', 'error': 'Archivo de usuario no encontrado: /Users/mauricio/Documents/Data-science-local/SIDRo/data/user/dane_mgn_manzanas_cnpv2018.gpkg'}])
Unidades: 57 (origen: estratificacion)
Riesgo × vulnerabilidad social¶
if listo:
biv = indices.bivariado(agg["personas_cerca"].fillna(0), agg["vulnerabilidad_social"])
agg = agg.join(biv)
m = viz.mapa_base()
viz.capa_bivariada(m, agg)
viz.cerrar(m)
else:
m = None
mLeyenda: exposición a incendio forestal en el eje vertical, vulnerabilidad social en el horizontal.
Los terciles son relativos al barrio. Si la vulnerabilidad social sale vacía, aún no se cargaron los datos censales (ver 2.2) y el mapa bivariado no distingue clases.
Exportación¶
if listo:
process.guardar(agg[["id_unidad", "geometry", "personas_cerca", "edificaciones_cerca", "vulnerabilidad_social"]]
.rename(columns={"personas_cerca": "riesgo"}), "riesgo_incendio_forestal")
print("Guardado:", (rutas().processed / "riesgo_incendio_forestal.parquet").relative_to(rutas().raiz))Guardado: data/processed/riesgo_incendio_forestal.parquet
riesgo_incendio_forestal.parquet queda en data/processed/ con id_unidad y la columna riesgo
(personas estimadas a menos de 300 m de la vegetación) para la síntesis 3.6.
- Amadio, M. (2024). CCDR tools data and methodology. Global Facility for Disaster Reduction and Recovery (GFDRR), World Bank. https://gfdrr.github.io/CCDR-tools