Ajout de l'interpolation de la position des trams et bus #2

Closed
opened 2026-06-22 11:35:13 +02:00 by CyrilLeblanc · 0 comments
Owner

Interpolation de la position des trams et bus

Contexte

Lorsqu'on selectionne un cluster via le curseur en mode Explore, un drawer s'affiche en position basse. Aucune requete reseau n'est effectuee a ce moment-la : c'est uniquement a l'ouverture du drawer que les prochains passages sont fetched.

Actuellement, seuls les horaires textuels sont affiches. Aucune indication visuelle ne permet d'estimer ou se trouvent les vehicules sur la ligne.

Feature

Ajouter des curseurs animes sur le trace des lignes pour donner une estimation visuelle de la position des prochains bus et trams pour chaque arret du cluster selectionne.

Comportement attendu

  • A chaque fetch de prochains passages, les anciens curseurs sont supprimes puis remplaces par les nouveaux
  • La position de chaque curseur est mise a jour en meme temps que les horaires textuels du drawer
  • Chaque curseur est place sur le segment de ligne a une position calculee selon le temps restant avant l'arrivee a l'arret, en utilisant la vitesse moyenne du type de vehicule :
    • Bus : 20 km/h
    • Tram : 17,5 km/h
  • Ces valeurs sont volontairement simples et extensibles (configurables ulterieurement par secteur horaire)

Design du curseur

  • Forme : rond avec une petite fleche orientee vers le prochain point de la ligne en direction de l'arret selectionne
  • Couleur : celle de la ligne concernee
  • Icone : icone de la ligne
  • La fleche permet d'identifier rapidement le sens de deplacement du vehicule

Algorithme de positionnement

  1. Recuperer la geometrie de la ligne (segments points[] depuis geometries)
  2. Determiner la portion de ligne entre l'arret precedent et l'arret courant dans la sequence directionnelle
  3. Calculer la distance restante : temps_restant_secondes x vitesse_moyenne
  4. Projeter cette distance sur le segment depuis l'arret d'arrivee en remontant le trace
  5. Placer le curseur aux coordonnees interpolees (LatLng) sur ce point

Contraintes techniques

  • Aucune requete supplementaire ne doit etre effectuee -- seules les donnees du cluster deja recuperees par le drawer sont utilisees
  • L'interpolation doit etre recalculee a chaque rafraichissement des horaires (TTL 15s)
  • La position estimee n'est pas une position GPS reelle -- l'interface ne doit pas suggerer un suivi temps reel

Architecture suggeree

VehiclePositionInterpolator.kt
  +-- interpolate(stopSequence, routeGeometry, remainingTime, vehicleType) -> LatLng
  +-- calculateDistanceAlongLine(points, stopIndex) -> meters
  +-- projectBackwards(distance, segmentPoints) -> LatLng

TransitViewModel.kt (ou un gestionnaire dedie)
  +-- ecoute les stoptimes du drawer
  +-- filtre les passages valides (temps restant > 0)
  +-- appelle VehiclePositionInterpolator
  +-- met a jour une GeoJSON source MapLibre avec les positions

MapFragment / MapActivity
  +-- layer MapLibre avec icone personnalisee (rond + fleche + couleur ligne)

