BIM・IFCブログに戻る
デジタルツイン · 2026-10-10 · 9分
IFCモデルにリアルタイムのバスを表示:MQTTで作るバスターミナルのデジタルツイン
ヘルシンキ中央駅に隣接するエリエル広場(Elielinaukio)のバスターミナル。そのIFCモデルの各乗り場は、実際のバスが停車すると点灯し、上に系統番号が表示されます。データはHSLの公開MQTTフィードから、ブラウザーが直接受信します。
3Dマップ上にIFCモデルとして表示したヘルシンキ中央駅とエリエル広場のバスターミナル。乗り場の上にバスの系統番号がライブで浮かんでいる
バスターミナルは、デジタルツインを試すのに格好の題材です。状態が分単位で変わるからです。17の乗り場、出入りするバス、開閉するドア。公開データからこれをライブで表示できるなら、たいていのものは表示できます。
このシーンでは、ヘルシンキ中央駅の西側にあるエリエル広場(Elielinaukio)のバスターミナルでそれを実現しています。IFCモデルの各乗り場は、実際のバスが停車している間点灯し、その上に系統番号が浮かびます。位置情報の出どころは、ヘルシンキの交通当局であるHSLです。HSLは全車両の位置をMQTTで約1秒に1回公開しており、ブラウザーがそれを直接サブスクライブします。
この記事のポイント
- MQTT over WebSocketを使えば、ブローカーが許可している限り、Webページは間に自前のサーバーを置かずに車両のリアルタイム位置を受信できます。HSLのブローカーは許可しています。
- サブスクライブの範囲は絞り込みます。トピックツリーを地理的に切り出せば、ブラウザーに届くのはターミナルのバスだけになります。
- 乗り場は交通事業者の停留所IDにバインドし、色はメッセージ内のフィールドに対するルールで決まります。ドア開、停車中、走行中、バスなしです。
- 統合モデルの位置が揃うのは、各サテライトモデルをそれぞれのジオリファレンスに合わせて回転させた場合です。ここでは大聖堂の座標系が、ターミナルのものと3°ずれています。
試してみる:今このときのヘルシンキのバス
ターミナル、駅、大聖堂を地図上に開きます。実際のバスが到着すると乗り場が点灯します。夜間はバスが少ないため、乗り場が長時間グレーのままになります。

