プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

OpenStreetMap のオフラインマップ作成時の不具合の修正 (2/3)

前回の記事の続きで、さらに原因調査を行った際のメモ書きです。

なお、全部で3つに分かれています

この記事の目次は次の通りです。

原因調査

前回の記事で、オフラインマップの自動生成と定期更新あたりに問題がありそうだとわかりました。でも、作業環境や関連するツール類はバージョンアップもしていないし、どうやって調べようかと思い悩んでいました。

たまたま、運よくオフラインマップの自動生成を試していた時にダウンロードした land-polygons-split のファイルが残っていることを見つけました。

このファイルを使って、アプリに同梱したmapファイルを作成した際と同じやり方(=現状のオフラインマップの生成と同じ方法)で、map ファイルを作ってみれば、何かわかるのではないかと考えて、まずはそれを試してみました。

古い land-polygons-split-4326 による map ファイル生成

以前ダウンロードした land-polygons-split-4326.zip, 2019/4/22 付け が見つかったので、これを使って、オフラインマップ生成と同じ手順と同じソフトウェアで map ファイルを生成してみました。これを、避難所検索@伊勢 に組み込んで表示してみると、なんと問題なく表示されます!

となると、 land-polygons の新旧が影響しているっポイですね。

land-polygons-split の提供元について

