Bonnes pratiques GTFS Realtime¶
Introduction¶
Il sâagit de pratiques recommandĂ©es pour dĂ©crire les informations sur les transports publics en temps rĂ©el au format de donnĂ©es GTFS Realtime.
Structure du document¶
Les pratiques Recommandé sont organisées en deux sections principales
- Recommandations pratiques organisĂ©es par message : Les recommandations sont organisĂ©s par message et champ dans le mĂȘme ordre dĂ©crit dans la rĂ©fĂ©rence officielle GTFS Realtime.
- Recommandations pratiques organisĂ©es par cas : Dans des cas particuliers, tels que le service basĂ© sur les frĂ©quences (par rapport au service basĂ© sur les horaires), les pratiques peuvent devoir ĂȘtre appliquĂ© Ă plusieurs messages et champs ainsi quâaux donnĂ©es de planification GTFS correspondantes. Ces recommandations sont regroupĂ©es dans cette section.
Publication de flux et pratiques gĂ©nĂ©rales¶
- Les flux doivent ĂȘtre publiĂ©s sur une URL publique et permanente
- LâURL doit ĂȘtre directement accessible sans nĂ©cessiter de connexion pour accĂ©der au flux. Si vous le souhaitez, des clĂ©s API peuvent ĂȘtre utilisĂ©es, mais lâenregistrement des clĂ©s API doit ĂȘtre automatisĂ© et accessible Ă tous.
- Conserver des identifiants persistants (champs dâidentification) dans un flux GTFS Realtime (par exemple, FeedEntity.id, VehicleDescriptor.id, CarriageDetails.id) Ă travers les itĂ©rations du flux.
- Les flux GTFS Realtime doivent ĂȘtre actualisĂ©s au moins une fois toutes les 30 secondes, ou chaque fois que les informations reprĂ©sentĂ©es dans le flux (position dâun vĂ©hicule) changent, selon la frĂ©quence la plus Ă©levĂ©e. Les VehiclePositions ont tendance Ă changer plus frĂ©quemment que les autres entitĂ©s de flux et doivent ĂȘtre mises Ă jour aussi frĂ©quemment que possible. Si le contenu nâa pas changĂ©, le flux doit ĂȘtre mis Ă jour avec un nouveau
FeedHeader.timestamp
indiquant que les informations sont toujours pertinentes Ă partir de cet horodatage. - Les donnĂ©es dâun flux GTFS Realtime ne doivent pas dater de plus de 90 secondes pour les mises Ă jour de trajet et les positions des vĂ©hicules et de pas plus de 10 minutes pour les alertes de service. Par exemple, mĂȘme si un producteur actualise continuellement lâhorodatage
FeedHeader.timestamp
toutes les 30 secondes, lâĂąge des VehiclePositions dans ce flux ne doit pas dĂ©passer 90 secondes. - Le serveur hĂ©bergeant les donnĂ©es GTFS Realtime doit ĂȘtre fiable et renvoyer systĂ©matiquement des rĂ©ponses codĂ©es en protobuf correctement formatĂ©es. Moins de 1 % des rĂ©ponses doivent ĂȘtre invalides (erreurs de protobuf ou erreurs de rĂ©cupĂ©ration).
- Le serveur Web hĂ©bergeant les donnĂ©es GTFS Realtime doit ĂȘtre configurĂ© pour signaler correctement la date de modification du fichier (voir HTTP/1.1- Demande de commentaires 2616, sous la section 14.29) afin que les consommateurs puissent exploiter lâen-tĂȘte HTTP
If-Modified-Since
. Cela permet aux producteurs et aux consommateurs dâĂ©conomiser de la bande passante en Ă©vitant de transfĂ©rer le contenu du flux qui nâa pas changĂ©. - Les flux doivent fournir par dĂ©faut un contenu de flux codĂ© par tampon de protocole lorsquâils sont interrogĂ©s via une requĂȘte HTTP Ă lâURL donnĂ©e- les consommateurs ne devraient pas avoir besoin de dĂ©finir des en-tĂȘtes dâacceptation HTTP spĂ©ciaux pour recevoir du contenu codĂ© par tampon de protocole.
- En raison de la façon dont les tampons de protocole encodent les valeurs facultatives, avant de lire les donnĂ©es dâun flux GTFS Realtime, les consommateurs doivent vĂ©rifier la prĂ©sence de valeurs en utilisant les mĂ©thodes
hasX()
gĂ©nĂ©rĂ©es par le tampon de protocole avant dâutiliser cette valeur et ne doit utiliser la valeur que sihasX()
est vrai (oĂčX
est le nom du champ). SihasX()
renvoiefalse
, la valeur par défaut de ce champ définie dans la valeurgtfs-realtime.proto
doit ĂȘtre supposĂ©e. Si le application rĂ©utilisatrice utilise la valeur sans vĂ©rifier dâabord la mĂ©thodehasX()
, il se peut quâil lise des donnĂ©es par dĂ©faut qui nâont pas Ă©tĂ© intentionnellement publiĂ©es par le producteur. - Les flux doivent utiliser HTTPS au lieu de HTTP (sans cryptage) pour garantir lâintĂ©gritĂ© du flux.
- Les flux doivent couvrir la grande majoritĂ© des dĂ©placements inclus dans lâensemble de donnĂ©es GTFS statique associĂ©. En particulier, il devrait inclure des donnĂ©es sur les zones urbaines Ă forte densitĂ© et Ă fort trafic ainsi que sur les itinĂ©raires trĂšs frĂ©quentĂ©s.
Recommandations pratiques organisĂ©es par message¶
FeedHeader¶
Nom du champ | Recommandation |
---|---|
gtfs_realtime_version |
La version actuelle est "2.0". Tous les flux GTFS Realtime doivent ĂȘtre « 2.0 » ou supĂ©rieur, car la premiĂšre version de GTFS Realtime ne nĂ©cessitait pas tous les champs nĂ©cessaires pour reprĂ©senter de maniĂšre adĂ©quate diverses situations de transit. |
timestamp |
Cet horodatage ne doit pas diminuer entre deux itérations de flux séquentielles. |
Cette valeur dâhorodatage doit toujours changer si le contenu du flux change- le contenu du flux ne doit pas changer sans mettre Ă jour lâen-tĂȘte timestamp .Erreurs courantes : Sâil existe plusieurs instances de flux GTFS Realtime derriĂšre un Ă©quilibreur de charge, chaque instance peut extraire des informations de la source de donnĂ©es en temps rĂ©el et les publier lĂ©gĂšrement de maniĂšre dĂ©synchronisĂ©e. Si un application rĂ©utilisatrice GTFS Realtime effectue deux requĂȘtes consĂ©cutives et que chaque requĂȘte est traitĂ©e par une instance de flux GTFS Realtime diffĂ©rente, le mĂȘme contenu de flux pourrait potentiellement ĂȘtre renvoyĂ© au application rĂ©utilisatrice avec des horodatages diffĂ©rents. Solution possible - Les producteurs doivent fournir un en-tĂȘte HTTP Last-Modified et les consommateurs doivent transmettre leur en-tĂȘte HTTP If-Modified-Since le plus rĂ©cent pour Ă©viter de recevoir des donnĂ©es obsolĂštes.Solution possible - Si les en-tĂȘtes HTTP ne peuvent pas ĂȘtre utilisĂ©s, des options telles que les sessions persistantes peuvent ĂȘtre utilisĂ©es pour garantir que chaque application rĂ©utilisatrice est acheminĂ© vers le mĂȘme serveur producteur. |
FeedEntity¶
Toutes les entitĂ©s ne doivent ĂȘtre supprimĂ©es dâun flux GTFS Realtime que lorsquâelles ne sont plus pertinentes pour les utilisateurs. Les flux sont considĂ©rĂ©s comme apatrides, ce qui signifie que chaque flux reflĂšte lâintĂ©gralitĂ© de lâĂ©tat en temps rĂ©el du systĂšme de transport en commun. Si une entitĂ© est fournie dans une instance de flux mais supprimĂ©e lors dâune mise Ă jour de flux ultĂ©rieure, il convient de supposer quâil nâexiste aucune information en temps rĂ©el pour cette entitĂ©.
Nom du champ | Recommandation |
---|---|
id |
Doit rester stable pendant toute la durée du voyage |
TripUpdate¶
Directives générales pour les annulations de voyage :
- Lors de lâannulation de voyages sur plusieurs jours, les producteurs doivent fournir des TripUpdates faisant rĂ©fĂ©rence aux
trip_ids
et auxstart_dates
donnés commeCANCELED
. ainsi quâune alerte avecNO_SERVICE
faisant rĂ©fĂ©rence aux mĂȘmestrip_ids
etTimeRange
qui peuvent ĂȘtre montrĂ©es aux passagers expliquant lâannulation (par exemple, un dĂ©tour). - Si aucun arrĂȘt dâun trajet nâest visitĂ©, le trajet doit ĂȘtre
CANCELED
au lieu dâavoir tous lesstop_time_updates
marqués commeSKIPPED
, Ă moins que le trajet ne soit un trajetNOUVEAU
ouDUPLICATED
et quâil ait Ă©tĂ© annulĂ© par la suite.
Nom du champ | Recommandation |
---|---|
trip |
Reportez-vous au message TripDescriptor. |
Si des flux VehiclePosition et TripUpdate distincts sont fournis, lâappariement des valeurs dâID TripDescriptor et VehicleDescriptor doit correspondre entre les deux flux.Par exemple, une entitĂ© VehiclePosition a vehicle_id:A et trip_id:4 , alors lâentitĂ© TripUpdate correspondante doit Ă©galement avoir vehicle_id:A et trip_id:4 . Si une entitĂ© TripUpdate a trip_id:4 et un vehicle_id autre que 4, il sâagit dâune erreur. |
|
vehicle |
Reportez-vous au message VehicleDescriptor. |
Si des flux VehiclePosition et TripUpdate distincts sont fournis, lâappariement des valeurs dâID TripDescriptor et VehicleDescriptor doit correspondre entre les deux flux.Par exemple, une entitĂ© VehiclePosition a vehicle_id:A et trip_id:4 , alors lâentitĂ© TripUpdate correspondante doit Ă©galement avoir vehicle_id:A et trip_id:4 . Si une entitĂ© TripUpdate a trip_id:4 et un vehicle_id autre que 4, il sâagit dâune erreur. |
|
stop_time_update |
stop_time_updates pour un trip_id donnĂ© doit ĂȘtre strictement ordonnĂ© en augmentant stop_sequence et aucune stop_sequence ne doit ĂȘtre rĂ©pĂ©tĂ©e. |
Pendant que le voyage est en cours, toutes les TripUpdates doivent inclure au moins une stop_time_update avec une heure dâarrivĂ©e ou de dĂ©part prĂ©vue dans le futur. Notez que la spĂ©cification GTFS Realtime indique que les producteurs ne doivent pas abandonner un StopTimeUpdate passĂ© sâil fait rĂ©fĂ©rence Ă un arrĂȘt avec une heure dâarrivĂ©e prĂ©vue dans le futur pour le voyage donnĂ©. (câest-Ă -dire que le vĂ©hicule a franchi lâarrĂȘt plus tĂŽt que prĂ©vu), sinon on conclura quâil nây a pas de mise Ă jour pour cet arrĂȘt. |
|
timestamp |
Doit reflĂ©ter lâheure Ă laquelle cette prĂ©vision pour ce voyage a Ă©tĂ© mise Ă jour. |
delay |
TripUpdate.delay doit reprĂ©senter lâĂ©cart dâhoraire, câest-Ă -dire la valeur passĂ©e observĂ©e pour lâavance/le retard du vĂ©hicule par rapport Ă lâhoraire. Les prĂ©visions pour les arrĂȘts futurs doivent ĂȘtre fournies via StopTimeEvent.delay ou StopTimeEvent.time . |
TripDescriptor¶
Si des flux distincts VehiclePosition
et TripUpdate
sont fournis, lâappariement des valeurs dâID TripDescriptor et VehicleDescriptor doit correspondre entre les deux flux.
Par exemple, une entité VehiclePosition
a vehicle_id:A
et trip_id:4
, alors lâentitĂ© TripUpdate
correspondante doit également avoir vehicle_id:A
et trip_id:4
.
Nom du champ | Recommandation |
---|---|
schedule_relationship |
Le comportement des voyages « ADDED  » nâest pas spĂ©cifiĂ© et lâutilisation de cette Ă©numĂ©ration nâest pas recommandĂ©e.Si le trajet nâest pas prĂ©vu pour sâexĂ©cuter Ă lâorigine, utilisez « NOUVEAU » sâil ne suit pas le modĂšle dâarrĂȘt dâun trajet existant, ou « DUPLICATED  » sâil sâagit dâune copie dâun trajet existant.Si le trajet sâeffectue selon un horaire ou des arrĂȘts modifiĂ©s, mais peut ĂȘtre associĂ© Ă un trajet planifiĂ© dâorigine dans le GTFS statique, utilisez REPLACEMENT et spĂ©cifiez la liste complĂšte des horaires dâarrĂȘts pour le trajet modifiĂ©. |
TripProperties¶
Nom du champ | Recommandation |
---|---|
trip_headsign |
Doit toujours ĂȘtre fourni pour un trajet avec TripDescriptor.schedule_relationship = NEW , et fourni pour un trajet avec TripDescriptor.schedule_relationship = REPLACEMENT si le trajet est dĂ©viĂ©. |
VehicleDescriptor¶
Si des flux distincts VehiclePosition
et TripUpdate
sont fournis, lâappariement des valeurs dâID TripDescriptor et VehicleDescriptor doit correspondre entre les deux.se nourrit.
Par exemple, une entité VehiclePosition
a vehicle_id:A
et trip_id:4
, alors lâentitĂ© TripUpdate
correspondante doit également avoir vehicle_id:A
et trip_id:4
.
Nom du champ | Recommandation |
---|---|
id |
Doit identifier un véhicule de maniÚre unique et stable sur toute la durée du voyage |
StopTimeUpdate¶
Nom du champ | Recommandation |
---|---|
stop_sequence |
Fournissez stop_sequence chaque fois que possible, car il se rĂ©sout sans ambiguĂŻtĂ© en une heure dâarrĂȘt GTFS dans stop_times.txt contrairement Ă stop_id , qui peut se produire plus dâune fois dans un trajet (par exemple, un itinĂ©raire en boucle). |
arrival |
Les temps dâarrivĂ©e entre les arrĂȘts sĂ©quentiels devraient augmenter- ils ne devraient pas ĂȘtre les mĂȘmes ni diminuer. |
time dâarrivĂ©e (spĂ©cifiĂ©e dans StopTimeEvent) doit ĂȘtre antĂ©rieure Ă lâ time de dĂ©part pour le mĂȘme arrĂȘt si une escale ou un temps dâarrĂȘt est prĂ©vu- sinon, time dâarrivĂ©e doit ĂȘtre la mĂȘme que celle de time . |
|
departure |
Les temps de dĂ©part entre les arrĂȘts sĂ©quentiels devraient augmenter- ils ne devraient pas ĂȘtre les mĂȘmes ni diminuer. |
time de dĂ©part (spĂ©cifiĂ©e dans StopTimeEvent) doit ĂȘtre la mĂȘme que lâ time dâarrivĂ©e pour le mĂȘme arrĂȘt si aucune escale ou temps dâarrĂȘt nâest prĂ©vu- sinon, time de dĂ©part doit ĂȘtre aprĂšs lâ time . |
StopTimeEvent¶
Nom du champ | Recommandation |
---|---|
delay |
Si seul delay est fourni dans une stop_time_update arrival ou departure (et non time ), alors le GTFS stop_times.txt doit contenir arrival_times et/ou departure_times pour ces arrĂȘts correspondants. Une valeur delay dans le flux en temps rĂ©el nâa de sens que si vous disposez dâune heure Ă laquelle lâajouter dans le fichier GTFS stop_times.txt . |
scheduled_time |
Si le trajet est un trajet nouveau ou de remplacement, et quâil est exĂ©cutĂ© selon un planning (qui peut ĂȘtre un planning modifiĂ© en cas de trajet de remplacement), « scheduled_time » doit ĂȘtre fourni pour tous les points temporels. Si les trajets dupliquĂ©s ont des temps dâexĂ©cution ou de sĂ©jour diffĂ©rents de lâoriginal, « scheduled_time » peut Ă©galement ĂȘtre utilisĂ© pour les spĂ©cifier. |
VehiclePosition¶
Voici les champs recommandĂ©s qui devraient ĂȘtre inclus dans un flux VehiclePostions afin de fournir aux consommateurs des donnĂ©es de haute qualitĂ© (par exemple, pour gĂ©nĂ©rer des prĂ©dictions)
Nom du champ | Remarques |
---|---|
entity.id |
Doit rester stable pendant toute la durée du voyage |
vehicle.timestamp |
Il est fortement recommandĂ© de fournir lâhorodatage auquel la position du vĂ©hicule a Ă©tĂ© mesurĂ©e. Dans le cas contraire, les consommateurs doivent utiliser lâhorodatage du message, ce qui peut donner des rĂ©sultats trompeurs pour les coureurs lorsque le dernier message a Ă©tĂ© mis Ă jour plus frĂ©quemment que la position individuelle. |
vehicle.vehicle.id |
Doit identifier un véhicule de maniÚre unique et stable sur toute la durée du voyage |
Position¶
La position du vĂ©hicule doit ĂȘtre Ă moins de 200 mĂštres des donnĂ©es GTFS shapes.txt
pour le trajet en cours, sauf sâil y a une alerte avec lâeffet DETOUR
pour ce trip_id
.
Alerte¶
Directives générales pour les alertes :
- Lorsque
trip_id
etstart_time
sont dans lâintervalleexact_time=1
,start_time
doit ĂȘtre postĂ©rieur au dĂ©but de la intervalle par un multiple exact deheadway_secs
. - Lors de lâannulation de voyages sur plusieurs jours, les producteurs doivent fournir des TripUpdates faisant rĂ©fĂ©rence aux mĂȘmes «
trip_ids
» et «start_dates
» comme «CANCELED
» ainsi quâune alerte avec «NO_SERVICE
» faisant rĂ©fĂ©rence aux mĂȘmes «trip_ids
» et «TimeRange
» que peut ĂȘtre montrĂ© aux passagers pour expliquer lâannulation (par exemple, un dĂ©tour). - Si une alerte affecte tous les arrĂȘts dâune ligne, utilisez une alerte basĂ©e sur la ligne au lieu dâune alerte basĂ©e sur lâarrĂȘt. Nâappliquez pas lâalerte Ă chaque arrĂȘt de la ligne.
- Bien quâil nây ait pas de limite de caractĂšres pour les alertes de service, les usagers des transports en commun consulteront souvent les alertes sur leurs appareils mobiles. Veuillez ĂȘtre concis.
Nom du champ | Recommandation |
---|---|
description_text |
Utilisez des sauts de ligne pour faciliter la lecture de votre alerte de service. |
Recommandations pratiques organisĂ©es par cas dâutilisation¶
DĂ©placements basĂ©s sur la frĂ©quence¶
Un voyage basé sur la fréquence ne suit pas un horaire fixe mais tente de maintenir des avancées prédéterminées. Ces déplacements sont indiqués dans Fréquence GTFS .txt en définissant exact_times=0
ou en omettant le champ exact_times
(notez que les trajets exact_times=1
sont * PAS* les trajets basés sur la fréquence- frequencies.txt
avec exact_times=1
est simplement utilisĂ© comme mĂ©thode pratique pour stocker les trajets basĂ©s sur un horaire de maniĂšre plus compacte). Il existe plusieurs bonnes pratiques Ă garder Ă lâesprit lors de la crĂ©ation de flux GTFS Realtime pour les trajets basĂ©s sur la frĂ©quence.
-
Dans TripUpdate. StopTimeUpdate, le StopTimeEvent pour
arrival
etdeparture
ne doit pas contenirdelay
car les trajets basés sur la fréquence ne suivent pas un horaire fixe. Au lieu de cela,time
ââdoit ĂȘtre fourni pour indiquer les prĂ©visions dâarrivĂ©e/dĂ©part. -
Comme lâexige la spĂ©cification, lors de la description
trip
» dans TripUpdate ou VehiclePosition en utilisant TripDescriptor, tous lestrip_id
,start_time
etstart_date
doivent ĂȘtre fournis. De plus,schedule_relationship
doit ĂȘtreUNSCHEDULED
. (par exemple, voyages de renforcement).
Ă propos de ce document¶
Objectifs¶
Les objectifs du maintien des bonnes pratiques GTFS Realtime sont les suivants :
- AmĂ©liorer lâexpĂ©rience client de lâutilisateur final dans les applications de transports publics
- Faciliter le dĂ©ploiement et la mise Ă lâĂ©chelle des applications, des produits et des services par les dĂ©veloppeurs de logiciels
Comment proposer ou modifier les bonnes pratiques GTFS Realtime publiĂ©es¶
Les applications et pratiques GTFS Ă©voluent, et ce document peut donc doivent ĂȘtre modifiĂ©s de temps en temps. Pour proposer un amendement Ă ce document, ouvrez une pull request dans le rĂ©pertoire GitHub GTFS Realtime Best Practices et plaidez en faveur du changement.
Lien vers ce document¶
Veuillez crĂ©er un lien ici afin de fournir aux producteurs dâaliments pour animaux des conseils pour la formation correcte des donnĂ©es GTFS Realtime. Chaque recommandation individuelle a un lien dâancrage. Cliquez sur la recommandation pour obtenir lâURL du lien dâancrage dans la page.
Si une application consommant GTFS Realtime formule des exigences ou des recommandations concernant les pratiques de données GTFS Realtime qui ne sont pas décrites ici, il est recommandé de publier un document contenant ces exigences ou recommandations pour compléter ces bonnes pratiques communes.