<\/HEAD>
Les horaires de bus statiques (<\/SPAN>GTFS<\/A><\/SPAN>) ne peuvent pas rivaliser avec les informations de bus en temps réel (<\/SPAN>GTFS-realtime<\/A><\/SPAN>). Mais cela ne signifie pas que vous devez vous contenter de techniques de visualisation statiques.<\/SPAN><\/P>Dans ce blog, je vais montrer comment vous pouvez être un peu créatif et faire chanter et bouger vos horaires statiques avec Arcade. Et vous aurez envie de chanter : <\/SPAN>the wheels on the bus go round and round<\/SPAN><\/EM><\/SPAN><\/STRONG><\/SPAN> 
<\/SPAN><\/P>
<\/SPAN><\/P>Sélectionnez un lien ci-dessous pour voir la carte web associée à ce GIF.<\/SPAN><\/P>Map Viewer Beta<\/SPAN><\/STRONG><\/SPAN><\/A><\/SPAN><\/P><\/LI>Map Viewer (classic)<\/SPAN><\/A><\/SPAN><\/P><\/LI><\/UL>Le <\/SPAN>GIF<\/SPAN><\/A><\/SPAN> et la carte web<\/><\/> affichent des popups des bus à venir<\/><\/> et ceux juste récemment manqués<\/><\/>. Cela serait utile pour les usagers du bus afin de comprendre quels services sont disponibles à une date et heure données. <\/>Nous apprendrons comment créer ces affichages popup à partir d'un flux GTFS<\/><\/>. Ensuite, comment étendre cette solution à une application mobile conviviale<\/><\/>, où les usagers pourraient accéder à ces informations en déplacement <\/>.<\/> border-bottom: 1px solid #eeeeee; font-weight: bold; font-size: 1.75em; margin-top: 1rem; margin-bottom: 1rem; padding-bottom: 0.3em;" id="toc-hId-1015323073" id="toc-hId-1015323073">
Construire des expressions (hosted table)<\/SPAN><\/H2>Vous avez peut-être remarqué à partir du modèle utilisé pour la <\/SPAN>hosted table<\/SPAN><\/A><\/SPAN>, j'ai créé un champ supplémentaire <\/SPAN>arrivalSeconds<\/SPAN><\/EM><\/SPAN><\/STRONG><\/SPAN> pour calculer le <\/SPAN>arrival_time<\/CODE><\/SPAN> des bus à partir du type chaîne hh:mm:ss<\/CODE> vers un <\/SPAN>nombre<\/SPAN><\/EM><\/SPAN><\/STRONG><\/SPAN> <\/SPAN>(secondes écoulées depuis le début de la journée)<\/SPAN><\/EM><\/SPAN>. Cela a été fait pour accélérer la <\/SPAN>requête de filtre<\/SPAN><\/A><\/SPAN> (que nous utiliserons plus tard) afin de ne retourner que les entités pertinentes pour l'heure de la journée. Comme vous pouvez l'imaginer, il est beaucoup plus rapide d'interroger des nombres comparé à la conversion de types chaîne à la volée (surtout avec des <\/SPAN>ensembles de données volumineux<\/SPAN><\/A><\/SPAN>). <\/SPAN><\/P>
Convertir arrival_time en nombre de secondes écoulées depuis le début de la journée<\/SPAN><\/H5>//séparer les heures, minutes et secondes d'arrivée en un tableau<\/SPAN><\/SPAN>
var<\/SPAN> separateArrival<\/SPAN> =<\/SPAN> Split<\/Span>($feature<\/Span>[\"arrival_time\"<\/Span>],\":\"<\/Span>)<\/Span>
//Pour corriger les heures supérieures ou égales à 24 <\/Span><\/Span>
var<\/Span> fixedHours<\/Span> =<\/Span> When<\/Span>(separateArrival<\/Span>[0<\/Span>] >=<\/Span> 24<\/Span>, separateArrival<\/Span>[0<\/Span>] -<\/Span> 24<\/Span>,
(Year(Now()), Month(Now()), Day(Now()), fixedHours, separateArrival[1], separateArrival[2])
(Year(Now()), Month(Now()), Day(Now()), 0, 0, 0)
DateDiff(arrivalTimeAware, startOfDayTime, 'seconds')
arrivalSeconds
Construire des expressions (web map)
Le texte suivant suppose que vous êtes déjà familier avec les Arcade FeatureSets, et la fonction FeatureSetByPortalItem() introduite dans Arcade 1.8.
Si vous souhaitez vous familiariser avec les Featuresets, consultez ce blog excellent écrit par Paul Barker :
blog.
Après avoir ajouté la couche d'entités des arrêts de bus (bus stops feature layer) à une carte web, construisez l'expression suivante pour retourner les informations pertinentes concernant les bus à venir dans les prochaines 60 minutes (3600 secondes).
Voici une carte web (web map) déjà construite pour votre commodité
.
Expression pour les bus à venir dans les prochaines 60 minutes
//requêter les entités depuis hosted table - 'stopsTimesTripsRoutesCalendar' dans ArcGIS Online
0.1px;">var portal = Portal("https://www.arcgis.com")
var gtfsTable = FeatureSetByPortalItem(portal,"38ee59b7d5bc4173ab8786bd58ae274a", 0)
var stopId = $feature["stop_id"]
var startOfDayTime = Date(Year(Now()), Month(Now()), Day(Now()), 0, 0, 0)
//secondes écoulées depuis le début de la journée
var secondsElapsed = DateDiff(Now(), startOfDayTime, 'seconds')
varcurr_date
=Number(Text(Now(),'YMMDD'))
//si vous souhaitez changer l'intervalle de temps, changez '3600' secondes par autre chose dans l'instruction - 'arrivalSeconds var filterStatement = 'arrivalSeconds >= @secondsElapsed AND arrivalSeconds <= (@secondsElapsed + 3600) AND stop_id = @stopId AND @curr_date >= start_date AND @curr_date <= end_date'</span>
//filtrer la table gtfsTable selon l'instruction de filtre
//ordonner les résultats par arrivalSeconds en ordre croissant
var filtered = OrderBy(Filter(gtfsTable, filterStatement),'arrivalSeconds ASC')
var popupResult = ''
var weekDays = ['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
//Cette variable est utilisée dans la boucle for pour déterminer si un bus est opérationnel un jour donné de la semaine (par exemple retourne 1 si opérationnel, 0 sinon).
var currWeekdayOpr = weekDays[Weekday(Now())]
//Itérer sur les résultats filtrés pour afficher les champs désirés dans le popup
for (var f in filtered){
if (f[currWeekdayOpr] == 1){
popupResult += Left(f.arrival_time, 5) + " - " + f.route_long_name +
When(f.route_type == 712, Concatenate(" (", f.trip_headsign, ")"), Concatenate(" (", f.route_short_name, ")")) +
When(f.wheelchair_accessible == 1 && f.bikes_allowed == 1, " - 
",
f.wheelchair_accessible == 1 && f.bikes_allowed == 0," -
",
< 0 && f.bikes_allowed == 1," -
,"") + TextFormatting.NewLine + TextFormatting.NewLine
} else{
popupResult += ""
}
}
IIF(IsEmpty(popupResult), "Pas de bus à venir dans l'heure prochaine" + TextFormatting.NewLine + TextFormatting.NewLine, popupResult)
Vous pouvez également utiliser une expression similaire avec un filterStatement légèrement modifié pour interroger les bus partis dans les x dernières minutes. La déclaration ci-dessous interroge les bus partis dans les 20 dernières minutes (1 200 secondes).
var filterStatement = 'arrivalSeconds >= (@secondsElapsed - 1200) AND arrivalSeconds < @secondsElapsed AND stop_id = @stopId AND @curr_date >= start_date AND @curr_date <= end_date'
Expression complète pour les bus partis dans les 20 dernières minutes
//interroger les entités de la table hébergée - 'stopsTimesTripsRoutesCalendar' dans ArcGIS Online
var portal = Portal('https://www.arcgis.com')
var gtfsTable = FeatureSetByPortalItem(portal,'38ee59b7d5bc4173ab8786bd58ae274a', 0)
var stopId = $feature['stop_id']
var startOfDayTime = Date(Year(Now()), Month(Now()), Day(Now()), 0, 0, 0)
//secondes écoulées depuis le début de la journée </ span ></ span >
< spanclass = ''style =' color :#770088;' > var </ span > secondsElapsed </ span > = </ span > DateDiff </ span >( Now </ span > (), startOfDayTime </ span > , 'seconds' </ span > ) </ span >
< spanclass = ''style =' color
aa5500;' > //renvoyer curr_date en tant qu'entier au format 'YYYYMMDD' #HowItShouldBe </ span ></ span >
< spanclass = ''style =' color :#770088;' > var </ span > curr_date </ span > = </ span > Number </ span >( Text </ span >( Now </ span > (), 'YMMDD' </ span > )) </ span >
< spanclass = ''style =' color
aa5500;' > //déclaration du filtre (SQL) - accéder aux variables avec @ </ span ></ span >
< spanclass = ''style =' color
aa5500;' > //si vous souhaitez changer l'intervalle de temps, changez les '1200' secondes par autre chose dans la déclaration - 'arrivalSeconds >= (@secondsElapsed -1200)' </ span ></ span >
< spanclass = ''style =' color :#770088;' > var </ span > filterStatement </ span > = </ span > 'arrivalSeconds >= (@secondsElapsed -1200) AND arrivalSeconds < @secondsElapsed AND stop_id=@stopId AND @curr_date >= start_date AND @curr_date <= end_date'</ span ></ span >
< spanclass = ''style =' color
aa5500;' > //filtrer la gtfsTable par la déclaration du filtre </ span ></ span >
< spanclass = ''style =' color
aa5500;' > //ordonner les résultats par arrivalSeconds en ordre croissant </ span ></ span >
< spanclass = ''style =' color :#770088;' > var </ span > filtered </ span > = </ span > OrderBy ( Filter ( gtfsTable , filterStatement ),'arrivalSeconds ASC')</ Span ></ Span>
popupResult += Left(f.arrival_time, 5) + " - " + f.route_long_name +
When(f.route_type == 712, Concatenate(" (",f.trip_headsign,")"), Concatenate(" (",f.route_short_name,")")) +
When(f.wheelchair_accessible == 1 && f.bikes_allowed == 1, " - 
",
f.wheelchair_accessible == Santé ! - <\/SPAN>Gee Fernando<\/SPAN><\/A><\/SPAN><\/STRONG><\/SPAN><\/P><\/BODY><\/HTML>