オープンソースの経路探索「OpenTripPlanner」をmacOSで動かして岡山県で経路探索をする


会社のアドベントカレンダーで、オープンソースの「OpenTripPlanner(以下OTP)」という経路探索ソフトウェアを動かす方法を紹介しました。
オープンソースの経路探索「OpenTripPlanner」をUbuntuで動かして岡山県で経路探索をする

この記事のコメントで@niyalistさんよりmacOSでも同様に動作させられると教えていただいたので、当記事はmacOS版としてまとめます。情報ありがとうございました!!
先述の記事とは半分ぐらい内容が重なると思います。

岡山県の道路および一部のバス事業者のデータを使って経路探索ができるところまで動かします。「とりあえず面白そうなら触ってみよう」の精神でやってみました。

何を説明するか

  • OTPとはなんぞや(軽く)
  • OTPの起動手順(macOSで)
  • 経路探索してみる
  • 情報まとめ

何を説明しないか

  • OTPの機能に関する深い説明。起動→経路探索に必要な情報のみ言及します。
  • 本記事に出てこない元データの入手方法。岡山県での経路探索に必要な情報のみ言及します。

OTPとはなんぞや(軽く)

「OpenTripPlanner(以下OTP)」の公式サイトはこちらです。

トップページに

OpenTripPlanner (OTP) is a family of open source software projects that provide passenger information and transportation network analysis services.

とあるように、交通に関する情報やその分析を行うことができるOSSです。
OpenStreetMapや交通事業者から提供されるGTFSデータを元に徒歩、自動車、自転車、鉄道等の交通機関を複合的に扱うことができます。
今回はこれらの機能の中から、経路探索を行なっていきます。

インターフェースはHTTPであり、中身はJavaでできています。有志が作った、OPTとのやりとりをラップするいくつかの言語のライブラリもあるようです。

OTPの起動手順

動作させる環境

OS

試した環境は macOS 10.13.3 High Sierra です。

マシン

OpenStreetMapから作った道路のデータが巨大なため、ある程度メモリに余裕があるマシンをお勧めします。当記事のように岡山県のみを対象とした場合、約2Gのメモリを占有しました。

JDK

OTPを動かすにはJava8の環境が必要です。入っていない場合はオラクルから落とすなどして入れてください。
筆者はこちらのページから jdk-8u162-macosx-x64.dmgをダウンロード→インストールしました。

$ java -version  //環境の確認
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

準備

では必要なものをバンバン落としてきましょう。
主に公式チュートリアルを参考にしています。

作業ディレクトリを作り移動

名前はわかりやすければなんでもいいです。

$ mkdir otp
$ cd otp

OTP本体を取得

こちらよりOTPの本体を落としてきます。最新バージョンのディレクトリからファイル名が.shaded.jarで終わるファイルを使います。

$ curl https://repo1.maven.org/maven2/org/opentripplanner/otp/1.3.0/otp-1.3.0-shaded.jar -O

交通事業者の提供するGTFSデータを取得

経路探索の公共交通機関の部分のデータに使うGTFSデータを取得します。
今回は公共交通オープンデータ先進都市こと岡山市に乗り入れる、宇野バス下電バス両備バス岡電バス中鉄バスの各社が提供するデータを使います。このように地域でまとまってオープンデータ化してもらえると使う側としても使いがいがありますね!!

以下のサンプルコマンドで呼んでいるアドレスは2018/11/27時点での最新のものです。
新しいデータがあるか確認したい場合はこちらから各社のデータ置き場へ辿ることが出来ます。

2018/12/04 10:00現在、中鉄バスのGTFSデータ(β版)が正常に取得できません。この後、OTPの起動でデータについてエラーが起きた場合は一度該当データを抜いて起動することをお勧めします
→2018/12/04 20:00現在 復旧していました。

(2019年1月15日追記)
宇野バス、下電バスのオープンデータのファイル名が変更されました。

GTFS・「標準的なバス情報フォーマット」オープンデータ一覧

$ curl "http://www3.unobus.co.jp/opendata/GTFS-JP.zip" -o unobus.gtfs.zip
$ curl "http://www.shimoden.net/busmada/opendata/GTFS-JP.zip" -o shimodenbus.gtfs.zip
$ curl "http://loc.bus-vision.jp/gtfs/ryobi/gtfsFeed" -o ryobibus.gtfs.zip
$ curl "http://loc.bus-vision.jp/gtfs/okaden/gtfsFeed" -o okadenbus.gtfs.zip
$ curl "http://loc.bus-vision.jp/gtfs/chutetsu/gtfsFeed" -o chutetsubus.gtfs.zip

作業ディレクトリから出る

一旦出ます
この後落とす中国地方全体のpbfファイルを作業用ディレクトリに落としたくないためです。
作業用ディレクトリと異なる場所ならどこでもいいです

