JR東日本のリアルタイムデータで乗換案内(OTP)を動かす -1.Docker起動編-
公共交通オープンデータチャレンジ2024で提供されるデータを使い、リアルタイム性を考慮した経路検索ができるOpenTripPlanner (OTP) と Docker Compose を用いて、JR東日本の首都圏のデータで、リアルタイムの運行情報を反映した経路検索を実行するまでをご紹介します。
公共交通オープンデータチャレンジ2024ではJR東日本の関東エリアにおける一部の路線遅延情報や在線情報などのリアルタイム情報がGTFS-RT形式で配信されているため、下の図のように、山手線が現在7分遅れていることなど、リアルタイムな遅延を考慮した経路検索をローカル環境で動かすことができます!
過去、ヴァル研究所の@kumatiraさんやsoeda_jpさんがOpenTripPlannerで岡山県で経路探索をする記事を書いてくださっていますが、5年以上経過してOpenTripPlanner2がリリースされるなどの変化がありますので改めて簡単に実行できる方法を記事にさせて頂きます。
とりあえず動かしたい!という方向け
とりあえず触ってみたいという方向けに、GitHubにODPTのAPIキーをセットするだけで動くスクリプトを公開しています。詳細な実行方法はレポジトリのREADMEに記載しております。
公共交通オープンデータチャレンジとは
公共交通オープンデータチャレンジは、公共交通オープンデータ協議会・国土交通省が主催で開催されるイベントです。鉄道やバス、フェリーなどの公共交通機関が提供するオープンデータを活用し、交通や移動に関連したアプリケーションやサービスの開発を促進するイベントです。近年、鉄道・バス・フェリー・航空・シェアサイクルなどあらゆる公共交通機関のデータがオープンデータ化されていますが、オープンデータチャレンジの期間中、JR東日本をはじめとするより多くの公共交通機関のデータが公開されています。
提供データ・OTPに読み込ませるデータ
公共交通オープンデータチャレンジ2024のホームページを開くと、鉄道・バス・フェリー・航空・シェアサイクルのデータが公開されていることが分かります。
これらのデータは、GTFS/GTFS-RTという世界的に採用されている公共交通機関のデータフォーマットで公開されており(※)、今回ご紹介するOpenTripPlannerをはじめとするOSSなどにそのまま読み込ませることができます。また、GTFSはカンマ区切りのテキストデータをZIP圧縮したものであり、GTFS-RTはプロトコルバッファーによるバイナリデータとして仕様が公開されているため、これらのデータを使って独自のアプリケーションを開発することもできます。
※今回のオープンデータチャレンジでは、GTFS/GTFS-RTでなく、公共交通オープンデータ協議会によるJSON形式で公開されている事業者もあります。
静的データ
静的データとは、駅情報や路線情報、予定されている時刻表情報のことです。
これらは、GTFSという形式で提供されます。
GTFS (General Transit Feed Specification) は、公共交通の時刻表データや運行情報を統一フォーマットで提供する標準規格です。GTFSデータには、停留所の位置、ルート、時刻表、運賃などの静的な情報が含まれます。
動的データ
動的データとは、大きく3種類のデータが提供されています。
-
運行情報(REAL_TIME_ALERTS)
運行情報は「山手線は大雨の為運転を見合わせております」のような路線や列車の運行情報を表すデータです。 -
時刻表更新情報(STOP_TIME_UPDATER)
時刻表更新情報は、15:16発予定の列車が3分遅れているため15:19発になりそうといった列車・駅ごと、バス・バス停ごとの遅延情報です。 -
位置情報(VEHICLE_POSITIONS)
位置情報は、各列車やバスごとの現在の走行位置情報です。今回提供されているJR東日本のGTFS-RTには含まれていませんが、仕様上は混雑状況なども含めることができ、実際に横浜市営バスのGTFS-RTなどでは混雑情報も配信されています。
これらはGTFS-RTという形式で提供されます。
GTFS-RT (GTFS-Realtime) は、GTFSのリアルタイム拡張フォーマットで、列車やバスの運行遅延やリアルタイムの位置情報、運行状況を提供します。GTFS-RTを活用することで、実際の運行状況を反映した正確な経路検索が可能になります。
地図情報
OpenTripPlannerには、地図情報としてOpenStreatMapのデータを読み込ませることができます。
OpenStreetMap (OSM) は、自由に編集可能なオープンソースの地図データベースです。世界中のユーザーが共同で地図を作成し、地理情報データを提供しています。今回のプロジェクトでは、このOSMのデータを利用して地図情報を取得し、交通機関の経路や位置情報と統合します。
環境の準備
必要なツールのインストール
このプロジェクトを動かすためには、以下のツールをインストールする必要があります。
- Docker:コンテナ技術を使ってアプリケーションの依存環境を簡単に管理するために使用します。
- Docker Compose:複数のコンテナを一度に管理できるツールです。
Dockerがインストールされていない場合、公式ドキュメントを参照してインストールを行ってください。
APIキーの取得
このアプリケーションでは、JR東日本やその他の公共交通機関が提供するリアルタイムデータを利用するために、APIキーが必要です。APIキーは、公共交通オープンデータセンター開発者サイトに登録して取得します。
APIキーを取得したら、compose.yml
に設定します。
データダウンロードおよびOpenTripPlannerの起動
今回は、GitHubにて公開しているオープンデータチャレンジで公開されているJR東日本のGTFS/GTFS-RTをdockerで動かすためのスクリプトを記載したレポジトリを使って動かしていきます。
まずは動かしてみます。各ステップの内容は次のセッションに記載していきます。
-
レポジトリをクローンします
git clone https://github.com/takoyaki-3/odpt-challenge2024-jre-otp-docker cd odpt-challenge2024-jre-otp-docker
-
開発者登録を行いAPIキーを発行、設定します。
公共交通オープンデータセンター開発者サイトから開発者登録を行い、発行したAPIキーをcompose.ymlの
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
をAPIキーに置き換えます。version: '3' services: downloader: image: alpine volumes: - ./:/working_dir working_dir: /working_dir entrypoint: ["sh", "./initial.sh"] environment: - API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX otp: image: opentripplanner/opentripplanner:latest container_name: otp environment: - JAVA_OPTS=-Xmx8G volumes: - ./otp:/var/opentripplanner command: > --build --save --serve ports: - "8080:8080" depends_on: - downloader
※[]は不要です。APIキーの文字列を記号なしでそのまま配置してください。
-
必要なデータをダウンロードし、OpenTripPlannerを起動します。
docker compose up downloader docker compose up otp
-
http://localhost:8080
にアクセスすると標準GUIが起動します。REST APIで叩くことも可能です。
レポジトリの説明
使用する技術
実行に使う技術は、以下の通りです。
- OpenTripPlanner (OTP): オープンソースの経路検索エンジン。公共交通機関や徒歩、サイクリング、車でのルート検索が可能です。
- Docker Compose: 複数のコンテナを簡単に管理し、環境を統一してデプロイします。
- GTFS: 鉄道の時刻表データのフォーマット。
- GTFS-RT: 鉄道の運行状況や列車の位置情報をリアルタイムで取得できるフォーマット。
- OpenStreetMap (OSM): 地図データを提供するオープンソースプロジェクト。
ディレクトリ構成
├── LICENSE.md
├── README.md
├── compose.yml
├── initial.sh
└── otp/
└── router-config.template.json
compose.yml
では、2つのコンテナを定義しています。1つ目の downloader は、リアルタイム運行データと地図データをダウンロードする役割を持ち、2つ目の otp コンテナがOTPを実行します。
- downloader:
- 必要なデータ (GTFS, OSM) をダウンロードします。
- router-config.template.json から router-config.json を生成し、compose.yml で設定した API_KEY 環境変数の値を埋め込みます。
- otp:
- 構築されたグラフを読み込み、経路検索APIを提供するOTPサーバーを起動します。 downloader コンテナでデータのダウンロードと設定ファイルの生成が完了するまで待機してから起動します。
データのダウンロード
1つ目のdownloader
コンテナでは、JR東日本のGTFS、関東圏のOpenStreatMapをダウンロードします。また、OpenTripPlannerの設定ファイルであるrouter-config.json
をテンプレートから作成します。
#!/bin/bash
apk add curl
API_KEY=${API_KEY}
GTFS_URL="https://api-challenge2024.odpt.org/api/v4/files/JR-East/data/JR-East-Train-GTFS.zip?acl:consumerKey=$API_KEY"
OSM_URL="https://download.geofabrik.de/asia/japan/kanto-latest.osm.pbf"
if [ ! -f ./otp/gtfs.zip ]; then
curl -L $GTFS_URL -o ./otp/gtfs.zip
fi
if [ ! -f ./otp/osm.pbf ]; then
curl -L $OSM_URL -o ./otp/osm.pbf
fi
sed 's/\[Access_Token_for_Challenge2024\]/'"$API_KEY"'/g' ./otp/router-config.template.json > ./otp/router-config.json
このスクリプトを実行することで、ディレクトリ構成は次のようになります。
gtfs.zip
がODPTからダウンロードしたJR東日本のGTFSデータ、osm.pbf
がOpenStreatMapのデータを配信しているストレージの一つであるgeofabrikからダウンロードしたOpenStreatMapデータです。
├── LICENSE.md
├── README.md
├── compose.yml
├── initial.sh
└── otp
├── gtfs.zip
├── osm.pbf
├── router-config.json
└── router-config.template.json
OpenTripPlannerの実行
OpenTripPlannerでは、経路検索用のグラフを構築した後にサーバーが起動します。
OpenTripPlannerには、起動時に指定できるオプションとして、次のようなものがあります。
-
--build
: 経路検索に用いるグラフを構築します -
--save
: 構築したグラフを保存します -
--load
: 予め構築済みの経路探索用グラフを読み込んで使用します -
--serve
: 経路検索サーバーを起動します
今回は、グラフを構築した後に保存して経路検索用サーバーを起動したいので--build --save --serve
を指定しています。二回目以降の実行で元データに変更がなければ、--load --serve
とすることで起動時間を短縮できます。
一度OpenTripPlannerを起動した後だと次のようにグラフデータが書き出されます。
├── LICENSE.md
├── README.md
├── compose.yml
├── git-repo-summary-20240915-143940.md
├── initial.sh
└── otp
├── graph.obj # 新たに追加された経路検索用グラフデータ
├── gtfs.zip
├── osm.pbf
├── router-config.json
└── router-config.template.json
OpenTripPlannerの設定ファイルについて
router-config.template.json
は、OpenTripPlanner (OTP) の設定ファイルのテンプレートです。このファイルには、OTPが利用する公共交通のリアルタイムデータや地図データに関する情報が記載されています。initial.sh
スクリプトを実行することで、このテンプレートファイル内のAPIキーのプレースホルダーが実際のAPIキーに置き換えられ、router-config.json
という名前の設定ファイルが生成されます。
設定項目の概要は以下の通りです。
- routerId: ルーターの識別子です。デフォルトでは "default" となっています。
- gtfsRealtimeAlertsUrl: 運行情報(遅延や事故などのアラート)を取得するためのURLです。
- gtfsRealtimeTripUpdatesUrl: 列車やバスのリアルタイム時刻表更新情報を取得するためのURLです。
- gtfsRealtimeVehiclePositionsUrl: 各列車やバスの現在の位置情報を取得するためのURLです。
- transitServiceStart/End: 交通サービスの運行時間帯を設定するフィールドです。例えば、始発と終電の時間を指定することができます。
-
updaters: リアルタイムデータの更新頻度などを設定します。
feedId
でデータフィードのIDを指定し、frequencySec
でデータを更新する間隔(秒単位)を設定できます。
このファイルを編集することで、リアルタイム情報の更新間隔を設定できます。
OpenTripPlannerで何ができるのか?
今回の記事はOpenTripPlannerを動かすここまでとさせていただきますが、OpenTripPlannerが動いたことで、経路検索に留まらず到達圏探索など、経路検索や時刻表アプリに留まらない様々な活用ができます。OpenTripPlannerに関しては、Qiitaに様々な記事が投稿されています。
私が到達圏分析を扱う予定はありませんが、気が向いたら「JR東日本のリアルタイムデータで乗換案内(OTP)を動かす -2.APIを眺める編-」としてOpenTripPlannerのAPIレスポンスをじっくり観察したいと思います。
2024-10-18追記
続編となる第二弾の記事を公開しました。
Discussion