CENTINELA: exposición a sismos e incendios en América Latina
Cuántas personas, escuelas, hospitales y vías quedan expuestas tras cada sismo M≥5,5 en América Latina, y bajo los puntos de calor que los satélites detectaron en las últimas 24 horas. Por municipio, con una tabla de celdas hexagonales calculada antes de cada evento.
Python, H3, DuckDB, MapLibre, GitHub Actions, Gestión del riesgo, Datos abiertos
El detalle
En el sismo de San José del Palmar (M7,4, 10 de agosto de 2026), PAGER, de USGS, estimó en media hora cuántas personas quedaban en la zona de intensidad fuerte. Saber dónde estaban, con qué infraestructura y en qué municipio tomó días. CENTINELA es esa pieza del medio.
Su base es un activo de exposición: una tabla ya construida, celda H3 por celda, con habitantes, edificaciones, sedes de salud y educación y kilómetros de vía de 19 países latinoamericanos.
Cuando USGS publica el ShakeMap de un sismo M≥5,5 en la región, el sistema cruza esa intensidad con la tabla y publica un reporte por municipio, en español y con CSV descargable. El activo de tu país lo reconstruyes desde fuentes públicas, con un comando y sin credenciales.
Lo que publica es exposición, y exposición no es daño: CENTINELA no es alerta temprana, no estima víctimas y no reemplaza al SGC ni a las unidades de gestión del riesgo.
Características
- Reporte por sismo M≥5,5 en la región:
- personas, edificaciones, sedes de salud y educación y kilómetros de vía dentro de cada franja de intensidad MMI, por municipio y por celda H3
- Salidas descargables en cada reporte:
- JSON, Markdown, mapas y CSV por municipio
- Activo de exposición construido para 19 países y publicado como release; el de cualquiera de ellos se reconstruye desde fuentes públicas con make country ISO=COL
- 27 reportes publicados en 16 países:
- 25 reconstrucciones del catálogo histórico de USGS y 2 sismos en vivo, los del 2 de septiembre de 2026
- Cada reporte vuelve a salir cuando USGS publica una versión nueva del ShakeMap, y cada cifra lleva la versión que la produjo
- Deslizamiento y licuefacción a partir del producto Ground Failure de USGS, con sus cautelas impresas en cada reporte
- Capa de fuego:
- los focos activos de NASA FIRMS cruzados con el mismo activo y con la cobertura del suelo de ESA WorldCover
- Visor estático en GitHub Pages con MapLibre, sin llaves de API, y una página de estado que publica la latencia medida, incluida la que no le favorece
- Licencias por capa, impuestas en código:
- los 19 activos de hoy salen bajo ODbL porque llevan edificaciones y vías de Overture, y ninguna fuente no comercial entra al reporte automático
- 2.472 pruebas sin red y 157 que abren el visor en un navegador, con pruebas de regresión contra los productos de USGS congelados de San José del Palmar y Venezuela
Stack tecnológico
- Python 3.12 con uv; httpx y jsonschema en el camino crítico del vigía
- Cómputo geo: DuckDB, H3, rasterio, Shapely, pyproj y PyArrow
- matplotlib para el mapa estático del reporte
- Visor: MapLibre GL en GitHub Pages
- Orquestación: 14 workflows de GitHub Actions, con un cron externo que dispara repository_dispatch cada cinco minutos
- Calidad: pytest, Playwright, ruff y mypy en modo estricto
- Fuentes: USGS (ShakeMap, Ground Failure, PAGER), GHS-POP, WorldPop, Overture, OpenStreetMap, HOT, ESA WorldCover y NASA FIRMS
Lo difícil
- Enterarse a tiempo: con el cron de GitHub Actions solo, entre el 25 y el 30 de agosto de 2026 la detección tuvo una mediana de 157 minutos y un peor caso de 12,8 horas, contra un objetivo de 60 minutos extremo a extremo
- El cálculo rechazó veinte veces seguidas el primer sismo en vivo, un M5,6 a 71 km de Puerto Madero (México): trataba como error una sacudida que se quedó mar adentro
- Dejar de dar por supuesta la banda MMI≥7: 17 de los 27 eventos no la alcanzan sobre población, y el reporte titulaba "0 personas" con los municipios en orden alfabético
- Mezclar licencias sin contaminar el dato: la ODbL de Overture y la CC BY-SA de los registros colombianos de salud y educación no caben en el mismo derivado
- Mantener las cifras del README pegadas al reporte: cinco filas estuvieron desactualizadas hasta el 25 de agosto de 2026, los kilómetros de vía por un factor de seis
- Que ninguna capa vacía se publique como cero: el build se detiene si una capa requerida suma cero en todo el país
Lo aprendido
- El cálculo de un evento es la parte corta; la larga es enterarse
- Las cifras copiadas a mano en un README necesitan una prueba que las compare con el reporte
- Ninguna prueba sintética habría mostrado que MMI≥7 no era la banda de todos los sismos: hizo falta correr la región entera
- Es preferible no publicar un activo que publicar uno que informa cero donde no midió nada
- Afirmar de menos sobre el trabajo de otro cuesta una palabra; afirmar de más cuesta la credibilidad de todo lo demás