<\/HEAD>
Statische Busfahrpläne (<\/SPAN>GTFS<\/A><\/SPAN>) sind kein Vergleich zu Echtzeit-Businformationen (<\/SPAN>GTFS-realtime<\/A><\/SPAN>). Aber das bedeutet nicht, dass Sie sich mit statischen Visualisierungstechniken zufriedengeben müssen.<\/SPAN><\/P>In diesem Blog zeige ich, wie Sie ein wenig kreativ sein und Ihre statischen Fahrpläne mit Arcade zum Leben erwecken können. Und Sie werden Lust bekommen zu singen: <\/SPAN>die Räder am Bus drehen sich rund und rund<\/SPAN><\/EM><\/SPAN><\/STRONG><\/SPAN> 
<\/SPAN><\/P>
<\/SPAN><\/P>Wählen Sie einen Link unten, um die mit diesem GIF verknüpfte Webkarte anzuzeigen.<\/SPAN><\/P>Map Viewer Beta<\/SPAN><\/STRONG><\/SPAN><\/A><\/SPAN><\/P><\/LI>Map Viewer (classic)<\/SPAN><\/A><\/SPAN><\/P><\/LI><\/UL>Das <\/SPAN>GIF<\/SPAN><\/A><\/SPAN> und die <\/SPAN>Webkarte<\/SPAN><\/A><\/SPAN> zeigen Popups von <\/SPAN>kommenden Bussen<\/STRONG> und jenen gerade verpassten<\strong>. Dies ist nützlich für Buspendler, um zu verstehen, welche Dienste zu einem bestimmten Datum und einer bestimmten Uhrzeit verfügbar sind. Wir lernen, wie man diese Popup-Anzeigen aus einem GTFS feed erstellt. Anschließend wird gezeigt, wie man diese Lösung auf eine mobile friendly app erweitert, wo Pendler diese Informationen unterwegs abrufen können.
Mehr zu GTFS
A GTFS feed ist eine Sammlung von Textdateien, die jeweils eine Geschichte über Verkehrsinformationen erzählen. Für dieses Beispiel verwenden wir den GTFS feed für öffentliche Busse in Canberra, Australien.
Datenvorbereitung
Bevor Sie beginnen, klicken Sie hier, um ein ArcGIS Pro-Projektpaket mit meinen Model Builder-Konfigurationen herunterzuladen, die zur Erstellung dieser Layer verwendet wurden.
-
Zuerst konvertieren Sie die Datei stops.txt in einen hosted feature layer, indem Sie die Model Builder-Konfiguration oder das Geoverarbeitungswerkzeug GTFS stops to features verwenden. Wie der Name schon sagt, bezieht sich dies auf den Standort der Bushaltestellen.
-
Dann führen Sie das folgende Modell aus, um die Dateien stop_times.txt, trips.txt, routes.txt und calendar.txt zu verknüpfen und eine Tabelle als hosted table in ArcGIS Online zu erstellen. Dies bezieht sich auf Busankunftszeiten, Routendetails, Zugänglichkeitsinformationen sowie Datumsbereiche/Wochentage, an denen Busse verkehren.
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">
Ausdrücke erstellen (hosted table)<\/SPAN><\/H2>Sie haben vielleicht am Modell für die <\/SPAN>hosted table<\/SPAN><\/A><\/SPAN> bemerkt, dass ich ein zusätzliches Feld <\/SPAN>arrivalSeconds<\/SPAN><\/EM><\/SPAN><\/STRONG><\/SPAN> erstellt habe, um die <\/SPAN>arrival_time<\/CODE><\/SPAN> von Bussen vom <\/SPAN>hh:mm:ss<\/CODE><\/SPAN> String-Typ in eine <\/SPAN>Zahl<\/SPAN><\/EM><\/SPAN><\/STRONG><\/SPAN> umzuwandeln <\/SPAN>(Sekunden seit Tagesbeginn)<\/SPAN><\/EM><\/SPAN>. Dies wurde gemacht, um die <\/SPAN>Filterabfrage<\/SPAN><\/A><\/SPAN> (die wir später verwenden werden) zu beschleunigen, damit nur Merkmale zurückgegeben werden, die für die Tageszeit relevant sind. Wie Sie sich vorstellen können, ist es viel schneller, Zahlen abzufragen als String-Typen unterwegs zu konvertieren (besonders bei <\/SPAN>großen Datensätzen<\/SPAN><\/A><\/SPAN>). <\/SPAN><\/P>Konvertiere arrival_time in Anzahl der seit Tagesbeginn verstrichenen Sekunden<\/SPAN><\/H5>// Stunden, Minuten und Sekunden der Ankunft in ein Array trennen<\/SPAN><\/SPAN>
var<\/SPAN> separateArrival<\/SPAN> =<\/SPAN> Split<\/SPAN>($feature<\/SPAN>["arrival_time"<\/SPAN>],":"<\/Span>)<\/Span>
// Um Stundenwerte größer als 23 zu korrigieren <\/Span><\/Span>
var<\/Span> fixedHours<\/Span> =<\/Span> When<\/Span>(separateArrival<\/Span>[0<\/Span>] >=<\/Span> 24<\/Span>, separateArrival<\/Span>[0<\/Span>] -<\/Span> 24<\/Span>,
Ausdrücke erstellen (web map)
Die folgenden Ausdrücke setzen voraus, dass Sie bereits mit Arcade FeatureSets und FeatureSetByPortalItem(), veröffentlicht in Arcade 1.8, vertraut sind. Wenn Sie sich mit Featuresets vertraut machen möchten, lesen Sie diesen ausgezeichneten Blog, geschrieben von Paul Barker.
Nachdem Sie die bus stops feature layer zu einer web map hinzugefügt haben, erstellen Sie den folgenden Ausdruck, um Informationen zu den kommenden Bussen in den nächsten 60 Minuten (3600 Sekunden) zurückzugeben.
Hier ist eine bereits erstellte web map zu Ihrer Bequemlichkeit
.
Ausdruck für kommende Busse in den nächsten 60 Minuten
// Abfrage von Features aus hosted table - 'stopsTimesTripsRoutesCalendar' in 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)
// Sekunden seit Tagesbeginn vergangen
var secondsElapsed = DateDiff(Now(), startOfDayTime, 'seconds')
// gibt curr_date als Ganzzahl im Format 'YYYYMMDD' zurück #HowItShouldBe
var curr_date = Number(Text(Now(), 'YMMDD'))
// Filteranweisung (SQL) - Variablen mit @ zugreifen
// Wenn Sie das Zeitintervall ändern möchten, ändern Sie die '3600' Sekunden in der Anweisung - 'arrivalSeconds <= (@secondsElapsed + 3600)' </Span>
var filterStatement = 'arrivalSeconds >= @secondsElapsed AND arrivalSeconds <= (@secondsElapsed + 3600) AND stop_id = @stopId AND @curr_date >= start_date AND @curr_date <= end_date'</Span>
// Filtert die gtfsTable nach der Filteranweisung
// Sortiert Ergebnisse nach arrivalSeconds aufsteigend
var filtered = OrderBy(Filter(gtfsTable, filterStatement), 'arrivalSeconds ASC')
var popupResult = ''
var weekDays = ['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
// Diese Variable wird innerhalb der for-Schleife verwendet, um zu bestimmen, ob ein Bus an einem bestimmten Wochentag in Betrieb ist (z.B. gibt 1 zurück, wenn in Betrieb, 0 wenn nicht).
var currWeekdayOpr = weekDays[Weekday(Now())]
// Iteriere über die gefilterten Ergebnisse, um gewünschte Felder im Popup anzuzeigen
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, " -
",
f.wheelchair_accessible == 0 && f.bikes_allowed == 1," -
,"") + TextFormatting.NewLine + TextFormatting.NewLine
} else{
popupResult += ""
}
}
IIF(IsEmpty(popupResult), "Keine bevorstehenden Busse in der nächsten Stunde" + TextFormatting.NewLine + TextFormatting.NewLine, popupResult)
Sie können auch einen ähnlichen Ausdruck mit einer leicht modifizierten filterStatement verwenden, um Busse abzufragen, die in den letzten x Minuten abgefahren sind. Die folgende Anweisung fragt Busse ab, die in den letzten 20 Minuten (1.200 Sekunden) abgefahren sind.
var filterStatement = 'arrivalSeconds >= (@secondsElapsed - 1200) AND arrivalSeconds < @secondsElapsed AND stop_id = @stopId AND @curr_date >= start_date AND @curr_date <= end_date'</SP>
Vollständiger Ausdruck für Busse, die in den letzten 20 Minuten abgefahren sind
//Abfrage von Features aus der gehosteten Tabelle - 'stopsTimesTripsRoutesCalendar' in ArcGIS Online
var portal = Portal("https://www.arcgis.com")
var gtfsTable = FeatureSetByPortalItem(portal,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, " -
" ,
& nbsp ; & nbsp ; & nbsp ; & nbsp ; f </ Span > .rollstuhlgerecht zugänglich == 0 && f.bikes_allowed == 1, " -
" </ Span > , "") + </ Span >
& nbsp ; & nbsp ; & nbsp ; & nbsp ; TextFormatting.NewLine + TextFormatting.NewLine </ Span >
} else { </ Span >
popupResult += " " </ Span >
} </ Span >
} </ Span >
return </ Span > popupResult </ Span ></ PRE >< H2 Klasse = \ " \ " Stil = \ " Farbe :#333333;border-bottom : 1px solid#eeeeee;font-weight : fett;font-size : 1.75em;margin-top : 1rem;margin-bottom : 1rem;padding-bottom : 0.3em ; ">
Abschließende Gedanken </ Span ></ H2 >< P Klasse = \ " \ " Stil = \ " Farbe :#333333;margin : 0.8em 0px ; "> Sobald Sie die Pop-ups nach Herzenslust erstellt haben, können Sie sie weiter hervorheben, indem Sie konfigurierbare App-Vorlagen verwenden. </ Span >< Span >< Strong >< Span >< A href = \ " https://esriau.maps.arcgis.com/apps/Nearby/index.html?appid=9a85f5e143774ca6b884656bf4432acc \ " Stil = \ " Farbe:#4183c4 ; ", rel = \ " nofollow noopener noreferrer \ ", target = \ _blank > Hier klicken </ A ></ Span ></ Strong ></ Span >< Span > , um zu sehen, wie ich die obige Webkarte mit der erweitere </ Span >< Span >< A href = \ class="">Prost! - <\/SPAN>Gee Fernando<\/SPAN><\/A><\/SPAN><\/STRONG><\/SPAN><\/P><\/BODY><\/HTML>