Documentación
Guía de uso, funcionalidades, fuentes de datos, arquitectura y licencias de código abierto de Vigía.
Resumen
Vigía es una plataforma de código abierto para la evaluación y gestión de riesgos en tres municipios del Valle del Cauca, Colombia: Sevilla, Caicedonia y Zarzal. Cruza amenazas naturales de deslizamiento, inundación e incendio forestal con la población y la infraestructura crítica expuestas, combinando índices de amenaza estáticos con pronósticos y monitoreo en vivo de fuentes abiertas.
La aplicación no mantiene una base de datos propia: cada vista es una capa de agregación en tiempo real sobre servicios geoespaciales públicos (ArcGIS, WMS, WMTS, APIs REST) — descrito en detalle en Arquitectura y Fuentes de datos.
Guía de uso
Cuatro pasos para pasar de abrir Vigía a entender el riesgo de tu vereda, con una captura de pantalla real de cada uno. Cada paso trae además una nota técnica más corta, por si quieres saber exactamente de dónde sale cada número.
Otros detalles útiles
Funcionalidades
Qué hace cada módulo de la plataforma.
Fuentes de datos
Vigía no tiene una base de datos propia: cada vista consulta directamente estos servicios públicos, en su mayoría abiertos y sin necesidad de autenticación.
Índices de amenaza
Capas estáticas publicadas en ArcGIS Online por RED LabOT y la Secretaría de Infraestructura del Valle del Cauca — abiertas, sin autenticación.
Pronósticos y monitoreo en vivo
Servicios internacionales gratuitos de agencias científicas y ambientales, sin necesidad de clave salvo donde se indica.
Demografía y límites administrativos
Fuentes gubernamentales y de datos abiertos usadas para población, veredas y cascos urbanos.
Infraestructura
Puntos de interés comunitarios, con la misma filosofía de datos abiertos que el resto de la plataforma.
Riesgo compuesto (multiamenaza)
Sin fuente externa propia — esta categoría solo combina, en el servidor, los cuatro modelos de amenaza que ya alimentan las categorías anteriores.
Metodología: modelo propio de amenaza por deslizamiento
Cálculo propio, no un índice oficialEl color del mapa de deslizamientos ya no proviene de una capa publicada por un tercero, sino de un modelo que esta misma app calcula en el servidor. Sigue, de forma simplificada, la estructura de NASA LHASA v1 (Stanley & Kirschbaum, 2017): un factor estático de susceptibilidad del terreno combinado con un disparador dinámico de lluvia reciente. Esta sección documenta paso a paso qué dato entra en cada cálculo y exactamente cómo se procesa, para que el resultado sea auditable en vez de una caja negra.
Caché por factor
Cada insumo del modelo se cachea de forma independiente, según qué tan rápido cambia — solo la primera solicitud dentro de cada ventana de caché paga el costo completo de recalcular los ~55 centroides.
- Elevación / pendiente
- 30 días — el terreno no cambia
- Red vial (Overpass)
- 6 horas — mismo caché que el resto de capas de OpenStreetMap
- Fallas geológicas (SGC)
- 30 días — la cartografía geológica no cambia
- Inventario de movimientos en masa (SGC)
- 30 días — es un inventario histórico estático
- Lluvia / disparador
- 1 hora — los días más recientes se revisan con nuevas observaciones
Qué no es este modelo
- No es una calibración validada contra deslizamientos ocurridos en la zona — los pesos y umbrales (0.35/0.15/0.2/0.3, 0.6/0.4, 45°, 1 km, 2 km, 2 km, razón de saturación 2) son elegidos por criterio propio siguiendo la estructura de LHASA v1, no ajustados con datos locales.
- LHASA v1 usa cinco predictores estáticos; este modelo reproduce tres de ellos (pendiente, vías y fallas geológicas) y suma un cuarto factor propio (movimientos en masa históricos) que LHASA v1 no incluye. Cobertura de suelo (ESA WorldCover) — el único predictor de LHASA que sigue faltando — se evaluó pero se descartó: solo existe como archivo raster satelital (COG/GeoTIFF) sin una API de consulta por punto viable desde una función serverless. Geología/fallas y el inventario histórico se habían descartado por el mismo motivo hasta encontrar sus respectivas capas del SGC, que resultaron ser la excepción: vectores pequeños y directamente consultables, no rásteres.
- El inventario de movimientos históricos solo tiene 55 puntos en toda la zona de estudio y sin fecha de ocurrencia confiable — es evidencia real de inestabilidad pasada, pero disperso y no exhaustivo. Que una vereda quede lejos de los 55 puntos conocidos no significa que nunca haya tenido un movimiento en masa, solo que ninguno quedó registrado en este inventario.
- Se calcula en el centroide de cada vereda, no en una grilla densa — una sola pendiente y distancia a vía representan a toda la vereda, a diferencia de los ~11.721 puntos que sí tenía la capa de RED LabOT dentro de su área de cobertura.
Metodología: modelo propio de amenaza por inundación
Cálculo propio, no un índice oficialLa capa "Modelo propio de inundación" del mapa de inundaciones extiende la zonificación oficial de RED LabOT —que solo cubre el área zonificada de Sevilla y Caicedonia— a los tres municipios, incluido Zarzal, calculando un puntaje propio por vereda. La zonificación oficial no se descarta: es, al contrario, el insumo de mayor peso del modelo, donde tiene cobertura.
Caché por factor
- Zonificación oficial de inundación
- 1 hora — mismo caché que la capa pública original
- Hidrografía (quebradas y ríos)
- 30 días — el curso de un cauce cambia muy lentamente
- Pendiente / planicie
- reutilizada — es el mismo valor ya cacheado por el modelo de deslizamiento
Qué no es este modelo
- No es un modelo hidráulico ni hidrológico — no simula caudal, láminas de agua ni tiempos de llegada de una creciente. Es una susceptibilidad relativa por vereda, del mismo tipo que la zonificación oficial que extiende, no un pronóstico de inundación (para eso está el pronóstico de caudal en vivo de GEOGLOWS, ya en el mismo mapa).
- La capa de hidrografía usada para el factor de cercanía a cauces solo tiene 19 trazas con nombre — es una aproximación a la red de drenaje real, no un mapa completo de todo arroyo o canal menor.
- Los pesos y umbrales (0.5/0.3/0.2, 1 km, 8°) son elegidos por criterio propio, siguiendo la misma lógica de factores-por-distancia-e-inclinación del modelo de deslizamiento, no ajustados con datos locales de inundaciones ocurridas.
- Cada traza de cauce de la capa de hidrografía trae también un identificador (rivid) que coincide con el esquema de tramos que ya usa el pronóstico de GEOGLOWS en este mapa — un posible factor dinámico futuro (p. ej. ponderar por el período de retorno en vivo del tramo más cercano), señalado aquí pero no implementado: a diferencia de cada otro insumo de este modelo, que es una sola consulta cacheada, eso implicaría decenas de consultas individuales por tramo en cada solicitud.
Metodología: riesgo compuesto (multiamenaza)
Cálculo propio, no un índice oficialLa capa "Riesgo compuesto" combina las cuatro amenazas que esta app ya modela por vereda —deslizamientos, inundaciones (modelo propio), incendios forestales y precipitación— en una sola evaluación, siguiendo dos enfoques ya usados en la práctica internacional en vez de inventar uno nuevo: la doctrina de la OMM/GDACS de que "la amenaza más alta gobierna" para el nivel de alerta, y la composición ponderada al estilo del Índice de Riesgo INFORM para un puntaje continuo de referencia. El resultado se traduce además al marco de acción Informar/Prepararse/Actuar que ya usa IDEAM en Colombia.
Caché por insumo
Este módulo no introduce nuevas fuentes externas — cada insumo hereda el caché que ya tenía en su propia categoría.
- Deslizamientos e inundaciones
- reutilizada — mismo caché que cada modelo individual (vía aggregateVeredas)
- Incendios forestales (cruce por centroide)
- 1 hora — mismo caché que la capa AmenazaIncendios original
- Precipitación (NASA POWER, 7 días)
- 3 horas — mismo caché que /api/precipitacion/amenaza
Qué no es este modelo
- No incluye el pronóstico de caudal en vivo de GEOGLOWS. Ese pronóstico es por tramo de río, no por vereda, y cruzarlo con ~55 veredas exigiría decenas de consultas de identificación de tramo en vivo por solicitud — una integración pesada y frágil fuera del alcance de esta primera versión. La amenaza "inundaciones" en el riesgo compuesto es, en cambio, el modelo propio de inundación por vereda (zonificación + cercanía a cauce + planicie del terreno) que ya representa esa amenaza en las otras tres categorías.
- No usa un modelo de lenguaje ni la puerta de enlace de IA de esta app. El reporte narrativo es texto de plantilla determinista, relleno con los mismos números que ya se muestran en el mapa y el panel — nunca generación libre.
- Los pesos iguales de 25% por amenaza y los umbrales de nivel (0.2/0.4/0.6/0.8) son una elección de diseño razonable, no una calibración validada contra eventos multiamenaza ocurridos en la zona — igual que cada modelo individual que combina.
- Incendios y precipitación no tienen un puntaje continuo propio publicado, así que su contribución al puntaje compuesto es una aproximación ordinal (índice de nivel entre los niveles totales), no una medida continua nativa como sí lo son deslizamientos e inundaciones.
Arquitectura
Cómo está construida la plataforma, de la interfaz al dato.
Framework y renderizado
Next.js 16 (App Router) con React 19 y TypeScript. Las páginas son Server Components por defecto; los mapas y controles interactivos se marcan "use client" solo donde necesitan estado o efectos del navegador.
Acceso a datos, sin base de datos propia
Cada fuente externa tiene un módulo server-only en lib/<amenaza>/client.ts que llama directamente a su API/WMS/WMTS pública. No hay capa de persistencia: la app es una capa de agregación en vivo sobre servicios públicos ya existentes.
Rutas de API y hooks de datos
Cada módulo servidor se expone mediante una ruta en app/api/**/route.ts, que envuelve el resultado en un sobre JSON consistente ({ data } o { error }) con manejo de errores. Los componentes cliente consumen esas rutas con hooks de SWR (lib/**/use-*.ts) para caché y revalidación en el navegador.
Estrategia de caché
El caché de fetch de Next (next: { revalidate }) se ajusta por fuente según qué tan rápido cambia: FIRMS cada 15 min, capas de ArcGIS cada hora, límites administrativos cada semana, y las proyecciones del DANE no hacen ninguna llamada de red — se leen de un JSON estático versionado en el repositorio.
Mapas
Leaflet y react-leaflet, importados dinámicamente con next/dynamic({ ssr: false }) para evitar que el renderizado en servidor choque con las dependencias de window/document de Leaflet. Cada amenaza combina GeoJSON, CircleMarker, TileLayer, WMSTileLayer e ImageOverlay según la forma de su fuente.
Estilos y sistema de diseño
Tailwind CSS v4 con tokens de diseño definidos en app/globals.css (escalas de color en oklch por amenaza/categoría), componentes de shadcn/ui sobre primitivas de Base UI, y next-themes para el tema claro/oscuro/sistema.
Ventanas emergentes sin barra de navegador
lib/open-info-popup.ts abre vistas de referencia auxiliares (Demografía, Conoce tu nivel de exposición) en una ventana emergente sin menú, barra de herramientas ni barra de direcciones — para no interrumpir el mapa en vivo que el usuario tenía abierto. La documentación, en cambio, abre en una pestaña normal del navegador porque es contenido extenso pensado para desplazarse, imprimirse o guardarse como marcador.
Exportación a PDF
El botón "Exportar como PDF" del selector de exposición usa html2canvas-pro para capturar el mapa como imagen (se eligió sobre el html2canvas original, sin mantenimiento, porque este último no soporta las funciones de color CSS modernas —lab()/oklch()— que usan los tokens de Tailwind v4) y jsPDF para componer el documento final.
Despliegue
Vercel. Vercel Analytics solo se activa en producción (process.env.NODE_ENV === 'production').
Licencia y uso del código
El repositorio de Vigía es público para que cualquiera pueda leer su código, auditarlo y aprender de él, creado por Alejandro Pino (SIG · Director Técnico). La plataforma en sí — el sitio que estás usando — es de uso público y gratuito. El código fuente, en cambio, todavía no tiene una licencia de código abierto: las dependencias que trae la app sí la tienen y se listan a continuación, agrupadas por su propia licencia.





