Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🎯 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_map pour 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

  • syncStatus sur les entités modifiables
  • updatedAt pour comparaison local / distant
  • localPath et thumbnailPath pour les photos offline
  • boundingBox pour définir la zone de téléchargement cartographique
  • retryCount et lastError pour 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 /exploitations
  • GET /exploitations/:id

Parcelles

  • GET /parcelles?exploitationId=...
  • GET /parcelles/:id
  • POST /parcelles
  • PUT /parcelles/:id

Actions

  • GET /actions?exploitationId=...
  • GET /actions/:id
  • POST /actions
  • PUT /actions/:id

Photos

  • POST /photos
  • GET /photos?parcelleId=...
  • GET /photos?actionId=...

Synchronisation

  • POST /sync/parcelles
  • POST /sync/actions
  • POST /sync/photos
  • GET /sync/conflicts
  • POST /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_map et 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_map avec 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