$ cd ../

中国地方のOSMのデータを取得

続いて道路の部分の情報を提供するOSMのデータを落としてきます。
まずはOSMデータを提供しているgeofabrik.deから中国地方のデータを取得してきます。
これは後ほどインストールするツールで岡山県周辺にトリムします。

$ curl http://download.geofabrik.de/asia/japan/chugoku-latest.osm.pbf -O

osmosisをインストール

Homebrewでosmosisをインストールします。
osmosisは前の手順でダウンロードしたOSMのデータ(pbfファイル)をトリムするためのツールです。

$ brew install osmosis

岡山県周辺のみに切り取る

では先ほど落とした中国地方のOSMのデータを岡山県周辺にトリムしましょう。
--bounding-boxオプションにtop,left,bottom,rightパラメータとしてそれぞれ、トリム範囲の上辺(北端)、左辺(西端)、下辺(南端)、右辺(東端)を、またトリム範囲の隅っこで切り落とされる道路情報も含めたいため、completeWaysパラメータにはyesを指定します。
--read-pbf--write-pbfではそれぞれ入出力ファイル名を指定します。
ファイルが出力されたらこれを作業用ディレクトリに入れます。

ここで注意!!
トリム範囲を指定する4つの値はその順番に気をつけてください。

$ osmosis --read-pbf chugoku-latest.osm.pbf --bounding-box top=35.284564 left=133.455201 bottom=34.274923 right=134.298740 completeWays=yes --write-pbf okayama.pbf

$ mv okayama.pbf otp/

作業ディレクトリに戻る

$ cd ./otp

起動

では早速実行してみましょう。
結構時間がかかりますが気長に待ちましょう

$ java -Xmx3G -jar otp-1.3.0-shaded.jar --build ./ --inMemory

起動中にWARNINGが 結構 いくつか出てくると思います。「バス停とどのstreetsとも紐づかないから使用されないよ」とか「系統名がユニークじゃないよ」などですが一旦無視します。原因と対策はまた調べたら追記します。もしご存知ならコメントで教えてください。

Grizzly server runningと出たら起動完了です!!

使ってみよう

では起動したOTPに早速リクエストを投げてみましょう。
リクエスト例中のIPaddressは適時読み替えてください。

まずは正常に生きてるか

まずはちゃんと起動しているか確認しましょう。
ブラウザから下記のリクエストを投げると、利用できる交通手段が返ってきます。
今回はバスのデータしか入れていないため、BUSはあってもTRAINはありません。

http://localhost:8080/otp/routers/default/

ドキュメント

GTFSデータが入っているか確認

では次にGTFSデータがきちんと取れるかみてみましょう。
まずこのリクエストでOTPに入っているGTFSデータのFeedidを得ることが出来ます。今回は5つのデータを入れたので、1~5が返るはずです。

http://localhost:8080/otp/routers/default/index/feeds

続いて上のリクエストで得たFeedidを使い、データのうち1つをみてみましょう。

http://localhost:8080/otp/routers/default/index/agencies/3

例えば上のリクエストで宇野バスの情報が取れたとします。この時レスポンスのidパラメータには1260001000674が入っています。これを使って次は宇野バスの全系統を取得してみます。

http://localhost:8080/otp/routers/default/index/agencies/3/1260001000674/routes

それぞれのリクエストについてのドキュメントはこちら
系統名の一覧が取得できればOKです!!

経路探索

ではいよいよ経路探索をしてみましょう。
データは岡山県内のものしか入れていませんので、もちろん県内の経路探索しかできないことは留意してください。
以下がリクエスト例です。それぞれのパラメータが何を表しているのかはこちらなどを参照してください。

http://localhost:8080/otp/routers/default/plan?fromPlace=34.656513,133.975075&toPlace=34.665495,133.918570&time=1:02pm&date=11-14-2018&mode=TRANSIT,WALK&maxWalkDistance=500&arriveBy=false&numItineraries=5
http://localhost:8080/otp/routers/default/plan?fromPlace=34.779151,134.038106&toPlace=34.665495,133.918570&time=1:02pm&date=11-14-2018&mode=TRANSIT,WALK&maxWalkDistance=500&arriveBy=false&numItineraries=5

itineraries要素に入っているのが具体的な経路です!!きちんと取れているでしょうか?

まとめ

本記事ではとりあえずmacOSでOpenTripPlannerを動かしてみるところまで書きました。
ドキュメントをみるにもっと色々できる(分析方面とか)アプリケーションのようです。
探索結果にpoints要素として経路のポリラインが返ってきているのも何かに使えそうですね

ところで、OTP周りでは日本語情報を全然見つけることができませんでしたこんな使い方したよとかあればぜひ記事化してください!!

最後にドキュメント等の情報をまとめて終わります。