171 lines
4.4 KiB
Markdown
171 lines
4.4 KiB
Markdown
# 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
|