ルート検索エンジン(OSRM)をコンテナで簡単に動かしてみた


背景

改めて、Docker(コンテナ)を利用することでの非常に有益な気づきがあったので、その事例を備忘録として整理することにしました。

そもそも何がしたかったのか

OpenStreetMap(OSM)を利用した、ルート検索エンジンのOSRM(Open Source Routing Machine)を簡単に使ってみたかったのですが、その環境構築が面倒なようで、何とかならないかと調べていました。

何と、すでに構築された環境がDockerイメージとして提供されていた

Project-OSRM/osrm-backend において、以下のような記述がありました。

The easiest and quickest way to setup your own routing engine is to use Docker images we provide.

しかも、つぎのコマンド実行のみで、dockerhub からコンテナイメージを取得(ダウンロード)して、そのイメージからコンテナ(ルート検索エンジンとしての)を作成・起動してくれます

docker run -t -i -p 5000:5000 -v "${PWD}:/data" osrm/osrm-backend osrm-routed --algorithm mld /data/kanto-latest.osrm &

この例では、osrm/osrm-backend がコンテナイメージで、osrm-routed がコンテナ内で実行するコマンドになります。

ただし、この実行においては、事前に以下の作業が必要です。その中で、以下の整形とか最適化処理は、osrm/osrm-backendから新たにコンテナを起動(その処理用のコマンドをコンテナとして起動します)して実行しています。

  • OSRMで使用する地図(OSM)のダウンロード
  • OSRMで使用できるように整形
  • 徒歩・車・自転車などの速度の最適化
  • その他

本来であれば、以下の手順で、2. 6. 7. を除いた処理が必要とのことなので、Dockerを使うことでより早く確実に試せることがわかります。

1.更新とセキュリティ
2.マップエクスポートのダウンロード
3.依存関係のインストール
4.OSRMのコンパイル
5.STXXLの構成
6.マップの抽出
7.移動時間の計算
8.Webサービスの実行とテスト
9.Nginxのセットアップ
10.スーパーバイザーのインストールと構成

ということで、コンテナイメージを使うことで、非常に簡単に実行環境の構築ができることを、改めて確認することができました。

参考までに、上記で立ち上げたルート検索エンジンに、以下のコマンドを実行して、ルート情報(JSON形式)を取得してみました。

この例では、北鎌倉から鎌倉大仏までの徒歩ルートを取得するために、それぞれの位置情報をパラメータとして検索エンジンに投げています。

curl --noproxy 127.0.0.1 'http://127.0.0.1:5000/route/v1/walking/139.545056,35.337103;139.535689,35.316696?alternatives=3&geometries=geojson' | jq 'def hexdec(i): "0123456789abcdef"[i:i+1]; {"type": "FeatureCollection", "features": [[.routes[].geometry] | [., keys] | transpose[] | {"geometry": .[0], "type": "Feature", "properties": {"stroke-width": 2, "stroke": ("#" + hexdec(15-.[1]*2) + hexdec(.[1]*2) + hexdec(.[1]*2))}}]}' > routes_kamakura.json

そして、取得したJson形式ファイルを、geojson.io 上に読み込ませると、以下のような、北鎌倉から鎌倉大仏までの散歩コースの複数ルートが取得できました。(これはこれで、別途、別な記事として整理したいと思います)