Android と OpenStreetMap と HexRinger
これは FOSS4G Advent Calendar 2011 の 12/17 分のエントリです。
さて、Android で地図アプリを作る場合、ほとんどの場合 Google Map を使うことになると思います。一方、Web の Google Map API は 10/1 から課金が始まりましたね。
Android の Google Map API はまだ課金対象ではありませんが、近い将来ひょっとしたら…かも知れません。なにせ Android はオープンソースですが、Google Map API はオープンソースではないのです。
今のうちから、代替の地図ライブラリを検討しておいた方が良いかも知れません。
Android で使える地図ライブラリは…Yahoo, Mapion は国内限定だし、Bing は見た目がアレだし…で、残る選択肢は、我々の最後の砦・よりどころ・ユートピア「OpenStreetMap」でしょう。
という訳で、前置きが長くなりましたが、今回は Android で OpenStreetMap を Google Map API っぽく扱える地図ライブラリの紹介です。
Android OpenStreetMap でググるといくつかそれっぽいものが見つかります。
その中から、もっともポピュラー?と思われる「osmdroid」を使ってみます。
osmdroid - OpenStreetMap-Tools for Android - Google Project Hosting
Android Cookbook: Recipe Using OpenStreetMap
超簡単に要約すると、
- Eclipse で Android プロジェクトを作る。
- osmdroid と slf4j の jar をプロジェクトに加える。
- xml レイアウトファイルに org.osmdroid.views.MapView を貼り付ける。(com.google.android.maps.MapView の代わりに org.osmdroid.views.MapView 使う感じ)
- パーミッションに
"android.permission.ACCESS_NETWORK_STATE" と
"android.permission.INTERNET"
を加える。 - アプリ起動時(Activity.onCreate とか)の処理で、ズームボタンとか初期位置とか設定する。こちらも MapView とか MapController とか、おなじみのクラス名が
org.osmdroid.〜 パッケージに用意されています。ちなみに MapActivity を継承する必要はありません。
以上!
ほら、できた。
amay077/OsmAndroidSample - GitHub
さて、これだけでは面白くないので、拙作 Android アプリ HexRinger を Google Map から osmdroid に変更してみましょう。
HexRinger は、自分の位置が指定したエリア(GeoHex!)から出た時に自動的にマナーモードをONにする便利アプリです! → HexRinger - Android マーケット
とさりげなく CM を挟んだところで早速作業開始ッ!
…
ふむ、さすがに package 名だけ変えれば動くもんじゃないですね。とりあえずざっと変更必要だったものを挙げました。
- GeoPoint の代わりに org.osmdroid.api.IGeoPoint を使う。
- MapActivity は存在しない。Activity で OK。なので isRouteDisplayed は実装しなくて良い。
- MyLocationOverlay.draw(Canvas canvas, MapView mapView, boolean shadow, long when) 最後の引数 when がなくなった。
- 〃 返り値が boolean から void になった。
- Overlay.draw は abstract になったので super.draw を呼ぶとエラー。
- Overlay コンストラクタに Context が必要になった。
- ItemizedOverlay は、 onSnapToItem を必ず実装しなければならない。
- ItemizedOverlay.boundCenter() がない。
- ItemizedOverlay のコンストラクタ第二引数に ResourceProxy を指定する必要がある。(ResourceProxy は new DefaultResourceProxyImpl() で生成できる。)
- OverlayItem のコンストラクタ変更。OverlayItem(String aTitle, String aDescription, GeoPoint aGeoPoint) になってる。
おし、できた!
こっちも証拠に野良アプリとして置いておきます。 → HexRinger-osm.apk
あとソースコードも → hexringer_osm_src.zip
ちょいと Google Map に比べて重いかなー。あと見た目がモバイル用に調整されてないのか、ちょっとごちゃごちゃしてますね。この辺は今後に期待ということで。
なにげに OpenStreetMap + Android + GeoHex なアプリって世界初じゃね?
というわけで osmdroid と OpenStreetMap、今後の発展に期待しましょう。
(Android は…、もう飽和してるかな…)