OpenStreetMapとOpenTripPlannerで経路検索してバスに乗れと言ってもらった

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://qiita.com/berryu/items/103ad71ebffd6f0696cb

## 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/`です。
![otp-map.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436187/89ae1a34-a97c-569e-13f6-99a47de40db1.png)
このような画面が出れば成功です。地図の場所が入れたOSMの場所になっています(画像では四日市)。

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

![otp-sample.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436187/18b1494d-7075-a160-7c12-fafc07e586c8.png)

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


### GTFSのフィード
次にGTFSのフィードを確認してみます。URLは`http://<IPaddress>:8080/otp/routers/default/index/feeds`です。
![otp-feed.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436187/6352d9ff-4836-c985-41fa-d03a758143c9.png)

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

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

![otp-feed-detail.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436187/8efcdd4d-7a06-63f8-d2ca-405c1e566218.png)

確認できました。


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

![otp-feed-bus.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436187/81d4cc08-7a7c-1a84-59d1-726c9572502e.png)

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


## 移動手段を聴いてみる
移動手段を聴いてみます。

```
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
```

![yokkaichi.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436187/c1cf7fe9-d520-6a5b-d8d7-acdd7486daf7.png)


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

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

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


#まとめ
OSMとOTPのダウンロードから経路検索までをやってみました。今回使ったのは基本的な機能だけなので、実運用するには経路をマップに表示してみたりなどが必要そうです。