2008年10月07日

iPhone で地形図を表示

IMG_0004.PNG

iPhone で独自の地図、特に地形図を表示する方法はないかなーと調べている過程で、標準の「マップ」を使ってオフラインで地図を表示する方法があることがわかった。要は「マップ」がキャッシュ用に使っているSQLiteのデータベース(/var/mobile/Library/Caches/MapTiles/MapTiles.sqlitedb)に希望する範囲のGoogle Mapsの画像タイルを詰め込むという方法。要Jailbreak。(参考1 http://d.hatena.ne.jp/ikki_j/20080203/1202026414
Google Mapsから任意の範囲の画像タイルをまとめてダウンロードできるツールは以前からいくつかあるが、その中にはiPhone用に最適化してSQLiteのデータファイルにまで変換してくれるものもある。(参考2 http://www.ipoday.com/ipodtouch_applications/OfflineMaps.html

この画像タイルをカシミールなどで作成した地形図と置き換えてしまえばいい。
任意の画像をいい感じでGoogle Maps互換の画像タイルに変換してくれるツールというのは見つからなかったので、というか以前仕事で近い目的の作業をしたことがあるので、あまりちゃんと探さず、その時の処理を再利用することにした。
流れとしては

  1. 表示したい画像の左上、右下の緯度経度をパラメータとして与えると、その範囲を包含するGoogle Mapsのタイル画像を任意のスケールごとにまとめて取得、表示したい画像の解像度もスケールごとに計算するスクリプトを走らせる
  2. 取得した画像タイルをImageMagickで一枚のビットマップに貼り合わせる
  3. 生成された地図に、表示したい画像をスケールごとに合成
  4. 分割用スクリプトで再度画像タイルに戻す
  5. それをMapTiles.sqlitedbに格納する

という感じ。
生成したデータベースは直接上書きしてもいいけど、OfflineMapsを使うのが何かとラク。

で、5mメッシュを無事表示できた。画像が違うだけで動いているのは標準の「マップ」そのものなので、現在地表示にすると、こんな感じで
IMG_0007.PNG

ブワンとおおまかな範囲を表示した後、もっと精度の高い位置へグインとズーム

IMG_0006.PNG
するおなじみの動作も、色分けされた地形というパッと見で把握しやすい背景の中で行われると、より一層グッとくる感触になる。

で、まあそれなりに苦労した割には、やれること自体はリッチな機能のGPSレシーバーや、ましてノートPCにGPSを繋いだ時と何も変わらない、どころかそれよりもプアなくらいだけど、このお手軽な使用感はいままでちょっとない感じ。

IMG_0015.JPG
ここがどんな地形なのかもわからない、このなんの変哲もない風景、でも手元をみると

IMG_0008.PNG
ははあ、ここは古川が作った低地ですぐ北には台地があるんだなあ、確かに微妙に川筋に向かって傾斜してるよなあ、と思えるわけです。

iPhone が面白いのは、WiFiの基地局情報などから時々地下でもそれなりに位置を特定できることで、新宿の地下駅で発車待ちの時にこの絵をみると、
IMG_0009.PNG
おお、これからこの台地の下をモグラのように進んで行くのであるなと実感が湧く。

地形図ギリギリを帰宅中の様子。
IMG_0011.PNG