OpenStreetMapとOpenTripPlannerで経路検索してバスに乗れと言ってもらった
2019-06-14
azblob://2022/11/11/eyecatch/2019-06-14-route-search-by-osm-and-otp-000-e1560491257828.jpg

MaaS関連のプロジェクト中にバスに乗るところまで実装したので手順をまとめました。

OpenStreetMapとは

OpenStreetMap(OSM)は、誰でも自由に地図を使えるよう、みんなでオープンデータの地理情報を作るプロジェクトです。 プロジェクトには、誰でも自由に参加して、誰でも自由に地図を編集して、誰でも自由に地図を利用することが出来ます。

https://openstreetmap.jp/#zoom=5&lat=38.06539&lon=139.04297&layers=0BFF

と、公式HPには書いてあります。有志が集めた情報を集約した地図データを利用できるサービスです。

Open Trip Plannerとは

Open Trip Planner(OTP)はOpenStreetMapとGTFS(後述)の情報から旅程を導いてくれるオープンソースソフトウェアです。具体的には、A点からB点まで移動するには「このバス停まで歩いて〇分のバスに乗って××で降りてこのルートで歩くと到着」といった情報を返してくれます。 OTPはJavaで作られており、HTTPでリクエストを送ります。URLへリクエスト情報(現在地や目的地など)を乗せて送るとXMLでレスポンスが返ってきます。(jsonがよかった……)

GTFSとは

General Transit Feed Specification(GTFS)には、公共交通機関の時刻表とその地理的情報に使用される共通形式が定義されています。GTFS の「フィード」を利用することで、公共交通機関は乗換案内データを公開し、デベロッパーはそのデータを相互運用可能な方法で利用するアプリケーションを作成することができます。

https://developers.google.com/transit/gtfs/?hl=ja

General Transit Feed Specification(GTFS)はGoogleが作成した、運行情報をまとめたデータフォーマットです。その中身はCSV形式のテキストファイルになっており、駅の情報や時刻表、運賃表などのテキストファイルを1つのzipファイルにまとめて1フィードとしています。

やったこと

四日市のデータを利用してルート検索をしました。

今回はこちらの記事を参考に進めました。
https://qiita.com/kumatira/items/658e7b75785c854f0f69

AzureにVMを建てる

今回は環境をAzure上に作成したVMに作りました。

  • Standard B2s (2 vcpu 数、4 GiB メモリ)
  • Linux(Ubuntu 18.04.2 LTS)

Azure上にVMを構築した手順はこちらの記事にまとめました。
https://tech-blog.cloud-config.jp/2019-06-14-creation-azurevm-in-terraform/

Nginx導入

サーバーとしてNginxをインストールします。

まずはsshでVMへログイン。

# ssh <username>@<IPaddress>

Nginxインストール

# sudo apt-get install nginx

Javaのインストール

OTPを動かすのにJavaが必要なためJavaをインストールします。

# sudo apt-get install openjdk-8-jre

Java 1.8.0以上が必要なので注意してください。

# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)

OTPとGTFSをダウンロード

OTPとGTFSをダウンロードするまえに作業ディレクトリを作成します。

# mkdir otp
# cd otp

OTPのダウンロード。

wget https://repo1.maven.org/maven2/org/opentripplanner/otp/1.3.0/otp-1.3.0-shaded.jar

GTFSのダウンロードですが、今回は自作の四日市市のGTFSを利用しました。オープンソースのGTFSが少なすぎる……!!

一般配布されているGTFSはこちらのサイトなどで調べることができます。https://www.rosenzu.com/net/mieru/format.html

wget ”http://xxx/xxx.zip” -O xxx.gtfs.zip

OSMのダウンロード

OSMをダウンロードするのですが、配布されているOSMは地方ごとに区切られており、今回欲しい四日市のOSMは関西地域に含まれています。そんなに広いデータはいらないため切り取る必要があります。

関西地域のOSMのダウンロード

