その2: OSRMで経路探索

投稿者: | 2016年12月5日

1. 経路探索機能の追加

続いて、前に作成したアプリケーションに経路探索を追加します。作成するサンプルアプリケーションはこちらになります。ルートラボと似た操作でルートを作成できます(保存機能は未実装ですが)。

使用するのはOSRM(Open Source Routing Machine)。これを自転車ツーリング用途向けにチューニングして、先ほどのマップに追加してみます。他にもあるようですが、最初にこれを試したところ、1) 高速、2) leaflet上のフロントエンドも存在、3) コンフィグレーションファイルの変更で経路探索のチューニングも可能、ということで継続して使用しています。更新も活発に行われているようです(少し前に大きなインターフェース変更があり、アップデートしたら動かなくなって慌てましたが…)

実装に当たっては大きく「経路探索を行うサーバ」と「Webアプリケーションに組み込むフロントエンド」に分かれます。

2. 経路探索サーバの作成

検索エンジンは、osrm-backendを用います。インストール方法はリンク先のドキュメントの通りでできると思います。OSRMでは予めルート探索用のデータベースをOSMのデータセットから作成しておきます。入力データはOSMのPBF形式でOKなので、こちらからダウンロードしてくればいいでしょう。

osrm-extract japan-latest.osm.pbf -p profiles/charilab.lua
osrm-contract japan-latest.osrm

ここで探索のチューニングに使用するのが、luaというファイル。ここで利用可能な道路の種別や所要時間の計算に使う速度等を指定します。結構細かいところまでできるようですが、きちんとしたドキュメントが見当たらないので、適当に推測して修正しています。

  • 自動車専用道路(highway=motorway)や自転車走行禁止区間(bicycle=no)は経路探索の条件から外す。
  • ツーリング目的なので、基本街道(tertiary以上)を走るようする。
  • 最短ルート検索、所要時間見積もりに用いる走行スピードの見直し(15km/hとしています)

まだまだやっつけのチューニングですが、現状のluaファイルはgithubで公開しておきます。変更点の詳細な解説は、結構手間がかかるのでまた機会を改めてということで。

また、以前に比べて探索データ作成の性能は大幅に改善したようですが、それでもマシンによってはかなり時間がかかるので、プロファイルを試行錯誤したいときは、osmosis等のツールで切り出して試行錯誤するのが効率的です。

osmosis --read-pbf-fast japan-latest.osm.pbf --log-progress \
 --bounding-box top=35.333333 left=138.500000 bottom=35.000000 right=139.500000 \
 --write-pbf file=hakone.osm.pbf

ちなみに、手持ちのマシン(i7-6700 CPU @ 3.40GHz, 32GB)での作成時間は以下でした。

osrm-extract:
real 7m19.390s
user 16m35.991s
sys 0m31.248s

osrm-contract:
real 21m33.423s
user 159m51.921s
sys 1m3.276s

なお、現在のjapan-latest.osm.pbf(約1.1GB)では、探索用データはトータルで約4.1GBになりました。実行については探索デーモンosrm-routedは2GBのメモリのレンタルVPSでギリギリ動作しています(以前はメモリ不足で立ち上がらなかったのですが、tertiary以上に絞ったのが効いている様子)。

3. Webアプリケーションにフロントエンド追加

フロントエンドには、Leaflet Routing Machineを使用しています。APIドキュメントも用意されていますが、undocumentedな仕様もあってソースを解析しながら希望の機能を実装していった記憶があります。また、オリジナルでは日本語はサポートされていなかったのですが、多言語サポートのフレームワークは実装されていたようなので、日本語化も試みました。

ただ、現在のgithub上の最新版では、多言語対応のフレームワークをosrm-text-instructionsというプロジェクトに乗り換えようとしているらしいようです。ひとまず公開版の最新であるv3.2.4をやっつけで日本語追加したものを公開しておきます(leaflet-routeing-machine.jsを直接修正してます)。osrm-text-instructionも、日本語用のjsonファイルを用意すればいいように見えるので、気が向いたらトライしてみます(というか、誰かやってみません?)。

 

実際に作成したサンプルアプリケーションがこちら。戸塚駅周辺の自転車走行禁止区間を避けたルート探索がきちんとできていることがわかります。

sample2_routing

ただ、これはOSMの道路データに”bicycle=no”というタグを埋め込んであるために可能となっています。まだ、OSM上にはこのようなタグが十分に付加されているわけではないので、OSMデータの精度向上への貢献をお願いします。貢献の仕方はLearnOSMが参考になるかと思います。

実際に経路探索してみると、そのほかにも「実は道路の接続が切れていた」「フェリーへのルートが作成されていない」等のミスや情報不足を検出することも多々ありました。これについても「気づいた人が修正」を心がけたいですね。

ソースは以前と同じくgithubで公開しています。