Cette application web a pour but de visualiser en temps réel le systÚme de transport en commun de Lyon, France. Elle est composée d'un frontend en React, d'un backend en Node.js (Express) et d'une base de données PostgreSQL. L'ensemble est conteneurisé avec Docker.
L'objectif est d'afficher des informations en temps réel sur les lignes de bus, métro, tramway et funiculaire, y compris la position des véhicules et les alertes de service, sur une carte interactive.
- Installation sur mobile : Ajoutez l'application à votre écran d'accueil pour une expérience native
- Mode hors ligne : Service Worker pour un chargement rapide et une utilisation offline
- Optimisé iOS : Meta tags spécifiques pour une intégration parfaite sur iPhone/iPad
- Mémorisation de la position : La carte se souvient de votre derniÚre position et niveau de zoom
- Stockage local : Vos préférences sont sauvegardées automatiquement avec Zustand persist
- Animation 3D Flyover : Visualisation cinématique des trajets calculés avec caméra inclinée (pitch 60°)
- Carte restreinte : Vue limitée à la région lyonnaise pour éviter la navigation accidentelle
- Modal de trajet réduite : Interface mobile optimisée avec possibilité de réduire/agrandir la modal de navigation
- Centrage automatique : Positionnement parfait des éléments UI sur tous les écrans
- Frontend:
- React 18
- Zustand pour la gestion de l'état
- TanStack React Query (v4) pour le data fetching
- Mapbox-GL pour la carte interactive
- Material-UI pour les composants UI
- TypeScript
- Backend:
- Node.js avec Express
- TypeScript
- PostgreSQL comme base de données
node-cronpour la récupération planifiée des données depuis l'API GrandLyon
- DevOps:
- Docker et
docker-compose
- Docker et
L'application est entiÚrement gérée par docker-compose.
Pour construire et démarrer tous les services (frontend, backend, db) en mode détaché :
docker-compose up --build -d- Le frontend sera accessible Ă http://localhost:3000.
- L'API backend sera Ă http://localhost:5000.
L'application fonctionne en deux temps : l'initialisation des données statiques et la mise à jour continue des données temps réel.
Le répertoire backend/gtfs/ contient des fichiers texte (stops.txt, routes.txt, etc.) qui suivent la norme GTFS (General Transit Feed Specification). Ces fichiers représentent la structure fondamentale et statique du réseau de transport :
- La liste de tous les arrĂȘts.
- Le tracé de toutes les lignes.
- Les horaires théoriques.
- Les correspondances.
Ces données sont utilisées une seule fois lors de la configuration initiale du projet pour peupler les tables stops, lines, routes, etc. de la base de données. Elles servent de fondation sur laquelle les données temps réel viennent se superposer.
Les données dynamiques (positions des véhicules, alertes) sont récupérées et affichées en continu.
[ API Externe (Open Data GrandLyon) ]
|
v
[ Backend: Service d'Ingestion (node-cron) ] // RécupÚre les données toutes les X secondes/minutes
|
v
[ Base de Données (PostgreSQL) ] // Stocke et met à jour les tables (ex: vehicle_positions)
|
v
[ Backend: API (Express) ] // Expose les données via des endpoints (ex: /api/vehicles)
|
v
[ Frontend: Client (React / React Query) ] // Interroge l'API du backend à intervalle régulier
|
v
[ Interface Utilisateur (Mapbox GL) ] // Affiche et met Ă jour les icĂŽnes sur la carte
Voici une analyse détaillée des données récupérées par le service d'ingestion.
-
Alertes Trafic
- URL:
.../tcl_sytral.tclalertetrafic_2/all.json - Volume: ~236 enregistrements.
- Champs Notables:
titre,message,cause,mode,ligne_com,debut,fin.
- URL:
-
Positions des Véhicules (temps réel)
- URL:
.../siri-lite/2.0/vehicle-monitoring.json - Volume: ~412 enregistrements.
- Champs Notables:
VehicleLocation(coordonnées),Bearing(direction),Delay,VehicleRef(ID du véhicule),LineRef.
- URL:
-
Horaires Estimés (temps réel)
- URL:
.../siri-lite/2.0/estimated-timetables.json - Volume: ~1523 trajets estimés.
- Champs Notables:
RecordedAtTime,DatedVehicleJourneyRef,EstimatedCalls(liste des prochains arrĂȘts avec horaires).
- URL:
-
Stations (géographique)
- URL:
.../geoserver/sytral/ows? ... typename=sytral:tcl_sytral.tclstation - Volume: ~169 enregistrements.
- Champs Notables:
nom,desserte(lignes desservant la station).
- URL:
-
ArrĂȘts (gĂ©ographique)
- URL:
.../geoserver/sytral/ows? ... typename=sytral:tcl_sytral.tclarret - Volume: ~9799 enregistrements.
- Champs Notables:
nom,adresse,commune,pmr(accĂšs PMR),ascenseur,escalator.
- URL:
-
Lignes Bus (géographique)
- URL:
.../geoserver/sytral/ows? ... typename=sytral:tcl_sytral.tcllignebus_2_0_0 - Volume: ~1750 enregistrements.
- Champs Notables:
nom_trace,origine,destination,famille_transport,couleur.
- URL:
Le backend est une application Node.js/Express en TypeScript qui sert de proxy et de cache pour les données de l'API ouverte du GrandLyon.
Le backend expose les endpoints suivants sous le préfixe /api:
GET /stops: RĂ©cupĂšre tous les arrĂȘts de transport.GET /lines: RĂ©cupĂšre toutes les lignes de transport.GET /vehicles: RĂ©cupĂšre les positions en temps rĂ©el des vĂ©hicules.GET /alerts: RĂ©cupĂšre les alertes de trafic actuelles.GET /stops/:stop_id/next-passages: RĂ©cupĂšre les prochains passages pour un arrĂȘt donnĂ©.GET /line-icons: RĂ©cupĂšre les icĂŽnes des lignes.
La base de données PostgreSQL (lyon_transit) stocke toutes les données relatives au transport.
Stocke les alertes de trafic.
| Colonne | Type | Description |
|---|---|---|
id |
integer |
Identifiant unique de l'alerte |
alert_id |
integer |
ID de l'alerte provenant de l'API |
title |
text |
Titre de l'alerte |
message |
text |
Message détaillé de l'alerte |
Informations sur les lignes de transport.
| Colonne | Type | Description |
|---|---|---|
id |
character varying(255) |
Identifiant unique de la ligne |
line_name |
text |
Nom de la ligne |
category |
text |
Catégorie de transport (Bus, Métro, etc.) |
color |
text |
Couleur de la ligne pour l'affichage |
Informations sur les arrĂȘts.
| Colonne | Type | Description |
|---|---|---|
id |
character varying(255) |
Identifiant unique de l'arrĂȘt |
name |
character varying(255) |
Nom de l'arrĂȘt |
longitude |
double precision |
Coordonnée géographique |
latitude |
double precision |
Coordonnée géographique |
pmr_accessible |
boolean |
AccÚs pour personnes à mobilité réduite |
Positions en temps réel des véhicules.
| Colonne | Type | Description |
|---|---|---|
id |
integer |
Identifiant unique de l'enregistrement |
vehicle_ref |
character varying(255) |
Identifiant unique du véhicule |
longitude |
double precision |
Coordonnée géographique |
latitude |
double precision |
Coordonnée géographique |
bearing |
double precision |
Direction du véhicule en degrés |
delay |
character varying(255) |
Retard du véhicule (format ISO 8601) |
Before running the application, you need to set up your environment variables:
-
Copy the example files:
cp .env.example .env cp frontend/.env.example frontend/.env
-
Edit
.envandfrontend/.envwith your credentials:- Mapbox Token: Get yours at https://account.mapbox.com/access-tokens/
- TCL API Token: Contact TCL/SYTRAL or use OpenData GrandLyon API
- Database credentials: Choose secure passwords for production
See SETUP.md for detailed instructions.