とはいえまずは関西のOSMのダウンロードです。一旦作業ディレクトリから出てから落とします。

# cd ../
# wget http://download.geofabrik.de/asia/japan/kansai-latest.osm.pbf

少し待つとダウンロードが終わるかと思います。 関西以外のOSMもこちらのページから落とせるので見てみてください。
http://download.geofabrik.de/asia/japan/

もちろん世界のデータもあります。
http://download.geofabrik.de/

OSMの切り取り

OSMを欲しい範囲に切り取ります。切り取りをするためのツールをインストールします。

# sudo apt install osmctools

四日市の範囲で切り取ってみます。 ここで指定する座標は切り取る範囲の左下の経度、緯度、右上の経度、緯度の順番になっています。緯度経度の順ではないので注意。

osmconvert kansai-latest.osm.pbf -b=136.399424,34.892011,136.689695,35.077602 --complete-ways -o=yokkaichi.pbf

切り取られたpbfファイルを作業ディレクトリに入れます。

# mv ./yokkaichi.pbf ./otp/
# cd otp/
# ls
otp-1.3.0-shaded.jar  yokkaichi-gtfs-01.zip  yokkaichi.pbf

OTPの実行

必要なものがそろったのでOTPを実行してみます。

# java -Xmx5G -jar otp-1.3.0-shaded.jar --build ./ --inMemory

実行には結構時間がかかります。試した感じだと読み込むGTFSの量が多いほど時間がかかるようです。気長に待ちましょう。

Grizzly server running.

と出れば実行成功です。

ブラウザで確認

実行ができたらホストOSのブラウザで確認してみます。

マップ

URLはhttp://<IPaddress>:8080/です。

このような画面が出れば成功です。地図の場所が入れたOSMの場所になっています(画像では四日市)。

OTP

次にOTPの情報を確認してみます。URLはhttp://<IPaddress>:8080/otp/routers/default/です。

XML形式のレスポンスが表示されています。<travelOptions>タグに注目してください。<travelOptions>タグはGTFSを入れないと交通機関の情報がないためBUSやTRAINが表記されません。表示結果にはBUSと表示されているので、GTFSの情報を読み込めていることがわかります。

GTFSのフィード

次にGTFSのフィードを確認してみます。URLはhttp://<IPaddress>:8080/otp/routers/default/index/feedsです。

GTFSフィードを1つだけ入れたので1が表示されました。複数フィードを入れると2以降も表示されます。

フィード情報

次にフィード情報を確認してみます。URLはhttp://<IPaddress>:8080/otp/routers/default/index/agencies/<number>です。

確認できました。

系統情報

次に交通機関の系統情報を確認してみます。URLはhttp://<IPaddress>:8080/otp/routers/default/index/agencies/<number>/<id>/routesです。idはフィード情報の確認時に表示されたものです。

三重交通のバス情報が取得できました。

経路検索してみる

経路情報を聴いてみます。

http://<IPaddress>:8080/otp/routers/default/plan?fromPlace=<緯度,経度>&toPlace=<緯度,経度>&time=11:00am&date=06-14-2019&mode=TRANSIT,WALK&maxWalkDistance=500&arriveBy=false&numItineraries=1

表示された結果を見ると<mode>がBUSになっています。結果では<mode>がWALK、BUS、WALKの順で表示されていたので、徒歩→バス→徒歩で移動しろと言われています。

ちゃんと結果が返ってきたので成功です!

リクエストの内容次第ではPATH_NOT_FOUNDと返ってくることもあるので、GTFSのバリエーションとリクエストの内容をいろいろ変えてみるといいかもしれません。

まとめ

OSMとOTPのダウンロードから経路検索までをやってみました。 実運用するには、ここから経路をマップに表示するなどが必要そうです。

azblob://2024/03/29/eyecatch/2024-03-29-openai-json-mode-000_0.jpg
2024/03/29
AI/Machine Learning