🎯 Mobile map & mode offline
Contexte
Ce module décrit le fonctionnement de l’application mobile CerOps autour de la carte, de la géolocalisation terrain et du mode hors-ligne.
L’objectif est de permettre à un agriculteur ou à un utilisateur terrain d’exploiter ses parcelles directement depuis son téléphone, même sans réseau, tout en conservant une expérience fluide et utile sur le terrain.
L’application repose sur :
flutter_mappour la carte- des fonds de carte OSM
- une base locale embarquée
- une synchronisation automatique avec le backend dès que le réseau revient
Le mode offline ne doit pas être global à toute la plateforme, mais centré sur l’exploitation agricole sélectionnée. Lorsqu’une exploitation est choisie, l’application prépare automatiquement une zone hors-ligne couvrant ses parcelles.
Stack technique retenue
- Framework mobile : Flutter
- Carte : flutter_map
- Fond cartographique : OpenStreetMap (OSM)
- Gestion d’état : Riverpod
- Base locale : Drift
- Stockage fichiers : stockage local appareil
- Synchronisation : queue locale + sync automatique au retour réseau
- Backend cible : Fastify + oRPC
Objectif
Permettre à l’utilisateur de :
- visualiser ses parcelles sur une carte mobile
- se géolocaliser sur le terrain
- consulter et modifier des données sans connexion
- prendre des photos et créer des actions hors-ligne
- synchroniser automatiquement ses changements lorsque le réseau revient
- gérer proprement les conflits de synchronisation
Ce module résout le problème principal d’un usage terrain en zone rurale, où la couverture réseau peut être instable ou absente.
Utilisateurs concernés
- Agriculteur
- Admin
- Utilisateur terrain
Fonctionnalités (User Stories)
- En tant qu’agriculteur, je veux sélectionner mon exploitation afin de charger automatiquement ma zone de travail hors-ligne
- En tant qu’agriculteur, je veux voir mes parcelles sur une carte afin de me repérer facilement sur le terrain
- En tant qu’agriculteur, je veux me géolocaliser afin de savoir où je me trouve par rapport à mes parcelles
- En tant qu’agriculteur, je veux consulter mes actions hors-ligne afin de continuer mon travail sans connexion
- En tant qu’agriculteur, je veux modifier une parcelle hors-ligne afin de corriger des informations directement sur le terrain
- En tant qu’agriculteur, je veux créer une action hors-ligne afin de noter une intervention ou un besoin observé
- En tant qu’agriculteur, je veux prendre des photos hors-ligne afin de documenter l’état d’une parcelle
- En tant qu’utilisateur, je veux que mes données se synchronisent automatiquement dès que le réseau revient afin d’éviter une action manuelle
- En tant qu’utilisateur, je veux être averti en cas de conflit de synchronisation afin de décider quelle version conserver
Données manipulées
Entités principales
Exploitation
- id
- nom
- parcelles associées
- zone offline calculée
Parcelle
- id
- exploitationId
- nom
- géométrie
- surface
- culture
- source
- updatedAt
- syncStatus
Action
Proposition de modèle minimum :
- id
- parcelleId
- exploitationId
- type
- titre
- description
- statut
- priorite
- datePrevue
- dateRealisation
- createdAt
- updatedAt
- createdBy
- syncStatus
- conflictVersionId (optionnel)
Valeurs possibles suggérées
-
type:- observation
- intervention
- traitement
- inspection
- irrigation
- autre
-
statut:- a_faire
- en_cours
- termine
- annule
-
priorite:- basse
- moyenne
- haute
-
syncStatus:- local_only
- pending_sync
- synced
- conflict
- sync_error
Photo
- id
- parcelleId
- actionId (optionnel)
- exploitationId
- localPath
- thumbnailPath
- mimeType
- latitude (optionnel)
- longitude (optionnel)
- takenAt
- createdAt
- updatedAt
- syncStatus
ZoneOffline
- id
- exploitationId
- boundingBox
- margeMetres
- downloadedAt
- tileVersion
- status
SyncQueue
- id
- entityType
- entityId
- operationType
- payload
- createdAt
- retryCount
- lastError
- status
Champs importants
syncStatussur les entités modifiablesupdatedAtpour comparaison local / distantlocalPathetthumbnailPathpour les photos offlineboundingBoxpour définir la zone de téléchargement cartographiqueretryCountetlastErrorpour suivre les échecs de synchronisation
Relations
- 1 Exploitation → N Parcelles
- 1 Exploitation → N Actions
- 1 Exploitation → N Photos
- 1 Parcelle → N Actions
- 1 Parcelle → N Photos
- 1 Action → N Photos
- 1 Exploitation → 1 ou plusieurs zones offline (post-MVP)
API / Interfaces
Endpoints concernés
Exploitations
GET /exploitationsGET /exploitations/:id
Parcelles
GET /parcelles?exploitationId=...GET /parcelles/:idPOST /parcellesPUT /parcelles/:id
Actions
GET /actions?exploitationId=...GET /actions/:idPOST /actionsPUT /actions/:id
Photos
POST /photosGET /photos?parcelleId=...GET /photos?actionId=...
Synchronisation
POST /sync/parcellesPOST /sync/actionsPOST /sync/photosGET /sync/conflictsPOST /sync/conflicts/:id/resolve
Inputs / outputs
Entrées côté mobile
- exploitation sélectionnée
- géolocalisation utilisateur
- modifications de parcelles
- nouvelles actions
- photos prises sur le terrain
Sorties affichées
- fond de carte OSM
- polygones des parcelles
- position GPS
- liste des actions
- galerie photo liée à une parcelle ou une action
- état de synchronisation
- conflits à résoudre
Écrans / UX
Sélection d’exploitation
- écran ou modal de sélection de l’exploitation
- déclenche automatiquement la préparation offline
- affiche l’état de téléchargement de la zone
Carte principale
- fond OSM
- affichage des parcelles sous forme de polygones
- centrage sur l’exploitation
- affichage de la position utilisateur
- sélection d’une parcelle
- affichage des informations principales de la parcelle
Vue détail parcelle
- informations de la parcelle
- liste des actions liées
- photos liées
- état de synchronisation
- bouton d’édition
Mode édition parcelle
- déplacement des points du polygone
- ajout de points
- suppression de points
- sauvegarde locale immédiate
- marquage en
pending_sync
Écran actions
- liste des actions par exploitation ou parcelle
- création d’action hors-ligne
- modification du statut
- affichage du statut de synchronisation
Écran photos
- prise de photo
- génération d’une miniature pour l’interface
- association à une parcelle ou une action
- stockage local du fichier avant envoi
Écran synchronisation
- état global de la sync
- nombre d’éléments en attente
- erreurs éventuelles
- liste des conflits à résoudre
- écran de comparaison en cas de conflit
Cas limites
Offline
- les parcelles doivent être disponibles hors-ligne
- les actions doivent être consultables et créables hors-ligne
- les photos doivent pouvoir être prises sans réseau
- les miniatures doivent être générées localement pour l’UI
- l’utilisateur peut ouvrir l’application hors-ligne s’il s’est déjà authentifié auparavant
Téléchargement de zone offline
- dès qu’une exploitation est sélectionnée, l’application calcule automatiquement une zone offline
- la zone est basée sur une bounding box contenant les parcelles de l’exploitation
- une marge de 250 mètres est ajoutée autour
- cette zone sert au téléchargement des tuiles cartographiques et des données métiers liées
Limites de la zone
- si les parcelles d’une exploitation sont très éloignées les unes des autres, la bounding box peut devenir trop grande
- dans ce cas, le volume de tuiles téléchargées peut être important
- pour le MVP, cette limite est acceptée
- en post-MVP, plusieurs zones offline distinctes pourront être gérées
Erreurs
- échec de téléchargement de tuiles
- géométrie de parcelle invalide
- photo corrompue ou trop volumineuse
- perte réseau pendant synchronisation
- backend indisponible
- file de synchronisation bloquée
Données manquantes
- parcelle sans nom
- action sans description détaillée
- photo sans géolocalisation
- certaines données non critiques sont acceptables en MVP
Conflits
- si une entité a été modifiée localement et à distance entre-temps, la synchronisation est bloquée pour cette entité
- l’utilisateur doit choisir la version à conserver ou fusionner manuellement selon le type d’objet
- un conflit ne doit pas écraser silencieusement les données
Authentification offline
- l’utilisateur peut rouvrir l’application hors ligne s’il a déjà une session valide stockée localement
- aucune nouvelle connexion ne peut être faite sans réseau
- certaines actions sensibles peuvent rester indisponibles si elles nécessitent une validation serveur
Critères d’acceptation
- Le fonctionnement de la carte mobile est documenté
- L’utilisation de
flutter_mapet OSM est précisée - La stratégie de sélection d’exploitation et de téléchargement automatique de zone offline est décrite
- La zone offline basée sur une bounding box avec marge de 250 m est définie
- Les parcelles sont disponibles hors-ligne
- Les actions sont disponibles et modifiables hors-ligne
- Les photos peuvent être prises hors-ligne
- Les miniatures photo sont générées localement pour l’interface
- La géolocalisation basique est décrite
- La synchronisation automatique au retour réseau est documentée
- La gestion des conflits est documentée
- L’authentification hors-ligne après première connexion est documentée
- Les limites du MVP sont identifiées
Dépendances
- Backend → endpoints exploitations, parcelles, actions, photos, sync
- Mobile → Flutter, flutter_map, gestion état, base locale, cache fichiers
- Cartographie → OSM + cache tuiles
- Stockage local → base locale pour parcelles/actions/queue + stockage fichiers pour photos
- Auth → persistance de session locale
- Drone → usage futur des parcelles et photos terrain
- Imagerie → association future avec traitement agronomique
- Plan d’actions → création et suivi des actions liées aux parcelles
MVP vs Post-MVP
MVP
- Utilisation de
flutter_mapavec fond OSM - Sélection d’une exploitation
- Téléchargement automatique d’une zone offline à partir des parcelles
- Calcul d’une bounding box avec marge de 250 m
- Téléchargement des tuiles nécessaires à cette zone
- Affichage offline des parcelles
- Géolocalisation basique
- Consultation et création d’actions hors-ligne
- Modification de parcelles hors-ligne
- Prise de photos hors-ligne
- Génération de miniatures locales
- Synchronisation automatique dès retour du réseau
- Détection de conflit et blocage de la sync concernée
- Résolution manuelle des conflits
- Réouverture hors-ligne après authentification initiale
Post-MVP
- Gestion de plusieurs zones offline par exploitation
- Téléchargement sélectif plus fin que la bounding box
- Prévisualisation de la taille de téléchargement
- Politique de purge intelligente du cache cartographique
- Fusion assistée des conflits
- Historique complet des modifications locales
- Compression ou optimisation automatique des photos avant sync
- Synchronisation plus avancée par événements ou file distribuée
- Notifications sur l’état de synchronisation
- Support d’usages drone plus poussés sur carte offline