インタラクティブなIFCビューアーを開く
画面に映っているもの
OpenStreetMapの街並みの上に、ジオリファレンス済みの3つのIFCモデル(ETRS89 / GK25、EPSG:3879)を配置しています。Eliel Saarinen設計の中央駅とそのホーム、元老院広場に立つ大聖堂、そして17の乗り場(20〜36番)と標柱、サイン、上屋を備えたバスターミナルです。フィンランド気象研究所の2つのライブレイヤーが、大気質と気象を表示します。
バスが発着する乗り場の様子。各標柱とサインは、その停留所にいるバスの動作に応じた色になります。
| 乗り場の色 | HSLメッセージに対するルール | 意味 |
|---|
| 緑 | ドアが開いている(drst = 1) | 乗降中 |
| 青 | 速度0.5m/s未満 | 乗り場に停車中 |
| 黄色 | 停留所でのその他の値 | 到着・発車中 |
| グレー | 45秒間データなし | バスなし |
最初に一致したルールが適用されます。系統番号(desi)は乗り場の上に浮かびます。
GTFS-RealtimeではなくMQTTを使う理由
公共交通のリアルタイムデータではGTFS-Realtimeが一般的な形式で、HSLも公開しています。しかしそのフィードは、ブラウザーが別サイトから読み込むのに必要なCORSヘッダーを返さないため、使うにはプロキシを運用しなければなりません。High-frequency positioning(高頻度の位置情報)のフィードは事情が違います。MQTT over WebSocketで公開されており、キー不要で、どのWebページからも到達できます。
この用途には情報量の面でも優れています。メッセージは1件がバス1台分で、約1秒に1回届き、系統、速度、ドアの状態、いる停留所が含まれます[hfp]。トピックがバスの位置を表すため、サブスクライブの範囲を街の一画に絞り込めます。
/hfp/v2/journey/ongoing/vp/bus/+/+/+/+/+/+/+/+/60;24/19/73/#
サブスクライブするトピックを階層ごとに示したもの。各+は任意の値に一致し、ジオハッシュがストリームをターミナル周辺のセルに絞り込みます。
末尾の60;24/19/73は、ターミナル周辺にあるHSLの地理グリッドのセルです。ブラウザーはそのセル内のバスだけを受信します。メッセージを1秒に1回読み取り、停留所ごとに最新の1件を保持します。停留所間を走行中で、メッセージに停留所が含まれないバスはスキップします。
停留所IDから乗り場へ
HSLは停留所を番号で、IFCモデルは名前で識別します。この2つを結び付けるのが、HSLが公開している停留所リストです。現在、17の乗り場のうち9つにHSLの停留所があり、それぞれが1つのバインディングになります。要素は「Bay 20」などの名前で検索します。これで各乗り場の標柱と3つのサインが見つかります。
| 乗り場 | HSLの停留所ID |
|---|
| 20 | 1020128 |
| 22 | 1020131 |
| 23 | 1020133 |
| 24 | 1020135 |
| 25 | 1020132 |
| 26 | 1020239 |
| 28 | 1020243 |
| 29 | 1020245 |
| 30 | 1020130 |
シーン作成時に一度だけ読み込んだ、HSLのGTFS停留所リストによる。残り8つの乗り場には停留所がなく、グレーのままです。
夜間の乗り場の詳細カード。バスがいないときは古い値を表示せず、ライブ欄にその旨を示し、ポールのIFCデータと並べて表示する。
{
"id": "hsl-hfp-elielinaukio",
"url": "wss://mqtt.hsl.fi:443/",
"topics": ["/hfp/v2/journey/ongoing/vp/bus/+/+/+/+/+/+/+/+/60;24/19/73/#"],
"mapping": { "idField": "VP.stop", "timeField": "VP.tst" }
}
別の車両群や別のエリアを読み込むのに必要なのは、このデバイスソースだけです。MQTT over WebSocketに対応したブローカー、トピック、そしてメッセージのどのフィールドがデバイスを識別するか。シーンの残りの部分はそのままです。
大気質と気象
2つの地図レイヤーはフィンランド気象研究所のオープンデータ[fmi]で、シンプルなWFSフィーチャーとしてブラウザーで読み込んでいます。確認した時点で、市内には大気質の観測局が11か所、気象観測所が7か所ありました。大気質は1時間ごとで最大40分遅れて届くことがあり、気象は10分ごとです。
3つのモデル、1つの地図
駅、大聖堂、ターミナルは別々のファイルで、それぞれが独自のジオリファレンスを持っています。大聖堂のローカル軸は、地図の基準となるターミナルの軸から3°回転しています。ビューアーが他のモデルを回転させずに移動だけで配置すると、大聖堂は向きが3°ずれたまま立ち、角の部分では約2mずれてしまいます。
ビューアーは各モデルを、それ自身の中心を軸に、それぞれの座標系に合わせて回転させます。OpenStreetMapの大聖堂の輪郭と比べると、壁のずれは0.56m、角度のずれは0.37°に収まっています。この残差は、モデルとOSMがそれぞれどれだけ正確に建物を描いているかによるものです。
はっきり伝えておくべき制約
- モデルは公開情報をもとに作成した説明用のもので、測量に基づくものではありません。
- HSLの停留所があるのは9つの乗り場だけなので、残りの8つは点灯しません。
- 夜間は運行するバスが少なく、乗り場は長時間グレーのままです。
- ここで使っている全球の地形データは、フィンランドの高さ基準系より約18m高い値を示します。そのため、モデルは記載された高さではなく地形の表面上に置かれています。モデル同士の相対的な高さは保たれています。
- ブラウザーは非表示のタブでタイマーを遅くするため、バックグラウンドのタブではメッセージの受信頻度が下がります。
同じシーン形式で、バルセロナのオープンデータ・ツインではシェアサイクルと充電のデータから都市の広場を、ODPTで作る東京の交通ツインでは鉄道と路面電車のデータから東京の2つの駅を動かしています。交通フィードではなくセンサーからデータを受け取るツインについては、WebデジタルツインでのリアルタイムLiDARをご覧ください。
IFCモデルにリアルタイムのバスを表示:MQTTで作るバスターミナルのデジタルツイン