El 26 de agosto de 2026 bajé el archivo de puntos calientes del último día sobre América Latina y conté las filas. Salieron 66.806. Alcancé a escribir en un borrador que ese día habían ardido 66.806 incendios en la región.
Ni de lejos. Esas 66.806 filas se repartían sobre 22.701 piezas de mapa de menos de un kilómetro de lado, a 2,9 filas por pieza. En la primera frase que escribí sobre incendios multipliqué por tres los que había.
De eso va este post, en dos mitades como el de sismos: primero qué trae de verdad una de esas filas; después la máquina que le pone debajo cuántas personas viven ahí, cada seis horas y sin esperar a que pase nada. En medio, los dos errores que cometí. El código está en el repositorio y la capa, viva, en el visor.
Tres satélites, y once horas sin mirar
Ese archivo lo llena un sensor llamado VIIRS, montado en tres satélites de la NASA y la NOAA: Suomi NPP, NOAA-20 y NOAA-21. Miran la Tierra en cuadros de unos 375 metros de lado, más grandes hacia el borde de cada pasada, y apuntan los que están más calientes que su alrededor. Una coordenada, una hora y una temperatura. Esa es la anotación entera.
Van los tres por la misma órbita, y ese detalle decide qué se puede afirmar con ellos. NOAA-21 viaja media vuelta por delante de NOAA-20, unos cincuenta minutos, y Suomi NPP va entre los dos. Cruzan el ecuador casi a la misma hora solar, así que lo que aportan juntos son más oportunidades de atravesar la nube y el humo dentro de esas mismas horas: al menos seis pasadas al día, tres de día y tres de noche, apretadas en menos de una hora cada tanda.
El resto del día no mira ninguno. Entre la última pasada de una tanda y la primera de la siguiente hay unas once horas en las que un incendio puede empezar, crecer y no salir en ningún archivo. En Villa de Leyva quedó cronometrado: el cerro San Marcos se reportó ardiendo el sábado 19 de septiembre hacia las dos de la tarde, casi en el minuto en que pasaba Suomi NPP, que no registró calor. La primera detección entró once horas y dieciocho minutos más tarde, a la 1:18 de la madrugada.
Línea de tiempo del incendio de Villa de Leyva: el incendio se reporta el sábado a las 2 de la tarde y a esa misma hora pasa Suomi NPP sin registrar calor; pasan 11 horas y 18 minutos hasta la primera detección, de NOAA-20, a la 1:18 de la madrugada del domingo; al día siguiente tres satélites cruzan la misma ladera en 56 minutos y producen 99 de las 134 detecciones del evento
Y van a quedar dos. La NASA y la NOAA anunciaron que Suomi NPP deja de entregar productos a las 13:00 UTC del 1 de noviembre de 2026, fecha sujeta a cambio, y recomiendan pasarse a NOAA-20 y NOAA-21. Cuando llegue, cada tanda pierde una de sus tres miradas y las once horas a ciegas siguen midiendo lo mismo.
Una fila trae menos de lo que parece
El archivo que publico abre con una nota fija:
Detecciones de satélite (VIIRS, 375 m) en las últimas 24 horas, agregadas a celdas H3. Una detección no es un incendio: es un píxel donde el sensor vio una anomalía térmica, casi siempre fuego de vegetación y a veces un volcán, una antorcha de gas o un reflejo. Además, el mismo fuego produce varias.
Dos precisiones más viajan pegadas al dato. La coordenada marca el centro del cuadro, que no tiene por qué ser el sitio de la llama. Y el área quemada queda fuera de alcance: el propio FIRMS, el servicio de la NASA que reparte estos archivos, desaconseja calcularla así.
Está además lo que decido callar. Cada detección llega con una etiqueta de confianza, y la NASA describe la baja, de día, como típicamente asociada a reflejo solar y a una anomalía térmica relativa débil, menos de 15 K en el canal infrarrojo medio. Cuando todas las de un cuadro son dudosas, no lo dibujo: pintar calor sobre territorio poblado apoyado solo en eso pesa más que el silencio. El precio lo pago igual, porque una anomalía débil también puede ser un incendio pequeño, frío o bajo dosel. Pierde incendios, y los pierde de día.
Lo que ya estaba contado debajo
De cada uno de los diecinueve países tengo hecha de antemano una tabla de exposición: el territorio partido en celdas hexagonales y, en la fila de cada una, la población, las edificaciones, los kilómetros de vía, los colegios y puestos de salud que caen dentro y lo que cubre el suelo. Cómo la armé lo cuenta el post de sismos.
Ninguna columna sale de una encuesta mía: la población la estima GHS-POP, un modelo de la Comisión Europea que desagrega el censo sobre una retícula, y el resto viene de Overture, de OpenStreetMap, de healthsites.io y del mapa de cobertura de la ESA. Los habitantes de una celda son una estimación modelada para una época, y un cero de colegios solo dice que nadie ha mapeado uno ahí.
La armé para los sismos, y cuando entra un incendio no hay que cambiarle una fila. Lo único distinto es la geometría que llega por arriba: unos contornos de intensidad si tembló, unos cuadros calientes si arde.
La misma tabla de exposición bajo dos amenazas: por arriba entran los contornos de intensidad del ShakeMap y los cuadros calientes de VIIRS, los dos caen sobre las mismas celdas, y de ahí salen dos productos distintos: el informe por municipio y la capa de fuego activo
En la captura que abre este post, el panel de la derecha resume el continente: 409.000 personas bajo fuego activo, 39 sedes de salud y 306 sedes educativas, en 16.852 celdas encendidas con 37.914 detecciones en un día, agrupadas en 8.291 focos. Un foco es un montón de celdas encendidas que se tocan entre sí, y es lo más cerca que llego a decir la palabra incendio.
Sin audio: de la nube de detecciones al panel de un foco en Colombia.
Cuando abres uno de esos focos, el último bloque del panel es el más pobre y está al final a propósito. Trae tres cifras: las detecciones del día, los megavatios de potencia radiativa que suman y los kelvin de la temperatura de brillo más alta, con su apunte al lado, del píxel de 375 m y no de la llama. Todo lo demás de esa pantalla ya estaba medido semanas antes de que el satélite pasara.
Cómo se rehace la capa cada seis horas
Cada seis horas el sistema baja seis archivos CSV: los tres satélites por dos regiones, Sudamérica y Centroamérica, con la ventana de un día. Son estáticos y no piden llave de API, y para este proyecto eso es una restricción de diseño: la consulta por recuadro sí exige una, con tope de 5.000 transacciones cada diez minutos, y una consulta grande gasta varias, y una llave caduca, se revoca y nadie más la reproduce. El 26 de agosto probé las seis combinaciones y las seis respondieron HTTP 200.
De ahí en adelante todo pasa dentro del mismo proceso. DuckDB lee los CSV y la tabla del país en Parquet, agrupa las detecciones por celda, cuenta aparte las de confianza baja y hace un LEFT JOIN contra la tabla. Nada de esto corre en un servidor mío ni sobre una base de datos: la infraestructura son catorce workflows de GitHub Actions, y el visor es MapLibre sobre GitHub Pages.
Ese LEFT JOIN es deliberado y en él se juega media capa. Una celda con calor y nadie debajo sigue siendo información: un incendio en selva deshabitada importa. Descartarla por no tener población mezclaría dos silencios distintos, el de que no hay nadie y el de que no hay fuego.
El orden estuvo al revés
La lista de celdas iba ordenada por potencia radiativa, que es cuánta energía mide el sensor saliendo de las llamas. Parecía lo natural, y estaba al revés: hoy pone delante las que tienen población. Lo medí el 27 de agosto sobre los diecinueve países: de 14.984 celdas con calor, 3.760 tenían población, y con el corte por potencia solo 636 sobrevivían. Las 3.124 restantes tenían personas y fuego moderado, desplazadas por incendios enormes en Amazonia deshabitada. Un sistema que mide exposición y tira la mitad poblada del dato para quedarse con lo que más arde está contando otra historia.
El tope de esa lista tenía su propio problema, peor porque venía justificado por escrito: 4.000 celdas, porque publicarlas todas serían varios megabytes en cada carga del visor. Nadie lo había medido. Lo medí el 31 de agosto por red y en un navegador: GitHub Pages me lo servía comprimido. Cuatro mil celdas pesan 136 KB. Las 23.000 de un día de pico, 304 KB, sin bajar de 60 cuadros por segundo. Publicarlo todo costaba 67 KB más que el recorte que se estaba comiendo el dato.
Hoy el tope está en 60.000 y existe solo como seguro contra una temporada fuera de lo medido. Si algún día muerde, el sistema lo grita: un recorte callado volvería mentira un "esto es todo lo que arde" sin que nada falle.
Sobre qué arde, y las celdas donde no lo sé
El reparto del suelo es lo que hace interpretable un punto caliente. Un foco sobre pastizal en agosto es rutina agrícola; el mismo sobre arbolado es otra conversación, porque ni avanza igual ni se apaga igual. Ese reparto pondera por la energía medida, así que una celda de mil megavatios pesa más que diez de diez. En la captura de arriba el arbolado se lleva el 52 %, el pastizal el 26 %, los arbustos el 17 %, los cultivos el 3 % y lo construido el 1 %. De esas 16.852 celdas solo 7.423 tienen cobertura conocida: esos porcentajes están calculados sobre menos de la mitad del archivo.
El día que me senté a entender por qué, el fichero era el del 17 de septiembre a las 17:16 UTC, con 13.822 celdas publicadas y 7.398 sin cobertura. Conté aparte cuántas no cruzaban con ninguna fila de la tabla de exposición y salieron 7.397, casi las mismas. Ahí estaba la explicación: el reparto del suelo solo se resuelve donde hay fila, y una celda sin habitantes, sin edificaciones, sin vías y sin equipamiento no la tiene. Parte de esos 7.397 cae de verdad fuera de los diecinueve países. La otra parte está dentro, y el arreglo ya está escrito: que el suelo se mida también donde no hay exposición calculada. El post de Villa de Leyva lo enseña sobre un incendio concreto, once celdas de diecinueve. Sus ceros dicen "aquí no medí", y el visor tiene prohibido leerlos como "aquí no hay nadie".
Hay otro límite y la captura lo confiesa arriba: de los 8.291 focos, 3.295 salen sin país asignado. Casi dos de cada cinco. Mientras un foco no sepa dónde está no entra en ningún corte por país, y resolverlo por cercanía tiene su trampa, que ya conté en el de Villa de Leyva.
Hasta dónde llega esta capa
Esta capa no dice qué se quemó ni si alguien perdió una casa, y el visor lo avisa en la cabecera, encima de todo lo demás. Dice quién y qué estaba debajo de una detección, con la población estimada. El fichero sale cuando el satélite ya pasó: sirve para saber a quién llamar, no para avisar a nadie.
Lo que hay es el cálculo hecho por adelantado, en español y sin credenciales. Armarlo a mano el día del incendio es una jornada de SIG, y en el post de Villa de Leyva desgloso en qué se va. El resto del montaje va en su ficha.
La capa se rehace cada seis horas aunque no arda nada cerca de ti. Esas 66.806 filas del 26 de agosto traían una hora y un sitio; quién vive debajo ya estaba en la tabla.
Yo conté mal una vez, y fue en la primera frase que escribí sobre esto. El fichero del último corte está en el visor, país por país.
