避難所検索@伊勢 ではオフラインマップを表示しているのですが、いつの頃からか、洪水状態になっています(バージョン 1.0beta4 )。
ちょっと余裕ができたので、原因究明と対策を取りましたので、メモっておきます。
なお、全部で3つに分かれています
- OpenStreetMap のオフラインマップ作成時の不具合の修正 (1/3) - プログラマーのメモ書き <-- いまここ
- OpenStreetMap のオフラインマップ作成時の不具合の修正 (2/3) - プログラマーのメモ書き
- OpenStreetMap のオフラインマップ作成時の不具合の修正 (3/3) - プログラマーのメモ書き
この記事の目次は次の通りです。
問題の現象
こんな感じで、洪水のようになってます。
正しくはこんな感じになるはずです(https://openstreetmap.org で表示)。
ちなみに、同じ場所を openstreetmap.org の編集エディタの iD で開くとこんな感じになります。
画像だとちょっとわかりにくいかもしれませんが、どうも、洪水になっているところは、地物が何も描かれていないところに該当しているようです。
海岸線のチェック
まずはオフラインマップに使っている海岸線が正いかどうか調べてみました。
OpenStreetMap の各種データを検証するためのサイト
OSM Inspector | Geofabrik Tools
上記のサイトで海岸線の状態をチェックできるとのことです。実際に調べてみると、2020/9/24 時点ですが問題ないようでした。
ということは、地面を表す特定のタグに対する描画色指定の問題っぽい感じがしてきます。 とはいえ、結論を急ぐ前に、もう少しいろいろと調べてみます。
アプリと map ファイルの組み合わせを確認
次に、アプリと map ファイルの組み合わせで確認してみます。
アプリとしては、
- mapsforge のサンプル、2020/9/18時点の最新版, 150edcf
- 避難所検索@伊勢, 1.0beta4
の2つ。
map ファイルは
- mapsforge のプリコンパイルファイル, ベルリンのもの, berlin.map
- 避難所検索@伊勢, 1.0beta4 リリース時点でapkファイルに含めているファイル
- オフラインマップの更新ファイルの最新版, 2020/9/18時点
の3種類を試します。
map ファイルの準備
berlin.map は mapsforge のダウンロードサーバーから落としておきます(2020/9/18 時点のものを使いました)。
避難所検索@伊勢, 1.0beta4 リリース時点でapkファイルに含めているファイルは、 github のリポジトリにも含まれているので、それを用意します。
あと、オフラインマップの更新ファイルの最新版(2020/8/24 作成)のファイルを S3 から落としておきます。
なお、各アプリでこれらの map ファイルを参照するときは、適宜ソースコード上のファイル名と初期表示位置の緯度経度を修正しています(また、避難所検索@伊勢は現在位置に初期位置を移動させる機能もあるので、それもコメントアウトしています)。
mapsforge のサンプルアプリでの動作確認
mapsforge のリポジトリを clone して、 AndroidStudio でプロジェクトを開きます。何もしない状態で一度インストールと実行しておきます。こんな感じの初期画面が出てきます。
この一番上の『GettingStarted』ボタンを押すと、シンプルに地図表示だけを行えるので、これを使います。
berlin.map
mapsforge のサンプルを見ると berlin.map を設定しなさいとあります。初回実行時にも下記のように注意が出てきます。
指示通りに、ダウンロードした berlin.map を実機の所定のフォルダにコピーします。
C:\Users\mor\home\work\tmp\mapsforge> C:\Users\mor\home\work\tmp\mapsforge>adb push berlin.map /sdcard/Android/data/org.mapsforge.samples.android/files/ berlin.map: 1 file pushed, 0 skipped. 15.9 MB/s (39343572 bytes in 2.367s) C:\Users\mor\home\work\tmp\mapsforge>
もし、 org.mapsforge.samples.android がなければ、(この時点では何も地図が表示されないけど)一度 GettingStarted ボタンを押して地図を表示させるとフォルダが作られると思います。
サンプルアプリで地図を表示させるとちゃんと出ているのですが、ベルリンだと地物が多いので、土地が表示されているのか、地物が表示されているのか区別つきません。
なので、 openstreetmap.org でベルリン付近を表示させて、ログイン後『iD』エディタで編集画面にして、ベルリン近辺の地物がない箇所を確認しておきます。
上記の赤い丸で囲んだあたりがよさそうです。
同じ場所を拡大してスマホの画面でも表示すると、
ちゃんと地面の色になってますね。
ise.map(apk同梱版)
次は、現在のアプリをリリースした際にapkファイルに含めていたファイルで試します。
ファイルを実機にコピーして、
C:\Users\mor\home\work\tmp\mapsforge>adb push ise_init_1.0beta4.map /sdcard/Android/data/org.mapsforge.samples.android/files/ ise_init_1.0beta4.map: 1 file pushed, 0 skipped. 58.3 MB/s (4728762 bytes in 0.077s) C:\Users\mor\home\work\tmp\mapsforge>
伊勢市駅付近を表示させると
問題ないですね。
ise.map(定期更新版)
最後に、定期的に更新しているオフラインマップを試します。 上記と同様にmapファイルを実機にコピーして、伊勢市付近を表示させると
倍率は違いますが、明らかにこれがおかしいですね。
避難所検索@伊勢での動作確認
ソースコードは 1.0beta4 のものを使いました。 上記と同様に試していきます。
berlin.map
正しく表示されています。
ise.map(同梱版)
問題ないですね。
ise.map(定期更新版)
やはりこれが問題ですね。
動作状況
まとめると、こんな感じになりました。
mapsforge sample | 避難所検索@伊勢 | |
---|---|---|
ライブラリ ver | v0.14.0+ | v0.11.0 |
berlin.map | 〇 | 〇 |
ise.map (apk同梱版) | 〇 | 〇 |
ise.map (定期更新版, 2020/8/24) | × | × |
ということは、オフラインマップの定期更新で問題が起きるようになったと考えるのが妥当ではないかと思います。
ただ、2点ほど腑に落ちないのが、
- apk同梱版の ise.map も同じ手順で作成したものを使っている
- 最新版のリリース前に、オフラインマップの更新に問題がないことを(少なくとも一度は)確認している
というところです。
となると、上記が記憶違いでない限り、なぜオフラインマップの作成環境自体の変更をしていないのに、ある時期から正しく表示されなくなったのか?という点が非常に不思議です。
いずれにしても、上記を踏まえて、さらなる原因調査を行いたいと思います。続きは、次の記事にまとめていきます。