読者です 読者をやめる 読者になる 読者になる

ちずぶらりHackers

オープンデータ化も進んでいる古地図、絵地図を扱うiOSアプリ、ちずぶらりをハックし倒します。iOS / Androidでのクローンアプリの開発も予定しています。

iOS用 Map SDK、route-meをGIS用途で用いる際の注意や代替ベースマップについて

iOS開発 API TMS FOSS4G 地図

id:hal_sk さん記事:

地図SDKは MapKit だけじゃない!OSMやBingが使える iOS用 Map SDK、route-me のセットアップ方法

ちょうど昨日、iOS上のハンディGISソリューションを開発されている方から、iOS6のMapKit以外のソリューション紹介を話振られたところだったので、タイムリーというか、先を越されたというか。
関さん記事だと導入だけなので、以前利用感のレポートしてるので張っておきますね。*1

で、それだけだとアレなので、GIS系の方から紹介してと言われたわけですから、GIS的にRouteMeを使う際のユースケースに対する注意点みたいなものを。

昨日ちょっと気付いたんですが、iOSアプリ、AppStoreに公開されてるような一般人向けアプリ作られてる人は、ほぼ皆RouteMeなり独自ビューワなり使って非iOS側地図を表示してます。
MapKitそのものを改造してタイルオーバーレイ載せられるようにする、等というガッツのある事をしてる人はほとんどいません。
が、ガチGISに近い個別提供ソリューション作ってる人は、割とMapKitそのものを改造するアプローチをされてるんですね*2
たかだかN数2〜3なので偶然と言えば偶然かも知れませんが、もしかしたらこういう理由で、という心当たりはあります。

以前の記事でも書きましたが、iOSのMapKit、及びRouteMeは、共に連続ズーム(ピンチインアウトする指に吸い付くような、ズーム値として小数値が取れるようなズーム)を扱えます。
扱えるのですが、どこまで扱えるかの範囲が違うのです。
RouteMeは、ユーザ操作のピンチインアウト時だけでなく、API側から直接ズーム値を叩く際でも、小数点ズーム値を指定できます。
が、MapKitは、ユーザ操作のピンチインアウトでは連続ズームが扱え小数点ズーム値を採れますが、API側から叩く際は、連続ズームが扱えず*3、ズームサイズが整数値に正規化されてしまうのです*4

これは、地図の切り替え時に若干の問題を生じます。
RouteMeとMapKit間で同じ場所の地図表示を切り替えた場合、MapKit=>RouteMeの方向の切り替えは、表示範囲を完全に再現する事ができます。
が、RouteMe=>MapKit方向の切り替えは、表示範囲を完全に再現する事ができません。
今昔散歩東京時層地図といった、RouteMe或いは自作ビューワとMapKitを切り替えているアプリで試せば判りますが、MapKitが勝手に表示範囲を正規化するせいで、iOS標準地図に切り替えた際に微妙な表示範囲ズレが発生します。

一般ユーザ向けアプリならば、この差はたいした事がないかもしれませんが、GISエンタープライズソリューションですと、ぴったり変換できないというのは割と大きな問題の可能性があります。
この辺を避けるため、これまでGIS寄りの開発されてきたベンダさんは、MapKitを改造する道を選ばれたのかもしれません。
MapKit内で完結すれば、切り替え時のズーム合わせ等に心煩わせる必要もないですので。

で、続いて、とは言ってもMapKitとRouteMe使い分けないといけないけど、それでもぴったり合わせないといけない、という時の解決策。
以前開発していたちずぶらりで実際に採用していたものを含め、3パターンくらい考えつきますが、

  1. MapKit側のページを切り替え時にアフィン変換し、微妙に拡縮して表示する

MapKitは勝手にズームサイズを整数値に正規化しますが、本来与えたかった少数ズーム値との誤差は出せますし、その誤差が判れば表示を何倍拡縮すればぴったり合うかも導き出せます。
その値の分だけ、MapKitのビューを拡縮表示してやれば、ぴったり切り替える事は可能です。
ただし、この場合、MapKitを表示している間はずっと拡縮されたままなので、地図表示としての画面は若干モヤッとします。
iOS地図がラスタだった頃は、しょせん小数点ズーム値の間はモヤッと表示だったので気にならなかったかもしれませんが、iOS6以降のベクタ地図では、小数点ズームでも本来モヤらないはずのものがモヤるので、ちょっとやな感じかもしれません。

  1. 切り替え時だけぴったり合わせ、以降は正規化されたズームにする

