<\/HEAD>
静的なバス時刻表(<\/SPAN>GTFS<\/A><\/SPAN>)はリアルタイムのバス情報(<\/SPAN>GTFS-realtime<\/A><\/SPAN>)には敵いません。しかし、それは静的な視覚化技術に妥協しなければならないという意味ではありません。<\/SPAN><\/P>このブログでは、少し創造的になってArcadeを使って静的な時刻表を歌わせて動かす方法を紹介します。そして、あなたは歌いたくなるでしょう:<\/SPAN>the wheels on the bus go round and round<\/SPAN><\/EM><\/SPAN><\/STRONG><\/SPAN> 
<\/SPAN><\/P>
<\/SPAN><\/P>以下のリンクを選択して、このGIFに関連付けられたウェブマップを表示してください。<\/SPAN><\/P>Map Viewer Beta<\/SPAN><\/STRONG><\/SPAN><\/A><\/SPAN><\/P><\/LI>Map Viewer (classic)<\/SPAN><\/A><\/SPAN><\/P><\/LI><\/UL>この <\/SPAN>GIF<\/SPAN><\/A><\/SPAN> と <\/SPAN>ウェブマップ<\/SPAN><\/A><\/SPAN>は、今後のバス<\/STRONG>と直近に逃したバス<\/STRONG>のポップアップを表示しています。これはバス通勤者が特定の日付と時間に利用可能なサービスを理解するのに役立ちます。私たちはこれらのポップアップ表示をGTFSフィードから作成する方法を学びます。その後、このソリューションを拡張して、通勤者が外出先でこの情報にアクセスできるようにするモバイルフレンドリーアプリの作成方法について説明します。
GTFSについてもっと知る
GTFSフィードは、交通情報についての物語を伝える複数のテキストファイルの集合体です。この例では、オーストラリア・キャンベラの公共バス用GTFSフィードを使用します。
データ準備
開始する前に、こちらをクリックして、これらのレイヤー作成に使用したモデルビルダー構成が含まれるArcGIS Proプロジェクトパッケージをダウンロードしてください。
式を作成する (hosted table)<\/SPAN><\/H2>で使用されているモデルからお気づきかもしれませんが、hosted table<\/A><\/SPAN>に、追加のフィールド arrivalSeconds<\/EM><\/SPAN><\/STRONG><\/SPAN> を作成しました。これはバスの arrival_time を hh:mm:ss の文字列型から number 型((日の開始からの経過秒数))に変換して計算するためです。これは後で使用する filter query を高速化し、時間帯に関連するフィーチャのみを返すために行いました。ご想像の通り、文字列型をその場で変換するよりも数値でクエリを実行した方がはるかに高速です(特にlarge datasetsの場合)。<\/SPAN><\/P>arrival_time を日の開始からの経過秒数に変換する方法<\/SPAN><\/H5>// arrival の時、分、秒を配列に分割する<\/SPAN><\/SPAN>
var<\/SPAN> separateArrival<\/SPAN> =<\/SPAN> Split<\/SPAN>($feature<\/SPAN>["arrival_time"<\/SPAN>],":"<\/SPAN>)<\/SPAN>
// 23 時以上の時間を修正するための処理<\/SPAN><\/SPAN>
var<\/SPAN> fixedHours<\/SPAN> =<\/SPAN> When<\/Span>(separateArrival[0] >= 24, separateArrival[0] - 24, separateArrival[0])<\/Span>
// arrival_time を 'String' 型から 'Date' 型に変換する<\/Span><\/Span>
var<\/Span> arrivalTimeAware<\/Span> =<\/Span> Date(Year(Now()), Month(Now()), Day(Now()), fixedHours, separateArrival[1], separateArrival[2])<\/Span>
var<\/Span> startOfDayTime<\/Span> =<\/Span> Date(Year(Now()), Month(Now()), Day(Now()), 0, 0, 0)<\/Span>
// arrival_time を日の開始からの経過秒数に変換する処理 <\/Span><\/span>
var arrivalSeconds
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)
//一日の開始から経過した秒数
var secondsElapsed = DateDiff(Now(), startOfDayTime, 'seconds')
//現在の日付を 'YYYYMMDD' の形式で整数として返す #HowItShouldBe>
var curr_date = Number( Text( Now(),'YMMDD') )
//フィルタ文 (SQL) - 変数には @ を使ってアクセスする ></ span >
< spanclass = " "style = " color
aa5500 ; " > //時間間隔を変更したい場合は、文中の '3600' 秒を別の値に変更してください - 'arrivalSeconds <= (@secondsElapsed + 3600)' </ span >
< spanclass = " "style = " color
770088 ; " > var </ span > < spanclass = " "style = " color
0000ff ; " > filterStatement </ span > < spanclass = " "style = " color
981a1a ; " >= </ span > < spanclass = " "style = " color
aa1111 ; " > 'arrivalSeconds >= @secondsElapsed AND arrivalSeconds <= (@secondsElapsed + 3600) AND stop_id = @stopId AND @curr_date >= start_date AND @curr_date <= end_date' </ span >
< spanclass = " "style = " color
aa5500 ; " > //filterStatement によって gtfsTable をフィルタリングする </ span >
< spanclass = " "style = " color
aa5500 ; " > //結果を arrivalSeconds の昇順で並べ替える </ span >
< spanclass = " "style = " color
770088 ; " > var </ span > < spanclass = " "style = " color
0000ff ; " > filtered </ span > < spanclass = " "style = " color
981a1a ; " >= </ span > < spanclass = " "style = " color
000000 ; " > OrderBy </ span >( < spanclass = " "style = "> Filter ( gtfsTable , filterStatement ) , 'arrivalSeconds ASC' ) </ span >
< spanclass = \ \ 0 && f.bikes_allowed == 1," -
","") + TextFormatting.NewLine + TextFormatting.NewLine
} else{
popupResult += ""
}
}
IIF(IsEmpty(popupResult), "次の1時間以内にバスはありません" + TextFormatting.NewLine + TextFormatting.NewLine, popupResult)少し修正したfilterStatementを使った類似の式を使用して、過去x分間に出発したバスをクエリすることもできます。以下の文は過去20分(1200秒)に出発したバスをクエリします。var filterStatement = 'arrivalSeconds >= (@secondsElapsed - 1200) AND arrivalSeconds < @secondsElapsed AND stop_id = @stopId AND @curr_date >= start_date AND @curr_date <= end_date'過去20分間に出発したバスの完全な式//ホストされたテーブル 'stopsTimesTripsRoutesCalendar' からフィーチャをクエリ - 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)
//日の開始から経過した秒数
var secondsElapsed </ span > = </ span > DateDiff </ span > ( Now </ span > (), startOfDayTime </ span > , ' seconds ' </ span > ) </ span >
< spanclass = ''style =' color
aa5500 '> // curr_date を 'YYYYMMDD' の形式で整数として返す#HowItShouldBe </ span >
< spanclass = ''style =' color :#770088 '> var </ span > curr_date </ span > = </ span > Number </ span > ( Text </ span > ( Now </ span > (), ' YMMDD ' </ span > )) </ span >
< spanclass = ''style =' color
aa5500 '> // フィルタ文(SQL)-変数には@でアクセスする </ span >
< spanclass = ''style =' color
aa5500 '> // 時間間隔を変更したい場合は、文中の「1200」秒を別の値に変更してください - 「arrivalSeconds >= (@secondsElapsed -1200)」 </ 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 >
< spanclass = ''style =' color
aa5500 '> // filterStatement によって gtfsTable をフィルタリングする </ span >
< spanclass = ''style =' color
aa5500 '> // 結果を arrivalSeconds の昇順で並べ替える </ span >
< spanclass = ''style =' color :#770088 '> var </ span > filtered </ span > = </ span > OrderBy </ span > ( Filter </ span > ( gtfsTable </ span > , filterStatement </ span > ), ' arrivalSeconds ASC '</ span > )
< spanclass = ''style =' color :#770088 '> var </ span > popupResult </ span > = </ span > ''
< spanclass = ''style =' color :#770088 '> var </ span > weekDays </ span > =< / sp an>['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
//この変数はforループ内で使用され、特定のweekDayにバスが運行しているかどうかを判定します(例:運行中なら1、そうでなければ0を返します)。
var currWeekdayOpr = weekDays[Weekday(Now())]
//フィルタされた結果を繰り返し処理してポップアップに必要なフィールドを表示します。
for (var f in filtered){
if (f[currWeekdayOpr] == 01){
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 == class="">乾杯! - <\/SPAN>Gee Fernando<\/SPAN><\/A><\/SPAN><\/STRONG><\/SPAN><\/P><\/BODY><\/HTML>