読者です 読者をやめる 読者になる 読者になる

Garmin Edge 520J の地図を作る - OpenStreetMap 地図データを mkgmap でイメージ化

前前回前回 の続き

今回作るもの

Garmin Edge 520J 用の地図データを作っていく。最終的に下記のようなファイルができる

 $ ls /Volumes/GARMIN/Garmin/gmapbmap.img
-rwxrwxrwx 1 hiroya 14M 2016-09-19 19:22 /Volumes/GARMIN/Garmin/gmapbmap.img

.img の拡張子が付いたバイナリである。仕様はちょっと分からない。

本エントリではこのファイルを イメージ と呼ぶことにする

Garmin Edge 520J のイメージを作る方法

日本語のソースはあまり多くはない。参考になるものをピックアップしていこう

JA:Mkgmap/help/How to create a map - OpenStreetMap Wiki

GarminのGPSデバイスにOSMデータをロードする場合は、コンパイル済みの地図(pre-compiled maps)をダウンロードするか、またはあなた自身でコンパイルすることができます。 このページでは、コンパイルオプションについて説明しています。 生成されたマップはルーティング(自動車用)やアドレス検索もサポートします

JA:OSM Map On Garmin - 案内: OSMデータから地図を作る。

案内: OSMデータから地図を作る。
一般的な手順は、次の通りです(上記のソフトウェアの節も参照してください)。

OSM データを入手する
一番簡単な方法は、サイトの Export タブを使うことです。これは見ている範囲の地図がダウンロードできます。ダウンロード時のオプションで OpenStreetMap XML data を選択してください(ズームレベル11以上で有効になります)。
国全体や世界全体を扱う場合は、 Planet.osm か、利用可能な抜粋されたデータをつかってください。

(... 略)

.IMG ファイルに変換する: .osm ファイルを Garmin 地図イメージファイル(.img)に変換する必要があります。たぶん、 Mkgmap か GroundTruth を使うことになるでしょう。 Mkgmap は、まれに大きな入力ファイルを処理しないので、たぶん、 OSM ファイルを小さな塊にカットする必要があります。新しい splitter を使うのが最も簡単です。

femoghalvfems.info

Garmin Edge 520J は容量が少ないことや文字コードShift_JIS であったりの制約がある。これらをクリアするには @masarapmap さんの過去エントリを読むと理解が早いだろう

masarap.club

OpenStreetMap から .osm 形式のファイルを取り出す

Overpass turbo でクエリを打てば .osm 形式でエクスポートできる。適当なエリアのデータをエクスポートして、イメージ作りをテストしていく

栃木の那須あたりを矩形選択してエクスポートする (那須の旅行中にこのエントリを書いている)。ちなみに 前回作った localhost の Overpass API に向けてクエリを投げている

$ echo '(node(36.5, 138.5, 37.5, 140.5);<;);out;' | curl -d @- localhost/api/interpreter > sample.osm

なかなかサイズが大きい

 $ ls -hal sample.osm
-rw-r--r-- 1 hiroya 573M 2016-09-18 22:15 sample.osm

sample.osm の中身は OSM 形式の XML になっている

$ head -30 sample.osm 
<?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="57298145" lat="37.4152996" lon="138.8173695">
    <tag k="source" v="PGS"/>
  </node>
  <node id="57298155" lat="37.4165870" lon="138.8182620">
    <tag k="source" v="PGS"/>
  </node>
  <node id="57298159" lat="37.4173433" lon="138.8188474">
    <tag k="source" v="PGS"/>
  </node>
  <node id="57298168" lat="37.4156162" lon="138.8184020">
    <tag k="source" v="PGS"/>
  </node>
  <node id="57298170" lat="37.4149564" lon="138.8180706">
    <tag k="source" v="PGS"/>
  </node>

<!-- これ以降は省略 -->

📝 http://overpass-api.dehttp://overpass-turbo.eu からデータを取ってテストしたい場合は、API が返すデータサイズが小さくなるよう工夫が必要そう

この sample.osmGarmin Edge 用のイメージにしていく

.osm.pbf 化する (オプション)

sample.osmsample.osm.pbf にする。実は .osm からイメージは作れるので 別に必要無い手順なのだが、フォーマットやツールの勉強・練習として含めている

osm.pbfとは?

JA:PBFフォーマット - OpenStreetMap Wiki を読んで理解しよう

PBFフォーマット ("Protocolbuffer Binary Format") は、主にXMLフォーマットの代替として意図されているものです。これは、gzip圧縮されたplanetのおよそ半分のサイズ、bzip圧縮されたplanetよりおよそ30%小さいサイズになっています。また、gzip圧縮されたplanetよりおよそ5倍速く書き込み、6倍速く読み込みます。このフォーマットは将来の拡張性と柔軟性をサポートするように設計されました。

... 略

低レベルの保存形式としてGoogle Protocol Buffersが使われます。

Google Protocol Buffers を用いてるとのこと。

PBF/Software Compliance - OpenStreetMap Wiki で .osm.pbf の読み書きに対応しているツールが一覧できる。今回は CLI ツールの osmconvert を使う