ここで、ちょっと land-polygons-split の提供元について調べてみると、mapsforge-creator のコミットログに 2019/6/10 付けで URI を旧サイトから新サイトに切り替えているのが残っていました。今の land-polygons-split の提供元(https://osmdata.openstreetmap.de/)がいつから稼働しているかまではわかりませんが、このコミットログでの切り替え付近でサイトが切り替わっているように推測してよいかと思います。

一方、apkに組み入れてある ise.map(同梱版)のタイムスタンプは 2019/5/22 付けでした。なので、旧サイトからダウンロードした land-polygons-split を使っている可能性が高いと思います。さらに、前回の記事でオフラインマップファイルの更新チェックを行ったと書いたのですが、この時のオフラインマップファイルは 2019/6/1 に動作させて生成したファイルである可能性が高い(ログファイルおよび自分用の業記録のコメントから推測)ので、利用している land-polygons-split は旧サイトからダウンロードしたものを用いた可能性が高いです。

こうやって推測していくと、新サイトの land-polygons-split を使って、手元の環境で作成したオフラインマップを組み込んで、正しく動作しているものはまだないことがわかります。

mapsforge-map-writer を更新

さて、手元でのオフラインマップ生成に問題がありそうなことはわかりましたが、 mapsforge のダウンロードサーバーからダウンロードした berlin.map は問題なく動作しています。

なので、各種ソフトウェアのバージョンに問題があるのかもしれません。ということで試しました。

まずは、オフラインマップ生成時に用いる map-writer を 0.14.0 に上げてみます。

osm@map:~/tmp/offlinemap_test/bin$ wget https://search.maven.org/remotecontent?filepath=org/mapsforge/mapsforge-map-writer/0.14.0/mapsforge-map-writer-0.14.0-jar-with-dependencies.jar 
 -O mapsforge-map-writer-0.14.0-jar-with-dependencies.jar
--2020-09-20 11:00:00--  https://search.maven.org/remotecontent?filepath=org/mapsforge/mapsforge-map-writer/0.14.0/mapsforge-map-writer-0.14.0-jar-with-dependencies.jar
search.maven.org (search.maven.org) をDNSに問いあわせています... 18.208.45.152, 18.204.165.199
search.maven.org (search.maven.org)|18.208.45.152|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 301 Moved Permanently
場所: https://repo1.maven.org:443/fromsearch?filepath=org/mapsforge/mapsforge-map-writer/0.14.0/mapsforge-map-writer-0.14.0-jar-with-dependencies.jar [続く]
--2020-09-20 11:00:00--  https://repo1.maven.org/fromsearch?filepath=org/mapsforge/mapsforge-map-writer/0.14.0/mapsforge-map-writer-0.14.0-jar-with-dependencies.jar
repo1.maven.org (repo1.maven.org) をDNSに問いあわせています... 151.101.24.209
repo1.maven.org (repo1.maven.org)|151.101.24.209|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 301 Moved Permanently
場所: https://repo1.maven.org/maven2/org/mapsforge/mapsforge-map-writer/0.14.0/mapsforge-map-writer-0.14.0-jar-with-dependencies.jar [続く]
--2020-09-20 11:00:01--  https://repo1.maven.org/maven2/org/mapsforge/mapsforge-map-writer/0.14.0/mapsforge-map-writer-0.14.0-jar-with-dependencies.jar
repo1.maven.org:443 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 6711544 (6.4M) [application/java-archive]
`mapsforge-map-writer-0.14.0-jar-with-dependencies.jar' に保存中

mapsforge-map-writer-0.14.0-jar-with-dependen 100%[=================================================================================================>]   6.40M  2.91MB/s    時間 2.2s  

2020-09-20 11:00:03 (2.91 MB/s) - `mapsforge-map-writer-0.14.0-jar-with-dependencies.jar' へ保存完了 [6711544/6711544]

osm@map:~/tmp/offlinemap_test/bin$ ls
mapsforge-creator  mapsforge-map-writer-0.14.0-jar-with-dependencies.jar

で、これを入れて動作させても、結局結果はかわらずでした。

新しい環境によるオフラインマップの作成

現在のオフラインマップ生成環境だと、タイルサーバーの処理も同居しているので、プラグインとして動作する map-writer 以外を大きく変えるのはちょっと怖いです。

なので、EC2上に新しい環境を構築して、そちらでも試してみます。

  • インスタンス, t3a.medium, 2 vcpu, 4GB メモリ
  • ubuntu 20.04
  • osmosis 0.48.3
  • gdal/ogr 3.0.4
  • map-writer 0.14.0
  • map-creater 最新版
  • オフラインマップを伊勢市周辺に限定するように修正

また、 map-creator に含まれている shape2osm は python2 での動作を前提にしていましたが、 python3 で動くように手直ししています。

で、この環境にて、map-creator 実行時のオプションを変えたり、いろいろと試しましたが、ことごとく状況は変わらず、相変わらず洪水状態でした。

その時、コマンド引数のちょっとした手違いで、 kansai 全体でmapファイルを作ってしまったことがありました。まあ、これもおかしいだろうと思い、一応アプリで表示だけさせてみると、なんと、正しく表示されました!

これはどういうことでしょうか?

kansai全体で正しく表示され、伊勢周辺に絞ると表示がおかしくなるなら、ひょっとすると、伊勢近辺に絞っている処理が影響しているのかもしれません。 とはいえ、kansai全体の場合も領域を指定するファイルの内容が異なるだけで、実行しているコマンドは同じはずです。

なぞは深まるばかりです。

シェープファイルの確認

このままではどこから手を付けてよいのかわからないので、一度、シェープファイル自体を確認してみることにしました。

以前、 OSGeoLive という FOSS4G 関係のソフトウェアをまとめて試せる環境をVM上に作ったことがあったので、そこにあるQGISを使い表示させてみることにしました。QGIS そのものに慣れていないので、結構四苦八苦したのですが、結果は、

2019/4/22, 旧サイトからダウンロードした land-polygons-split-4326

f:id:junichim:20200924155636p:plain

2020/8/16, 新サイトからダウンロードした land-polygons-split-4326

f:id:junichim:20200924155646p:plain

なんと、明らかに分割の仕方が異なっていました!

とはいえ、分割の仕方が異なるからといって、なぜ、正しく表示されないか、やはり疑問です。

QGIS上で、伊勢市の一番大きなポリゴンを選択して FID を表示すると、176993と出てます。 同じものが、map-creator から呼び出された shape2osm により、シェープファイルをOSM形式に変換したファイルにも含まれているはずだと思い検索すると、ありません。 他のポリゴンのFIDは検索してもosmファイルに含まれています。

どういうことだ?

ここからあちこちのソースコードを読んだり、リファレンスを調べたり、試行錯誤したりしたのですが、結論としては、

  • ogr2ogr で -clipsrc で区切ると、指定領域外が除外される
  • この時、一つのポリゴンが複数のポリゴンに分断されることがある(凹型を真ん中近辺のちょっと上あたりで水平に分割して、下側が領域外だとすると、上の2つの四角形が残るような感じです)
  • シェープファイルは1ファイルに1つのシェープタイプ(POLYGONとかPOLYLINEとか)しか指定できない
  • シェープタイプのPOLYGONは、一つのパーツの内部に複数のパーツ(ホール、穴)があるのは認めているが、複数のパーツが交差する形は認められていない
  • 一方、シェープタイプとして複数のPOLYGONを含む MULTIPOLYGON というのはない
  • だけど、POLYGONが分断されてMULTIPOLYGON状態になったものも存在できてしまう(こちらの記事など参照)
  • shape2osm は MULTIPOLYGON 状態のものを書き出さない

ということのようです。

当初からの不具合

どうも当初からこの挙動をしていたようです。

旧サイトからダウンロードした land-polygons-split のファイルから作成した ise.map(同梱版)の場合、伊勢市付近は正しく描画されていましたが、 openstreetmap.org と比較すると、下図の赤丸に囲んだあたりでおかしなところがあることがわかります。

https://www.openstreetmap.org/ での表示

f:id:junichim:20200924163202p:plain

避難所検索@伊勢の画面

f:id:junichim:20200924163002p:plain

ただ、旧サイトからダウンロードしたファイルだと、細かく分割されていて市の中心部で目立たなかったので、気づきにくかっただけのようです。

次は

ここまででやっと原因が分かったので、次はどうやってこれに対応するかを検討します。

参考

シェープファイルの内容をテキストデータで確認するツール

  • ogrinfo
  • shpdump, shaplib パッケージに含まれる