私の家の片隅に使われていないiPhone4が転がっています。何か使えないかなぁと考えていたのですが、バイク用ナビとして活用することを思い立ちました。基本的には古いバージョンのMAPS.ME(オフライン地図アプリ)が動きますが地図が少々古いのがネックです。そこで、最新のOSMに等高線を追加した地形図を作成してみました。これがあれば地形の起伏が分かるので自転車ツーリングにも使えます。
環境
この記事では以下の環境で作業を行いました。
PC(仮想PCに構築)
- OS:Ubuntu 16.10(64bit)
- CPU:core x 4
- Memory:8GByte
- HDD:1TByte
ターゲット
- iPhone4(iOS 7.2.1)
- MAPS.ME 6.3.3
はじめに
iPhone4ではMAPS.ME最新版が動かない
まず初めに、MAPS.ME最新版をインストールするにはiOS9.x以上が必要です(2018/05/13時点)。iPhone4はアップデートしてもiOS7.1.2が最後なので、動作するのは古いバージョンのMAPS.ME(version 6.3.3以前のもの)です。これは最新版と比べると無い機能があるものの簡易ナビとして使う分には十分です。
次に地図データですが、MAPS.MEは本体バージョンと地図バージョンが紐づいているので古いMAPS.MEで使える地図は古い地図になります。MAPS.ME 6.3.3だと地図はリリース当時2016年のものです。
最新の地図が欲しい
MAPS.MEはOpenStreetMap(以下、OSM)のデータから地図を作っています。数年前の地図データでも問題ないかもしれませんが、OSMは地図の不具合やコンビニ等POIの追加更新を続けているので出来れば最新の地図が欲しくなります。
さらに欲を言えば、ツーリング用に等高線があると嬉しい・・・。幸い、最新のMAPS.ME向け地図なら自作したことがあります。古いバージョンでも当時のツールをビルド出来ればいけるハズ、ならば作ろうというのが本記事の趣旨です。
古いバージョン向け地図を作る
(事前準備)必要なデータを用意する
事前準備として、地図生成に使うOSMデータ等を用意します。この辺りは以前にMAPS.ME地図自作の環境構築を行った記事を参考にしてください。ツールのビルドに必要なパッケージについても同様にインストールします。
(Step1)地図生成ツールをビルドする
以前の記事でも地図ツールをビルドしましたが、それをそのまま使うことは出来ません。なぜなら、MAPS.MEはバージョンアップに伴って地図形式を変更したことがあり(iPhone4で動くバージョンだと地図本体とルーティング用にOSRMのデータを別個に持っていたみたい)、古いバージョンでは現バージョン向け地図を読み込めないからです。
ということで、まずはgithubからソースコード一式を入手します。ここではiPhone4で動作するバージョンである"release-63"をチェックアウトしています。サブモジュールのアップデートも忘れないでください。
$ git clone https://github.com/mapsme/omim.git $ cd omim $ git checkout release-63 $ git submodule init $ git submodule update
次に地図生成ツールをビルドします。
$ echo | ./configure.sh $ omim/tools/unix/build_omim.sh
このとき、私の環境では次のようなエラーでビルドがこけました。どうもヘッダが見つからないようで、シンボリックリンクを張ってやるとパスします。
..... /usr/include/c++/v1/cxxabi.h:21:10: fatal error: '__cxxabi_config.h' file not found $ sudo apt-get install libc++abi-dev $ sudo ln -s /usr/include/libcxxabi/__cxxabi_config.h /usr/include/c++/v1/__cxxabi_config.h
(Step2)MapCSSを編集する
次に地図スタイルに等高線を追加します。これは必須ではありません。地図に等高線は不要という方は飛ばしてください。
以下のパスにあるMapCSSと定義ファイルを編集します。内容については以前のMAPS.ME地図自作の記事を参考にしてください。
- omim/data/styles/clear
- omim/data/mapcss-mapping.csv
編集が完了したらスタイルをビルドします。
$ omim/tools/unix/generate_styles.sh
このとき、Qtのバージョンによってはシンボルが見つからないとエラーが発生します。私の環境では"5.10.1"では駄目、"5.5.1"(apt-getでインストールしたやつ)では正常動作しました。以前の記事でQt5.10.1をインストールした方は環境変数QT_SELECTを変更すればエラーを回避できます。
..... ../out/release/tmp/skin_generator/main.o: In function `std::__1::__atomic_base<int, false>::store(int, std::__1::memory_order)': /usr/include/c++/v1/atomic:842: undefined reference to `qt_qhash_seed' clang: error: linker command failed with exit code 1 (use -v to see invocation) # Qtのバージョンを変更する $ qtchooser -list-versions 4 5 default qt4-x86_64-linux-gnu qt4 qt5-x86_64-linux-gnu qt5.10.1 qt5 $ export QT_SELECT=5 $ qtchooser -print-env QT_SELECT="5" QTTOOLDIR="/usr/lib/x86_64-linux-gnu/qt5/bin" QTLIBDIR="/usr/lib/x86_64-linux-gnu" $ qmake -query QT_VERSION 5.5.1
(Step3)地図をビルドする
以下のようにしてstxxlの設定ファイルを書き出します。"disk="で指定した場所に一時ファイルが作られるので環境に応じて変更してください(400GByteの巨大ファイルが作られるのでHDD容量にご注意)。
$ echo 'disk=/tmp/stxxl_disk1,400G,syscall' > ~/.stxxl
次のスクリプトを"omim/tools/unix/test.sh"として保存して実行します。スクリプトの各ファイル名やパスは環境に応じて変更してください。メモリをたんまり積んだ環境を用意できる方は"NS=map"とすると処理が速くなります。
omim/tools/unix/test.sh
#!/bin/bash SCRIPT_PATH="$(dirname "$0")" export REGIONS="$(ls $SCRIPT_PATH/../../data/borders/Japan*.poly)" export PLANET="/path/to/japan-latest-contour.o5m" export COASTS="/path/to/WorldCoasts.geom" export SRTM_PATH="/path/to/SRTM/SRTM1v3.0/" export TARGET="${TARGET:-$SCRIPT_PATH/target}" export NS=raw #export NS=map #export NS=mem bash "$SCRIPT_PATH/generate_planet.sh" $@
後はスクリプトを実行するだけです。所要時間は私の環境で1.5日といったところでしょうか。
$ omim/tools/unix/test.sh -r
iPhone4に地図を転送する
出来上がった地図/スタイル/定義ファイルをiPhone4に転送します。ここではiTuneを使いました。
iTuneでMAPS.MEを見ると、地図は"160822"というディレクトリにはいっています。このディレクトリの中身を作成した地図ファイルと置き換えてください。
次に以下のスタイル/定義ファイルを転送します。
- omim/data/classificator.txt
- omim/data/types.txt
- omim/data/colors.txt
- omim/data/patterns.txt
- omim/data/styles/drules_proto_clear.bin
- omim/data/styles/drules_proto_dark.bin
- omim/data/styles/drules_proto_legacy.bin
これで完了です。MAPS.MEを起動して動作確認を行ってください。手順通りにいけば、新しい地図が表示されるはずです。
(*1)この地形図の等高線は国土地理院・基盤地図情報の数値標高モデル(DEM10B)を元に作成したものです。
所感
MAPS.ME地図自作シリーズのiPhone4版です。もはや売るにも機を逸したiPhone4、どうにか活用出来ないかと考えたところ結局GPS/オフライン地図に落ち着きました。古い端末でもっさりとしたところはありますが、自作した地形図をいれてみると意外としっくりときます。埃をかぶったiPhone4をお持ちの方は試してみては如何でしょうか。
(2018/05/19追記)
この記事で作成した地形図を公開しました。興味のある方はお試しください。
参考
この記事は以下の内容を参考にさせて頂きました。
- Boost - Dev - Libc++ failures on linux
http://boost.2283326.n4.nabble.com/Libc-failures-on-linux-td4692170.html - stackoverflow - get a basic c++ program to compile using clang++ on Ubuntu 16
https://stackoverflow.com/questions/37096062/get-a-basic-c-program-to-compile-using-clang-on-ubuntu-16/38385967#38385967 - reddit - Kdenlive suddenly stopped working
https://www.reddit.com/r/openSUSE/comments/6euekm/kdenlive_suddenly_stopped_working/ - Bug 382757 - kdenlive won't launch "Undefined Symbol: qt_hash_seed"
https://bugs.kde.org/show_bug.cgi?id=382757
ご返信ありがとうございます。
大きすぎずちょうどいいサイズで気に入っていたiPhone4ちゃんをもう少しこき使えそうです。
場所ではなくルートとなるとMAPS.ME 6.3.3 は面倒見てくれないんですね!
それにしても iPhone4 とiPhone4S の差がこれほど大きいものになるとは。
他にも面白そうな記事が多いのでプログラムのことは分からないんですがブログを拝読させて頂きます!
>それにしても iPhone4 とiPhone4S の差がこれほど大きいものになるとは。
まったくです。あのときiPhone4Sに乗り換えておけばよかったと何度か思いましたが、そうなるとこの記事ネタが生まれなかったので、今はまぁiPhone4持っててよかったかなと。
>他にも面白そうな記事が多いのでプログラムのことは分からないんですがブログを拝読させて頂きます!
趣味全開の雑記ですが、楽しんで頂けたら幸いです。
まさに求めていたことをされている方がいらっしゃって感動しました!
iPhone4のMAPS.MEが一気にパワーアップしました!ありがとうございます!
さらに欲張ってKMLやGPXのルートを読み込ませることは可能なんでしょうか?
それができればGARMINいらずになってしまう。
コメントありがとうございます。
お役に立てたようで何よりです。私もはじめてiPhone4版でコメントを貰えてちょっと嬉しいです(笑
>さらに欲張ってKMLやGPXのルートを読み込ませることは可能なんでしょうか?
本家がその機能を採用してくれるのがベストなんですが・・・個人的にはアプリの改造やってみたいと思っているのですが、流石にすぐには難しそうで勉強中です。実際にやるとしたら、公開が比較的簡単に出来そうなAndroid版からかなと考えています。