Al no existir un mapa oficial de amenaza (3.4.a), esta página reúne los dos insumos que la reemplazan: la ocurrencia histórica (densidad de kernel de incidentes) y la capacidad de respuesta (estaciones, tiempo de llegada e hidrantes) Unidad Administrativa Especial Cuerpo Oficial de Bomberos de Bogotá, 2022.
Ocurrencia histórica¶
import numpy as np
import pandas as pd
from IPython.display import Markdown, display
from sidro import process, viz
from sidro.analisis import espacial, indices
from sidro.config import parametros
from sidro.fetch import obtener_capa
p = parametros()["incendio_urbano"]
incidentes = intentar(obtener_capa, "incidentes_incendio_urbano",
mensaje="No hay registro de incidentes: solicítelo a UAECOB y guárdelo en data/user/incidentes_uaecob.csv "
"(columnas longitud, latitud, fecha, tipo_incidente). Sin él, el índice omite la ocurrencia histórica")if incidentes is not None and len(incidentes):
celdas = process.grilla(25)
celdas["densidad"] = indices.densidad_kernel(incidentes, celdas, p["radio_kernel_m"])
print(f"{len(incidentes)} incidentes en el área con búfer; radio del kernel: {p['radio_kernel_m']} m")
m = viz.mapa_base()
viz.capa(m, celdas, "densidad", nombre="Densidad de incidentes (eventos/km²)", cmap="OrRd")
viz.capa(m, incidentes, nombre="Incidentes", color="#222", marker_kwds={"radius": 2})
viz.cerrar(m)
elif incidentes is not None:
display(Markdown(":::{note}\nEl registro no tiene incidentes dentro del área con búfer.\n:::"))
m = None
else:
m = None
m29 incidentes en el área con búfer; radio del kernel: 300 m
La densidad de kernel cuártico estima cuántos incidentes por kilómetro cuadrado hay alrededor de cada
celda, suavizando con un radio de radio_kernel_m. Con pocos eventos el mapa es muy sensible al radio y
a la posición exacta de cada incidente; léalo como una indicación de concentración, no de frecuencia.
Estaciones de bomberos¶
est = intentar(obtener_capa, "estaciones_bomberos",
mensaje="No se pudieron obtener las estaciones de bomberos de OpenStreetMap")
if est is not None:
print(f"{len(est)} estación(es) en el área con búfer ampliado")
if len(est):
cols = [c for c in ("name", "operator") if c in est.columns]
display(est[cols].reset_index(drop=True) if cols else est.head())4 estación(es) en el área con búfer ampliado
Tiempo de respuesta¶
if est is not None and len(est):
grilla = process.grilla(50)
grilla["minutos"] = espacial.tiempo_respuesta_min(grilla, est)
grilla["rango_min"] = pd.cut(grilla["minutos"], [0, 3, 5, 8, 12, np.inf],
labels=["< 3", "3–5", "5–8", "8–12", "> 12"]).astype("string")
display(grilla["minutos"].describe().round(1).to_frame("minutos"))
m = viz.mapa_base()
viz.capa(m, grilla, "rango_min", nombre="Tiempo de respuesta (min)", categorica=True, cmap="YlOrRd")
viz.capa(m, est, nombre="Estaciones", color="#0b3d91", marker_kwds={"radius": 6})
viz.cerrar(m)
else:
m = None
mEl tiempo se calcula por la red vial más corta desde la estación más cercana a una velocidad media de
velocidad_respuesta_kmh; si no se puede descargar la red, se usa la distancia recta multiplicada por
1,4. Es un tiempo de viaje: no incluye el despacho, la salida de la unidad ni el acceso final al
inmueble. Los rangos son indicativos y no corresponden a una meta oficial.
Hidrantes¶
hid = intentar(obtener_capa, "hidrantes", mensaje="No se pudieron obtener los hidrantes")
if hid is not None:
print(f"{len(hid)} hidrantes en el área con búfer")
if len(hid):
m = viz.mapa_base()
viz.capa(m, hid, nombre="Hidrantes", color="#1b998b", marker_kwds={"radius": 3})
viz.cerrar(m)
else:
m = None
else:
m = None
m162 hidrantes en el área con búfer
Si el inventario es el de OpenStreetMap, es probable que sea parcial: pocos hidrantes mapeados no significan que el barrio carezca de ellos. Pida el inventario a la EAAB para un análisis serio.
- Unidad Administrativa Especial Cuerpo Oficial de Bomberos de Bogotá. (2022). Caracterización de escenarios de riesgo por incendio estructural por localidad, 2014–2021. https://www.bomberosbogota.gov.co/sites/default/files/Documentacion/Prevencion/EscenariosRiesgo/