🚊

JR東日本のリアルタイムデータで乗換案内(OTP)を動かす -1.Docker起動編-

2024/09/15に公開

公共交通オープンデータチャレンジ2024で提供されるデータを使い、リアルタイム性を考慮した経路検索ができるOpenTripPlanner (OTP) と Docker Compose を用いて、JR東日本の首都圏のデータで、リアルタイムの運行情報を反映した経路検索を実行するまでをご紹介します。

公共交通オープンデータチャレンジ2024ではJR東日本の関東エリアにおける一部の路線遅延情報や在線情報などのリアルタイム情報がGTFS-RT形式で配信されているため、下の図のように、山手線が現在7分遅れていることなど、リアルタイムな遅延を考慮した経路検索をローカル環境で動かすことができます!

過去、ヴァル研究所の@kumatiraさんやsoeda_jpさんがOpenTripPlannerで岡山県で経路探索をする記事を書いてくださっていますが、5年以上経過してOpenTripPlanner2がリリースされるなどの変化がありますので改めて簡単に実行できる方法を記事にさせて頂きます。

https://qiita.com/kumatira/items/658e7b75785c854f0f69

https://qiita.com/soeda_jp/items/844104bbb845cbf841db

とりあえず動かしたい!という方向け

とりあえず触ってみたいという方向けに、GitHubにODPTのAPIキーをセットするだけで動くスクリプトを公開しています。詳細な実行方法はレポジトリのREADMEに記載しております。

https://github.com/takoyaki-3/odpt-challenge2024-jre-otp-docker

公共交通オープンデータチャレンジとは

公共交通オープンデータチャレンジは、公共交通オープンデータ協議会・国土交通省が主催で開催されるイベントです。鉄道やバス、フェリーなどの公共交通機関が提供するオープンデータを活用し、交通や移動に関連したアプリケーションやサービスの開発を促進するイベントです。近年、鉄道・バス・フェリー・航空・シェアサイクルなどあらゆる公共交通機関のデータがオープンデータ化されていますが、オープンデータチャレンジの期間中、JR東日本をはじめとするより多くの公共交通機関のデータが公開されています。

公共交通オープンデータチャレンジ2024のホームページ

提供データ・OTPに読み込ませるデータ

公共交通オープンデータチャレンジ2024のホームページを開くと、鉄道・バス・フェリー・航空・シェアサイクルのデータが公開されていることが分かります。


ODPTホームページより

これらのデータは、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で動かすためのスクリプトを記載したレポジトリを使って動かしていきます。
まずは動かしてみます。各ステップの内容は次のセッションに記載していきます。

https://github.com/takoyaki-3/odpt-challenge2024-jre-otp-docker

  1. レポジトリをクローンします

    git clone https://github.com/takoyaki-3/odpt-challenge2024-jre-otp-docker
    cd odpt-challenge2024-jre-otp-docker
    
  2. 開発者登録を行い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キーの文字列を記号なしでそのまま配置してください。

  3. 必要なデータをダウンロードし、OpenTripPlannerを起動します。

    docker compose up downloader
    docker compose up otp
    
  4. 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に様々な記事が投稿されています。

https://qiita.com/tags/opentripplanner

私が到達圏分析を扱う予定はありませんが、気が向いたら「JR東日本のリアルタイムデータで乗換案内(OTP)を動かす -2.APIを眺める編-」としてOpenTripPlannerのAPIレスポンスをじっくり観察したいと思います。

2024-10-18追記
続編となる第二弾の記事を公開しました。
https://zenn.dev/takoyaki3/articles/f90c1eb1967ed3

Discussion