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

超簡単に要約すると、

  1. Eclipse で Android プロジェクトを作る。
  2. osmdroid と slf4j の jar をプロジェクトに加える。
  3. xml レイアウトファイルに org.osmdroid.views.MapView を貼り付ける。(com.google.android.maps.MapView の代わりに org.osmdroid.views.MapView 使う感じ)
  4. パーミッションに 
    "android.permission.ACCESS_NETWORK_STATE" と 
    "android.permission.INTERNET"
    を加える。
  5. アプリ起動時(Activity.onCreate とか)の処理で、ズームボタンとか初期位置とか設定する。こちらも MapView とか MapController とか、おなじみのクラス名が 
    org.osmdroid.〜 パッケージに用意されています。ちなみに MapActivity を継承する必要はありません。

以上!

ほら、できた。

Device-2011-12-17-014326
一応、証拠に Github に上げておきますね。

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) になってる。

おし、できた!

Device-2011-12-17-203451

こっちも証拠に野良アプリとして置いておきます。 → HexRinger-osm.apk
あとソースコードも → hexringer_osm_src.zip 

ちょいと Google Map に比べて重いかなー。あと見た目がモバイル用に調整されてないのか、ちょっとごちゃごちゃしてますね。この辺は今後に期待ということで。

なにげに OpenStreetMap + Android + GeoHex なアプリって世界初じゃね?

というわけで osmdroid と OpenStreetMap、今後の発展に期待しましょう。
(Android は…、もう飽和してるかな…) 

おく

おく

名古屋で地図や位置情報系の Android アプリを作っています。
HexRinger よろしこ。
詳しくはこっち↓で

twitter : @amay077
portal: iddy

Archive

2012 (5)
2011 (46)
2010 (38)
Posterous theme by Cory Watilo