Alcance¶
Detrás del mapa, el sistema es un registro de observaciones con análisis versionados. Todo el modelo gira alrededor de una pregunta: qué hectáreas de manglar dejaron de inundarse con la marea, y con qué certeza. Las regiones, los productos, las mareas y los insumos existen para responderla; las corridas guardan cada respuesta sin pisar la anterior.
Las cuatro fuerzas que dominan el diseño:
- El dato de NASA cambia debajo del sistema. NISAR publica productos provisionales, luego validados, y reprocesará las fechas viejas con versiones de procesamiento nuevas. El modelo guarda la madurez y el CRID de cada producto, reemplaza sin borrar y nunca mezcla madurezas en una corrida.
- Un resultado sin su procedencia no vale. Cada corrida apunta a las adquisiciones, los insumos y la versión de umbrales exactos que usó. Publicar otra corrida no altera la anterior, y un enlace compartido sigue mostrando lo mismo.
- Lo pesado vive en disco, lo consultable en la base. Los recortes HDF5 y las grillas agregadas son archivos con su suma SHA-256. PostgreSQL guarda sus metadatos y los resultados por celda que la API lee.
- La incertidumbre es parte del dato. La probabilidad de error, la confianza del cambio y la suficiencia de fechas de marea alta son columnas, no notas al pie. El modelo impide publicar una desconexión sin ellas.
Diagrama conceptual¶
---
config:
elk:
nodePlacementStrategy: NETWORK_SIMPLEX
fontFamily: monospace
layout: elk
---
erDiagram
Region ||--o{ Celda : "se divide en"
Region ||--o{ Recorte : "recorta"
Producto ||--o{ Recorte : "se recorta en"
Region ||--o{ Adquisicion : "observa"
Adquisicion ||--|{ AdquisicionRecorte : "combina"
Recorte ||--o| AdquisicionRecorte : "forma"
Adquisicion |o--o| Adquisicion : "reemplaza a"
Adquisicion ||--o{ EstimacionMarea : "tiene"
Region ||--o{ LluviaDiaria : "registra"
Region ||--o{ Insumo : "usa"
Insumo ||--o{ Estanque : "digitaliza"
Region ||--o{ Sincronizacion : "se sincroniza en"
Region ||--o{ Corrida : "se analiza en"
PerfilUmbrales ||--o{ Corrida : "parametriza"
Corrida ||--|{ CorridaFecha : "incluye"
Adquisicion ||--o{ CorridaFecha : "entra en"
Corrida ||--o{ CorridaInsumo : "fija"
Insumo ||--o{ CorridaInsumo : "se fija en"
Corrida ||--o{ ResultadoCelda : "produce"
Celda ||--o{ ResultadoCelda : "se mide en"
Corrida ||--o{ ResumenPais : "resume"
CorridaFecha ||--o{ ResumenFecha : "resume"
Corrida ||--o{ PruebaHipotesis : "evalúa"
Corrida ||--o{ ResultadoEstanque : "clasifica"
Estanque ||--o{ ResultadoEstanque : "se clasifica en"
Corrida ||--o{ Artefacto : "publica"
Módulos¶
| Módulo | App de Django | Contenido |
|---|---|---|
| Regiones | mangroove_regiones |
Region, Celda |
| Adquisiciones | mangroove_adquisiciones |
Producto, Recorte, Adquisicion, AdquisicionRecorte, Brecha, Sincronizacion |
| Insumos | mangroove_insumos |
Insumo, Estanque, SerieCargada, EstimacionMarea, LluviaDiaria |
| Análisis | mangroove_analisis |
PerfilUmbrales, Corrida, CorridaFecha, CorridaInsumo, resultados |
| Publicación | mangroove_publicacion |
Artefacto |
Las cuentas, la autenticación, la bitácora y los archivos en Bunny son del
template (api_auth, api_core, api_media) y no se modifican.
Restricciones del alcance¶
| Restricción | Origen | Consecuencia en el modelo |
|---|---|---|
| Solo NISAR L2 GCOV y GUNW | RF-M-01 |
Producto no modela productos de nivel 0 ni 1, ni la banda S |
| Una proyección UTM por región | RN-03 |
Una región que cruza dos zonas UTM usa la de su centroide |
| Celdas cuadradas fijas | RN-03 |
No hay celdas de tamaño variable ni jerarquías de celdas |
| Sin interfaz gráfica de operación | RF-O-01 |
Toda operación pasa por la API y los comandos de gestión |
| Los sensores auxiliares son insumos | RF-C-06 |
Sentinel-1 y Sentinel-2 no tienen ingesta automática; se cargan como insumo |
Fuera de alcance¶
| Funcionalidad | Estado |
|---|---|
| Cuentas para el público | Sin requerimiento: todos los datos son abiertos |
| Alertas al público por correo o SMS | Sin requerimiento: la app publica hallazgos, no avisos |
| Edición de datos por terceros | Sin requerimiento: solo el operador escribe datos |
| Titularidad de estanques y bordas | Excluido por RN-16 |
| Interferometría y deformación (GUNW completo) | Solo se usa la coherencia, por RF-M-09 |
| Relato guiado y textos en dos idiomas | Responsabilidad del frontend |
Invariantes críticos¶
Garantías que no pueden fallar. Todas son estructurales: viven en la base de datos, no en un servicio.
| Invariante | Mecanismo | Regla |
|---|---|---|
| Una corrida no mezcla madurezas | trg_corridafecha_madurez_coherente |
RN-01 |
| Una pasada tiene a lo sumo una adquisición vigente | unq_adquisicion_pasada_vigente |
RN-02 |
| La grilla de una región no cambia | trg_readonly_grilla |
RN-03 |
Sin datos suficientes no hay if_alta |
chk_resultadocelda_ifalta_suficiente |
RN-10 |
| Fuera de la máscara no hay métricas | chk_resultadocelda_fuera_mascara |
RN-12 |
| Un cambio publicado trae fecha, confianza y delta | chk_resultadocelda_cambio_completo |
RN-13 |
| Los resultados de una corrida no se editan | trg_resultado_solo_insercion |
RN-14 |
| Una región tiene a lo sumo una vigente | unq_corrida_region_vigente |
RN-15 |