Aller au contenu

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 si hasX() est vrai (oĂč X est le nom du champ). Si hasX() renvoie false, la valeur par dĂ©faut de ce champ dĂ©finie dans la valeur gtfs-realtime.proto doit ĂȘtre supposĂ©e. Si le application rĂ©utilisatrice utilise la valeur sans vĂ©rifier d’abord la mĂ©thode hasX(), 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 aux start_dates donnĂ©s comme CANCELED. ainsi qu’une alerte avec NO_SERVICE faisant rĂ©fĂ©rence aux mĂȘmes trip_ids et TimeRange 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 les stop_time_updates marquĂ©s comme SKIPPED, Ă  moins que le trajet ne soit un trajet NOUVEAU ou DUPLICATED 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 et start_time sont dans l’intervalle exact_time=1, start_time doit ĂȘtre postĂ©rieur au dĂ©but de la intervalle par un multiple exact de headway_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 et departure ne doit pas contenir delay 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 les trip_id, start_time et start_date doivent ĂȘtre fournis. De plus, schedule_relationship doit ĂȘtre UNSCHEDULED. (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.