Garmin Edge 520J の地図を作る - Overpass API と Overpass turbo を Docker で動かす

前回の続き

パブリックで公開されている Overpass API , Overpass turbo は便利。ソースも GitHub で公開されているので自分で動かしてみよう

なお、Garmin Edge 520J 用のイメージを作るにあたって 必須の作業ではない

Overpass API のソース

github.com

うーん 動かすのが難儀そう (諦めが早い

Overpass API on Docker

Overpass API を Docker で動かないかと探すと ... あるもんだ。

github.com

Mac OS X で Docker を扱う方法、そもそも Docker とは何か? については割愛する。本エントリを書く際は Docker for Mac を使った

Overpass API on Docker on Mac OS X

そこそこ時間のかかる準備作業が必要

↓ の通り Overpass APIAPI なので、データベースに OSM地図データをつっこまないといけない

Overpass API(別名 OSM3S)とは読み出し専用のAPIであり、OSM地図データの中から個別に選択された部分を取り出します。Webを介したデータベースとして動作します。利用者はAPIに対してクエリを送り、クエリに対応したデータ セットを受け取ります。

refs http://wiki.openstreetmap.org/wiki/JA:Overpass_API

ところが 全世界の OSM地図を扱おうとすると流石にデータがでか過ぎるので http://download.geofabrik.de/ から自分の扱いたいエリア(= 今回は日本 ) に絞られたサブセットを使って Docker イメージをビルドする

... という説明は明記されていないが building-the-docker-image の手順を読んだ感じの含意と思う

docker-overpass-api の docker build

下記の手順をとった

git clone https://github.com/mediasuitenz/docker-overpass-api
cd docker-overpass-api

# 日本のみに絞った japan-latest.osm.bz2 をダウンロード (ファイル名は planet.osm.bz2 )
#
#     元々のサンプルはニュージーランドの地図を使っている
#     curl -o planet.osm.bz2 http://download.geofabrik.de/australia-oceania/new-zealand-latest.osm.bz2
# 
curl -o planet.osm.bz2 http://download.geofabrik.de/asia/japan-latest.osm.bz2 

# planet.osm.bz2 がでかいので非常に時間がかかる 回避方法ないだろか
docker build -t mediasuite/overpass-api .

Docker for Mac で docker build するに当たって何度かつまづいたところを 📝 しておこう

  • Docker for Mac を使ったが RAM 2GB だと途中で止まってしまった
    • RAM 10GB ほどに増やしてビルドした。7〜8GB あれば十分かも
  • CPU は 4コアにしておいた

overpass-api コンテナの起動

docker build できたらコンテナを起動しよう

docker run -d -p 80:80 mediasuite/overpass-api

サンプルクエリを投げる。api のエンドポイントは /api/interpreter

# サンプルクエリを curl で POST する
$ echo 'node["name"="Trekストア六本木"];out;' | curl -d @- http://localhost/api/interpreter
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base=""/>

  <node id="1763146176" lat="35.6591576" lon="139.7279059">
    <tag k="name" v="Trekストア六本木"/>
    <tag k="shop" v="bicycle"/>
    <tag k="wheelchair" v="yes"/>
    <tag k="wheelchair_toilet" v="unknown"/>
  </node>

</osm>

やったー!

フロントエンドが欲しいよね

APIは動かせたものの、人間が直接 扱うにはちょっと不便。 http://overpass-turbo.de みたいにイケテる画面でテストしたい。次は Overpass turbo を動かしてみよう

overpass-turbo on Docker

github.com

Docker で動くようなあれこれは公開されていないのだった。HTML 1枚で動くので、既存の nginx コンテナを利用してみた

git clone https://github.com/tyrasd/overpass-turbo.git
cd overpass-turbo

# overpass-api とバッティングするので 8080 とした
docker run -d -p 8080:80 -v $PWD:/usr/share/nginx/html:ro nginx

http://localhost:8080 を開いて下記のような画面が出たら OK

f:id:hiboma:20160916011828p:plain

API のエンドポイントが //overpass-turbo.eu/ に向いているので変更が必要。設定を開き、先ほど docker で動かした ローカル Overpass API のエンドポイント URL //localhost/api をセットする

f:id:hiboma:20160916010916p:plain

テストクエリで家の近所あたりを選択してみると ...

f:id:hiboma:20160916121514p:plain

やったね! 自転車屋を探したりして遊ぶ

f:id:hiboma:20160916130949p:plain

http://overpass-turbo.deほぼ 同等なローカル版が動かせた。

注意点として日本のOSM地図しかインポートしていないので、海外のノードを探そうとしたりして見つからない!!!1 となってハマらないように。後は、API がローカルにあるとはいえ でかいデータセットを取るクエリを投げるとブラウザが例外を出す。

加えて 下記の 地図タイルサーバー についても目を通して頂きたい

⚠ 地図タイルサーバーについて

ここまでの手順では全てをローカルで動かせていない。 地図タイルサーバー が下記のような設定になっている

//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png

f:id:hiboma:20160916122012p:plain

tile.openstreetmap.org とは?

JA:タイル利用規約 - OpenStreetMap Wiki をよく読まれたし

しかしながら、OpenStreetMap が持っているサーバは全て寄付によるリソースで運用されています。その能力は厳しく制限されています。OSMタイルのヘビーな利用はマップを編集する人々の能力を削ぐことになりかねませんし、またハードウェアや通信帯域を提供してくれている個人の寄付及びスポンサーシップの乱用にあたります。そのため、我々はタイル利用者にこのタイル利用ポリシーに従うことを要求します。

乱用して迷惑をかけないようにしよう (手元でちょっと動かすぶんには問題ないように思うのだが、閾値がちょっと分からない。地図タイルサーバーもローカルで動かせると細かいことを気にせずに更にガシガシ遊べるだろう


疲れたので本エントリはここまで