Initial commit : docs (specs, data-model, architecture, roadmap)
This commit is contained in:
170
docs/specs.md
Normal file
170
docs/specs.md
Normal file
@@ -0,0 +1,170 @@
|
||||
# SPECS — Sargasse-Sentry
|
||||
|
||||
## Vision Produit
|
||||
|
||||
Sargasse-Sentry est une plateforme de renseignement maritime autonome transformant des données satellites brutes en information directement exploitable pour la prise de décision terrain.
|
||||
|
||||
Le produit ne doit pas être perçu comme une carte, mais comme un **outil d'aide à la décision en environnement incertain**, avec un focus sur :
|
||||
|
||||
- anticipation
|
||||
- lisibilité immédiate
|
||||
- confiance dans la donnée
|
||||
|
||||
### Utilisateurs cibles
|
||||
|
||||
| Profil | Usage |
|
||||
|---|---|
|
||||
| Marins-pêcheurs | Décision de sortie |
|
||||
| Surfeurs | Qualité du spot |
|
||||
| Baigneurs | Sécurité / nuisance |
|
||||
|
||||
### Contraintes produit
|
||||
|
||||
- Gratuit
|
||||
- Sans inscription obligatoire (sauf alertes push, voir Roadmap V3)
|
||||
- Mobile-first
|
||||
- Compréhensible en moins de 3 secondes
|
||||
|
||||
---
|
||||
|
||||
## UX — Logique Produit
|
||||
|
||||
### Mode principal : Spot Mode
|
||||
|
||||
L'utilisateur sélectionne un point côtier → affichage :
|
||||
|
||||
| Horizon | Indicateur |
|
||||
|---|---|
|
||||
| Aujourd'hui | OK / Risque / Impact |
|
||||
| +24h | OK / Risque / Impact |
|
||||
| +48h | OK / Risque / Impact |
|
||||
|
||||
### Timeline interactive
|
||||
|
||||
Slider temporel : `Now → +6h → +12h → +24h → +48h`
|
||||
|
||||
Met à jour en temps réel :
|
||||
- les polygones sur la carte
|
||||
- le score d'impact
|
||||
|
||||
### Impact Score
|
||||
|
||||
Calcul basé sur :
|
||||
|
||||
```
|
||||
score = f(distance côte, densité, vitesse d'approche, évolution tendancielle)
|
||||
```
|
||||
|
||||
| Score | Niveau |
|
||||
|---|---|
|
||||
| 0–30 | OK |
|
||||
| 30–70 | Risque |
|
||||
| 70–100 | Impact |
|
||||
|
||||
### Visualisation
|
||||
|
||||
- Gradients radiaux pour la densité
|
||||
- Contour épais pour la lisibilité
|
||||
- Animation légère **uniquement** sur les prédictions (pas les observations)
|
||||
|
||||
### Boucle d'apprentissage (différenciateur)
|
||||
|
||||
Bouton : **"Je confirme présence de sargasses"**
|
||||
|
||||
Stocke un `UserFeedback` anonyme (localisation, timestamp, confirmation, densité estimée).
|
||||
|
||||
---
|
||||
|
||||
## Pipeline de Données
|
||||
|
||||
### Étape 1 — Ingestion
|
||||
- Cron Symfony toutes les 3h
|
||||
- Appel API Sentinel Hub
|
||||
- Récupération bandes B04 (RED), B08 (NIR), B11 (SWIR1)
|
||||
- Création d'un `DataIngestionJob`
|
||||
|
||||
### Étape 2 — Pré-traitement
|
||||
- Filtrage nuages : rejet si `cloudCoverage > seuil`
|
||||
- Seuil configurable par région (défaut 60% — peut être ajusté pour zones tropicales à forte nébulosité)
|
||||
|
||||
### Étape 3 — Calcul AFAI
|
||||
|
||||
Formule complète :
|
||||
|
||||
```
|
||||
AFAI = R_NIR - R_RED - (R_SWIR1 - R_RED) × (λ_NIR - λ_RED) / (λ_SWIR1 - λ_RED)
|
||||
```
|
||||
|
||||
- `R_*` : réflectance de surface des bandes Sentinel
|
||||
- `λ_*` : longueurs d'onde centrales (constantes fixes par capteur)
|
||||
|
||||
Résultat : raster binaire (sargasse / non-sargasse)
|
||||
|
||||
### Étape 4 — Vectorisation
|
||||
- Raster → polygones
|
||||
- Simplification Douglas-Peucker
|
||||
- Suppression du bruit (polygones < seuil surface minimal)
|
||||
|
||||
### Étape 5 — Simulation de dérive (CRITIQUE)
|
||||
|
||||
Ne pas appliquer de translation globale.
|
||||
|
||||
Algorithme :
|
||||
1. **Échantillonnage** du polygone : génération de points internes (centroids + random sampling)
|
||||
2. **Pour chaque point** : récupération vent + courant (GRIB NOAA) → application du vecteur de dérive
|
||||
3. **Reconstruction** du polygone : convex hull ou alpha shape
|
||||
4. **Génération des horizons** : H+6, H+12, H+24, H+48
|
||||
|
||||
### Sources de données
|
||||
|
||||
| Source | Usage | Notes |
|
||||
|---|---|---|
|
||||
| Sentinel-2 | Observations haute résolution | Faible fréquence |
|
||||
| Sentinel-3 | Fallback | Fréquence élevée |
|
||||
| NOAA GRIB | Vent + courant | Gratuit, accès HTTP direct |
|
||||
|
||||
---
|
||||
|
||||
## Performance
|
||||
|
||||
### Caching
|
||||
|
||||
- **Redis** : résultats API, scores d'impact
|
||||
- **HTTP Cache** : endpoints publics, tiles statiques
|
||||
- **Cloudflare free tier** (optionnel, sans coût) : CDN pour les vector tiles statiques
|
||||
|
||||
### Stratégie
|
||||
|
||||
- 1 requête = 1 zone + 1 timestamp
|
||||
- Pas de recalcul à la volée
|
||||
- Scores pré-calculés à chaque ingestion
|
||||
|
||||
---
|
||||
|
||||
## Sécurité & Résilience
|
||||
|
||||
- Retry automatique sur ingestion échouée
|
||||
- Fallback Sentinel-2 → Sentinel-3 si indisponible
|
||||
- Logs détaillés sur chaque `DataIngestionJob`
|
||||
- Monitoring des erreurs pipeline
|
||||
- Rate limiting sur les endpoints publics
|
||||
|
||||
---
|
||||
|
||||
## Roadmap
|
||||
|
||||
### MVP
|
||||
- Ingestion Sentinel-2
|
||||
- Calcul AFAI + vectorisation
|
||||
- Affichage polygones (observations uniquement)
|
||||
- Zone géographique : Antilles
|
||||
|
||||
### V2
|
||||
- Dérive H+6 / H+12 / H+24 / H+48
|
||||
- Score d'impact par `CoastalPoint`
|
||||
- Interface Spot Mode complète
|
||||
|
||||
### V3
|
||||
- Alertes push (nécessite inscription légère : push token ou email — à concevoir en minimisant la friction)
|
||||
- Boucle feedback utilisateur (`UserFeedback`)
|
||||
- Amélioration du modèle de dérive via données terrain
|
||||
Reference in New Issue
Block a user