Maps.meは無料で使えるスマホ向け地図アプリです。ありがたいことに地図を自作出来るツール類が公開されていたので、以前から日本向けの等高線入りカスタム地図を作って楽しんでいました。今回は同じ要領でヨーロッパ全域の地図を作成したらどうなるか、やってみることにしました。
環境
今回は地図の作成時間を考えてサブPCで地図作成を行いました。処理時間に対してCPU性能も重要ですが、seekタイムの短いSSD(容量512GByteくらい)が作業ドライブとして用意出来ると高速化出来そうです。
- CPU:Core2Duo E8400@3.0GHz
- Memory:8GByte(DDR2)
- 作業用HDD:2TByte
Maps.meの地図生成ツールを改造する
今回はただでさえ日本より遥かに広大なヨーロッパ全体の地図作成しようとしているので、非常に時間を要するこことが予想されます。加えて地図に等高線を追加するとノード数が爆発的に増えるためツールが各ノードの座標を取得する処理が極めて時間を要するようになります(HDDのseek時間がネックになってきます)。そこで少しでも処理時間を改善するために地図生成ツールを少し改造することにしました。
具体的に行ったことは以下のとおりです。
- テンポラリとして書き出すnode.dat/ways.dat/relations.datをSQLite形式に変更
- 上記に伴いNS=sqliteオプションを追加
- 一部不要と思われるメモリを大量に消費していた処理をコメントアウト
修正したソースコードは以下にあります。
- suke-blog / omim - GitHub
https://github.com/suke-blog/omim/tree/release-84-contour
これで処理速度が若干、メモリ使用量を大幅に改善することが出来ました。ただ、それでも今回の処理全体で非常に長い時間がかかりました。本家が等高線付き地図をリリースしないのも処理時間が原因かな。
地図作成手順
等高線の生成
日本版と同じく等高線入りのカスタム地図を作成したいので、まずヨーロッパ全域の等高線を作成します。生成ツールはphyghtmap、DEMはSRTM1(ver3.0)を使用しました。後々でOSMと結合する必要があるのでosmconvertで処理しやすいようにファイル形式はo5mとしていますが、NaNからintegerへの変換で例外が発生して落ちることがあるのでosm(xml)形式で出力したほうが無難かもしれません。
$ phyghtmap --o5m --polygon=europe.poly --output-prefix=europe_srtm --srtm=1 --void-range-max=-500 --step=10 --line-cat=500,50 --start-node-id=20000000000 --start-way-id=10000000000 --no-zero-contour --earthexplorer-user=USER_NAME --earthexplorer-password=PASSWORD --jobs=2
かなりのボリュームがあるのでダウンロードを含めると1日以上かかります。出来上がったファイルは以下のようにしてひとつにまとめておきます。
$ mkdir merge $ cd merge #ファイル数が多すぎるので、ひとまずある程度の単位でマージする $ i=12; while [ $i -lt 46 ]; do osmconvert --out-o5m --drop-author --drop-version -o=merge_europe_srtm1_lon${i}.osm.o5m ../europe_srtm_lon${i}*.o5m; i=$(expr $i + 1);done #ひとつのファイルに纏める $ osmconvert --out-o5m -o=europe_srtm1_all.o5m merge_europe_srtm1_lon*.o5m
これをGeofabrikからダウンロードしてきた最新のヨーロッパ全域を含むOSM(europe-latest.osm.pbf)に結合します。
$ osmconvert --out-o5m -o=europe-latest-srtm1.o5m europe-latest.osm.pbf europe_srtm1_all.o5m
maps.me地図の作成
あとは地図生成ツールを実行するだけですが、その前に処理時間短縮のため作成する国々のpolyファイルを以下のディレクトリにコピーしておきます。コピーする国(と地域)はGeofabrikのサイトを参考にしました。
- omim/data/borders/region_europe/
$ ls omim/data/borders/region_europe/ Albania.poly Andorra.poly Austria_Burgenland.poly Austria_Carinthia.poly 'Austria_Lower Austria_West.poly' 'Austria_Lower Austria_Wien.poly' ... 'Ukraine_Volyn Oblast.poly' 'Ukraine_Zakarpattia Oblast.poly' 'Ukraine_Zaporizhia Oblast.poly' 'Ukraine_Zhytomyr Oblast.poly'
コピーしたら以下のようにして地図作成ツールを実行します。あとはひたすら”待ち”です。
$ cd omim/tools/unix $ ulimit -n 4000 $ REGIONS="$(ls ../../data/borders/region_europe/*.poly)" PLANET="/data/osm/europ e-latest-srtm1.osm.o5m" TARGET=/work/mwm/europe_$(date -I) NS=sqlite SRTM_PATH=/data/srtm/hgt/SRTM1v3.0/old_format/ ./generate_planet.sh -r > europe_test_map_$(date -I).log 2>&1 &
完成した地図を確認する、が・・・
完成までは長い長い時間が必要になります。私の環境では11/1に処理を開始して完了したのがなんと翌月の12/13でした。サブPCとはいえノンストップでこの時間は長かった・・・。
ともあれ出来上がった地図をタブレットに転送して表示出来ることを確認しました。

おお、ちゃんと出来ています。等高線も問題なさそう・・・と一瞬思ったのですが、実は地図をよく見てみるとトルコなどヨーロッパ南東の国はきちんと等高線が表示されているのですが、ドイツやフランスでは等高線が表示されません。調べてみるとphyghtmapで等高線の作成中にエラーが発生して処理が中断していたことが分かりました(NaNからIntegerへの変換で例外を吐いてました)。
等高線が途中までしかない状態でOSMに結合して地図作成を開始したので当然ながら等高線がある地域と無い地域が出来てしまったのです。1ヶ月以上時間をかけた結果としてはがっくりしてしまいましたが、ともかくリソースさせあれば世界中のMaps.me向け等高線付き地図を作成出来そう、というのは分かりました。


所感
とまぁ、ヨーロッパだけでこんなに時間かかっているので、世界中というのはかなり遠い話なんですが、諦めずMaps.meカスタム地形図の世界版作成に再挑戦していきたいと思います。何年かかかりそうな予感ですが(汗
ところで、今回作成するにあたってOSMの情報密度が特に濃い国としてドイツがありました。私が作るカスタム地形図では少し荒い拡大率からでも登山道が表示されるように調整しているのですが、それが鬱陶しく感じられるくらいに小道まで細かくデータが整備されています。

日本もかなり整備されているとは思うのですが、コレを見ると上には上が居るなぁと思う次第です。興味のある方は以下の記事が国別グラフなどが載っていて詳しいです。
OpenStreetMapの国別ユーザー統計 2016年版 by Simon Poole - toseto.info
https://medium.com/tosseto-info/openstreetmap%E3%81%AE%E5%9B%BD%E5%88%A5%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%B5%B1%E8%A8%88-2016%E5%B9%B4%E7%89%88-by-simon-poole-b6fa6a3b434