Esta página caracteriza la amenaza de incendio forestal alrededor del barrio con cuatro insumos: la zonificación oficial del POT Alcaldía Mayor de Bogotá, 2021, la vegetación combustible, la pendiente y el índice meteorológico de incendios (FWI) histórico.
Amenaza oficial del POT¶
import numpy as np
import pandas as pd
from IPython.display import Markdown, display
from sidro import process, viz
from sidro.analisis import clima, espacial, masa
from sidro.aoi import bbox_wgs84
from sidro.config import parametros
from sidro.fetch import obtener_capa
pot = intentar(obtener_capa, "amenaza_incendio_forestal",
mensaje="La capa de amenaza por incendios forestales del POT no está disponible")if pot is not None and len(pot):
pot = masa.preparar(pot) # traduce los códigos numéricos del POT (1 Baja, 2 Media, 3 Alta ...)
m = viz.mapa_base()
viz.capa(m, pot, "categoria", nombre="Amenaza POT", categorica=True, cmap="OrRd")
viz.cerrar(m)
elif pot is not None:
display(Markdown("La capa del POT no tiene polígonos en el área de interés: la interfaz urbano-forestal del barrio "
"se evalúa con la distancia a la vegetación de [3.2.c](c_riesgo.md)."))
m = None
else:
m = None
mVegetación combustible¶
Las clases de árboles y arbustos de ESA WorldCover Zanaga et al., 2022 se tratan como combustible.
ruta_cob = intentar(obtener_capa, "cobertura_suelo", mensaje="No se pudo obtener la cobertura del suelo")
if ruta_cob is not None:
cob = process.abrir_raster(ruta_cob)
clases = parametros()["incendio_forestal"]["clases_bosque_worldcover"]
bosque = espacial.poligonos_de_clase(cob, clases)
area_ha = bosque.area.sum() / 1e4
print(f"Vegetación combustible en el área con búfer: {area_ha:,.1f} ha "
f"({100 * np.isin(cob.values, clases).sum() / np.isfinite(cob.values).sum():.0f} % de las celdas)")
m = viz.mapa_base()
viz.capa(m, bosque, nombre="Vegetación combustible", color="#2d6a4f")
viz.cerrar(m)
else:
bosque, m = None, None
mWarning 1: DeprecationWarning: 'Memory' driver is deprecated since GDAL 3.11. Use 'MEM' onwards. Further messages of this type will be suppressed.
Vegetación combustible en el área con búfer: 355.7 ha (42 % de las celdas)
Pendiente¶
ruta_dem = intentar(obtener_capa, "dem", mensaje="No se pudo obtener el modelo digital de elevación")
if ruta_dem is not None:
dem = process.abrir_raster(ruta_dem)
pend = process.pendiente_grados(dem)
crit = parametros()["incendio_forestal"]["pendiente_critica_grados"]
v = pend.values[np.isfinite(pend.values)]
display(pd.Series({
"pendiente media (°)": v.mean(),
"pendiente máxima (°)": v.max(),
f"área con pendiente > {crit}° (%)": 100 * (v > crit).mean(),
}).round(1).to_frame("área con búfer"))Focos de calor recientes¶
focos = intentar(obtener_capa, "focos_calor",
mensaje="Sin focos de calor: defina la variable de entorno FIRMS_MAP_KEY para consultarlos (opcional)")
if focos is not None:
print(f"{len(focos)} focos de calor detectados por VIIRS en el área con búfer en los últimos días consultados")WARNING sidro.fetch: focos_calor: falló nivel global/http -> Defina la variable de entorno FIRMS_MAP_KEY
Con el conector actual, FIRMS devuelve solo los últimos días: sirve para vigilancia, no como historial de incendios.
FWI histórico¶
El FWI integra temperatura, lluvia, viento y humedad en una sola cifra de la propensión meteorológica a incendios Van Wagner, 1987. Se calcula con xclim Bourgault et al., 2023 a partir de la serie diaria.
import matplotlib.pyplot as plt
clima_df = intentar(obtener_capa, "clima_observado_diario", mensaje="No se pudo obtener la serie climática diaria")
if clima_df is not None:
lat = (bbox_wgs84()[1] + bbox_wgs84()[3]) / 2
fwi = intentar(clima.fwi_diario, clima_df, lat, mensaje="No se pudo calcular el FWI (faltan variables en la serie)")
else:
fwi = NoneWARNING pint.util: Redefining 'percent' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining '%' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'year' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'yr' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'C' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'd' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'h' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'degrees_north' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'degrees_east' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'degrees' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining '[speed]' (<class 'pint.delegates.txt_defparser.plain.DerivedDimensionDefinition'>)
if fwi is not None:
umbral = parametros()["incendio_forestal"]["fwi_umbral_alto"]
dias = clima.dias_fwi_alto(fwi)
resumen = pd.DataFrame({"FWI medio": fwi.groupby(fwi.index.year).mean(),
"FWI máximo": fwi.groupby(fwi.index.year).max(), "días FWI alto": dias})
display(resumen.describe().loc[["mean", "min", "max"]].round(1))
fig, ax = plt.subplots(1, 2, figsize=(10, 3.4))
mensual = fwi.groupby(fwi.index.month).mean()
ax[0].bar(mensual.index, mensual.values, color="#bc6c25")
ax[0].set_xlabel("Mes"), ax[0].set_ylabel("FWI medio"), ax[0].set_title("Ciclo anual")
ax[1].plot(resumen.index, resumen["FWI máximo"], color="#bc6c25")
ax[1].axhline(umbral, ls="--", color="#555")
ax[1].set_xlabel("Año"), ax[1].set_ylabel("FWI máximo anual"), ax[1].set_title(f"Umbral alto = {umbral}")
fig.tight_layout()
fig
Bogotá tiene un régimen de lluvias bimodal: los meses de menor lluvia (diciembre–marzo y julio–agosto) concentran los valores altos del FWI. Si el máximo anual casi nunca alcanza el umbral de 21,3, eso refleja el clima húmedo de la ciudad y no un error: para decisiones locales conviene calibrar un umbral propio con percentiles de la serie del barrio.
- Alcaldía Mayor de Bogotá. (2021). Decreto 555 de 2021, por el cual se adopta la revisión general del Plan de Ordenamiento Territorial de Bogotá D.C. https://services7.arcgis.com/lsxbLWF2l19Rmhqj/ArcGIS/rest/services/POT_Bogota_Decreto_555_2021/FeatureServer
- Zanaga, D., Van De Kerchove, R., Daems, D., & others. (2022). ESA WorldCover 10 m 2021 v200. 10.5281/zenodo.7254221
- Van Wagner, C. E. (1987). Development and structure of the Canadian Forest Fire Weather Index System (Forestry Technical Report No. 35). Canadian Forestry Service.
- Bourgault, P., Huard, D., Smith, T. J., & others. (2023). xclim: xarray-based climate data analytics. Journal of Open Source Software, 8(85), 5415. 10.21105/joss.05415