最初の案と似てますが、切り替え時だけぴったり合わせ、その後一定時間後やユーザのタップアクション等をトリガに、正規化されたズームの地図に変える案です。
切り替える瞬間だけぴったり合ってれば、その後ちょっとズレても、ああ何か事情があるんだな、とユーザも納得してくれると思います。
或いは、切り替える前にRouteMe側を近傍の整数ズーム値に移し、その後切り替わるという形でも、どちらでもありでしょう。

  1. もうMapKit捨てちゃえ!RouteMe一本で!

MapKit、継続して使っても所詮iOSのショボ地図です。
もうこの際、MapKit捨てて全部RouteMeで統一するというのも手です。

その場合、代わりに採用するベースマップが問題ですが、残念ながらGoogle Mapsは使えません。
お金を払ってもダメなはず。そういうタイル売りのインタフェースが今ないためです。

Yahooロコ地図は、独自SDK経由で使えますが、そうすると結局RouteMeとの切り替えになるので、SDKAPIからの少数ズーム指定に対応してないと、結局MapKitと同じ問題が生じます。
残念ながら、YahooロコSDKが少数ズームに対応しているかは情報持ってません。誰か補完してくれると嬉しいなあ。
また、商用利用については無償ではなく使用料が取られるようです。

Bing地図も残念ながら情報持ってません。
RouteMeのサンプルの中でもBIng地図を使った事例があるので、もしBing地図が使えれば、普通にBing地図+RouteMeで昔のMapKitの代わりに十分なるのですが、あれだけの地図が無償で自由に使えるわけがないので、難しいかなとは思います*5
もし興味があれば、ご自分でライセンス等調べてみてください*6

OSMは、シンプル無償のタイルソースから、有償でデザインされたタイルソースまで、いろいろあります。
冒頭で上げた関さんの記事でもいくつか紹介されてますので、見てみてください。
でも、DISるわけではないけど、エンタープライズ用途ではちょっと厳しいんじゃないかとも…。

個人的に今なら一番の代替候補になりそうと思うのが、電子国土v4ですね。
これなら日本全国あるし、標準のタイル仕様で作られてるからRouteMeでの利用も余裕のはず*7だし、無許可利用はダメですが申請さえすれば商用でも使えるはず。
電子国土だったら、精度にうるさいGISユーザ様も大満足?じゃないかとも思いますし。


という感じで、MapKitの代わりになる地図API RouteMeの紹介と、GIS用途に採用する際の注意点、iOS地図の代わりになりそうなベースマップについてまとめてみました。
参考になりましたら。

*1:FOSS4Gじゃないけど、Android向け高性能地図ソリューションの紹介もあるでよ。ちなみに、このNutiteqのAndroid地図SDKGithubでサンプルアプリ公開されてます。飽くまで利用のサンプルで、SDK自体はjar提供ですが。

*2:冒頭で紹介したあっとクリエーションさんのカンタンマップとか、マップクエストさんのi物件マップとか

*3:ただし、iOS5のMapKit当時。iOS6では私はiOS開発から離れたので、どうなってるかはよく知りません。

*4:正確には、MapKitにはAPI上ではズームサイズという概念はありません。ズームサイズではなく、表示範囲の矩形を与えて、それに適したズームをMapKitが内部判断して合わせます。その際に、APIの表には出てきていなくてもSDKの内部的にはズームを扱ってるので、ズーム値が小数点になった際に、勝手に前後の整数値に正規化してしまうのです。

*5:むしろ、今までのGoogle高品質地図+MapKit使い放題というのが異常すぎたのです。

*6:知らないのになぜ一応載せているかというと、一応選択肢候補としてはあるよ、という事を意識喚起するためです。

*7:すみません、自分では確かめてません

© TileMapJp/歴史国土/地図タイル工法協会