Criteres d'acceptance

  • Les curseurs apparaissent sur les lignes quand un drawer d'arret est ouvert
  • Les curseurs sont supprimes quand le drawer se ferme ou que les donnees sont mises a jour
  • La position est coherente avec le temps restant (pas de vehicule qui depasse l'arret)
  • La fleche indique le bon sens de deplacement
  • Aucun appel API supplementaire n'est effectue (verifiable via le network monitor)
  • Les curseurs ne persistent pas apres un changement de cluster selectionne

References

  • Algorithme d'interpolation lineaire sur polyline : Wikipedia - Linear interpolation
  • Calcul de longueur de segment : formule Haversine deja presente dans le codebase
# Interpolation de la position des trams et bus ## Contexte Lorsqu'on selectionne un cluster via le curseur en mode Explore, un drawer s'affiche en position basse. Aucune requete reseau n'est effectuee a ce moment-la : c'est uniquement a l'ouverture du drawer que les prochains passages sont fetched. Actuellement, seuls les horaires textuels sont affiches. Aucune indication visuelle ne permet d'estimer ou se trouvent les vehicules sur la ligne. ## Feature Ajouter des curseurs animes sur le trace des lignes pour donner une **estimation visuelle de la position** des prochains bus et trams pour chaque arret du cluster selectionne. ### Comportement attendu - A chaque fetch de prochains passages, les **anciens curseurs sont supprimes** puis remplaces par les nouveaux - La position de chaque curseur est **mise a jour** en meme temps que les horaires textuels du drawer - Chaque curseur est place sur le segment de ligne a une position calculee selon le temps restant avant l'arrivee a l'arret, en utilisant la **vitesse moyenne** du type de vehicule : - Bus : 20 km/h - Tram : 17,5 km/h - Ces valeurs sont volontairement simples et extensibles (configurables ulterieurement par secteur horaire) ### Design du curseur - **Forme :** rond avec une petite fleche orientee vers le prochain point de la ligne en direction de l'arret selectionne - **Couleur :** celle de la ligne concernee - **Icone :** icone de la ligne - La fleche permet d'identifier rapidement le **sens de deplacement** du vehicule ## Algorithme de positionnement 1. Recuperer la geometrie de la ligne (segments `points[]` depuis `geometries`) 2. Determiner la portion de ligne entre l'arret precedent et l'arret courant dans la sequence directionnelle 3. Calculer la distance restante : `temps_restant_secondes x vitesse_moyenne` 4. Projeter cette distance sur le segment depuis l'arret d'arrivee en remontant le trace 5. Placer le curseur aux coordonnees interpolees (`LatLng`) sur ce point ## Contraintes techniques - **Aucune requete supplementaire** ne doit etre effectuee -- seules les donnees du cluster deja recuperees par le drawer sont utilisees - L'interpolation doit etre recalculee a chaque rafraichissement des horaires (TTL 15s) - La position estimee n'est pas une position GPS reelle -- l'interface ne doit pas suggerer un suivi temps reel ## Architecture suggeree ``` VehiclePositionInterpolator.kt +-- interpolate(stopSequence, routeGeometry, remainingTime, vehicleType) -> LatLng +-- calculateDistanceAlongLine(points, stopIndex) -> meters +-- projectBackwards(distance, segmentPoints) -> LatLng TransitViewModel.kt (ou un gestionnaire dedie) +-- ecoute les stoptimes du drawer +-- filtre les passages valides (temps restant > 0) +-- appelle VehiclePositionInterpolator +-- met a jour une GeoJSON source MapLibre avec les positions MapFragment / MapActivity +-- layer MapLibre avec icone personnalisee (rond + fleche + couleur ligne) ``` ## Criteres d'acceptance - [ ] Les curseurs apparaissent sur les lignes quand un drawer d'arret est ouvert - [ ] Les curseurs sont supprimes quand le drawer se ferme ou que les donnees sont mises a jour - [ ] La position est coherente avec le temps restant (pas de vehicule qui depasse l'arret) - [ ] La fleche indique le bon sens de deplacement - [ ] Aucun appel API supplementaire n'est effectue (verifiable via le network monitor) - [ ] Les curseurs ne persistent pas apres un changement de cluster selectionne ## References - Algorithme d'interpolation lineaire sur polyline : Wikipedia - Linear interpolation - Calcul de longueur de segment : formule Haversine deja presente dans le codebase
CyrilLeblanc changed title from [feature] Ajout de l'interpolation de la position des trams et bus to Ajout de l'interpolation de la position des trams et bus 2026-06-22 11:35:59 +02:00
CyrilLeblanc added reference refs/tags/v0.3.0 2026-06-23 19:11:59 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
CyrilLeblanc/gresit#2
No description provided.