osmconvert とは?

http://wiki.openstreetmap.org/wiki/Osmconvert

osmconvert can be used to convert and process OpenStreetMap files. 

osm 形式から他のフォーマットへの変換であったり、地図データから一部のエリアを抽出したり、いろいろ出来るぽい。巨大な地図データを扱う際に必要そうな機能が詰まっていそう

ソースは下記リポジトリでよいのかな

github.com

1ファイルの C で書かれている。ポインタ操作が多くて読みとくのはちょっと大変そう ...

osmconvert のインストール

http://wiki.openstreetmap.org/wiki/Osmconvert に乗っているワンライナーでインストール可能

wget -O - http://m.m.i24.cc/osmconvert.c | cc -x c - -lz -O3 -o osmconvert
# 適当に $PATH の通っている場所に mv しておこう
mv osmconvert /path/to/bin

オプションに --out-pbf を付けて .osm を .osm.pbf としてアウトプットできる

 $ osmconvert -h 

... 略

--out-pbf                 write output in .pbf format (bin. standard)

変換する

$ osmconvert sample.osm --out-pbf > sample.osm.pbf

.osm を .osm.pb に変換できた。 1/10 以下に圧縮されている

$ ls -hal sample.osm*
-rw-r--r-- 1 hiroya 573M 2016-09-18 22:15 sample.osm
-rw-r--r-- 1 hiroya  43M 2016-09-19 18:58 sample.osm.pbf

osm.pbf を イメージ化する

イメージを作る際には mkgmap を使う。mkgmap = Make Garmin Map の略称だろう

mkgmap とは?

http://wiki.openstreetmap.org/wiki/Mkgmap

Creates maps for Garmin GPS devices using OSM data
Full control which OSM data is integrated into the map (style system)
Full control how POIs, streets and all other elements are displayed (TYP file compiler)
Full address search support
Routing support
Many options for fine control over the map creation process

これもいろんなオプションが付いている。今回関心のあるのは Garmin Edge 520J のイメージを作ること

mkgmap のインストール

http://www.mkgmap.org.uk/download/mkgmap.html から .jar 形式でダウンロードできる。本エントリでは OS X で作業することを前提にしているが、OS X での Java のインストール方法、Java の扱い方については割愛する

# ブラウザでダウンロードしても問題ないよ
wget http://www.mkgmap.org.uk/download/mkgmap-r3695.zip
unzip mkgmap-r3695.zip

# リビジョン番号が邪魔なのでシンボリックリンク貼っておく 
#  jar はどこに置いておくのがいいん jar ろ
ln -sv mkgmap-r3695 mkgmap 

520J 用の細かい最適化はすっ飛ばして、とりあえずイメージを作るだけなら 下記のように実行する

# sample.osm.pbf をソースとする
java -jar mkgmap/mkgmap.jar --gmapsupp \
    --code-page=932 \
    --name-tag-list=name:ja,name,int_name,name:en \
    --input-file=sample.osm.pbf

📝 この例では説明を簡略にするためにオプションをシェル引数に列記している。別の方法としてファイルに列挙して --read-config=filename -c filename` として指定する 方法もある。splitter と併用して複数の .osm を扱う場合にはこちらの方法が便利なようだ。

問題がなければ gmapsupp.img というイメージが出来ているはず

$ ls gmapsupp.img 
-rw-r--r-- 1 hiroya 14M 2016-09-18 22:24 gmapsupp.img

イメージを Garmin Edge 520J にインストールする

出来上がったイメージを Garmin Edge 520J にインストールする

# gmapbmap.img を別途バックアップしておきたい人は どっかにコピーしておこう
cp -v gmapsupp.img /Volumes/GARMIN/Garmin/gmapbmap.img 
diskutil unmount /Volumes/GARMIN 

gmapsupp.imggmapbmap.img にリネームしてコピーしているが、理由は下記エントリを参照するとよい

osm-for-garmin.org

Garmin Edge を USB ケーブルから外すとデバイスが自動起動するので、地図を表示して期待通りにできているかどうかを確認する

  • 📝 Finder でドラッグ・アンド・ドロップでコピーしても差は無い。検証作業を何度も繰り返す場合はシェルで操作すると楽かな。
  • 📝 10数MBでもコピーに時間がかかる (1分ほど) 。テストする際はイメージを小さくするとイライラしない

出来上がった地図

f:id:hiboma:20160919190837j:plain

やったー!!!!1 広域表示にすると地図が一部しか表示されていない

f:id:hiboma:20160920104730j:plain

API からとったデータがこの範囲の分しかないってことね

日本語の扱い

ところで mkgmap でビルドする際に下記のオプションを付けないと ピンイン表記 になってしまう (「文字化け」とは違う)

--code-page=932 --name-tag-list=name:ja,name,int_name,name:en 

f:id:hiboma:20160919190853j:plain

検証過程を twtiter にぶつぶつ書いていたら @masarapmap さんに直接教えていただいたのだった!!1

日本語の扱いについては是非とも下記エントリを参照されたし

osm-for-garmin.org