Home > android > Androidで地図に画像を配置する方法

Androidで地図に画像を配置する方法

Google Mapsのように地図のある位置に画像を貼付ける方法をご紹介します。

AndroidにはOverlayというAPIが準備されていますのでそれを利用します。

Overlayを設定する前準備

地図にOverlayで画像を配置する前準備として、OverlayControllerを取得する必要があります。

public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  MapView mv = new MapView(this);
  setContentView(mv);
  OverlayController oc = mv.createOverlayController();
}

このOverlayControllerがOverlayの管理を担ってくれます。
あとはoc.add(…)でOverlayを追加していくだけです。

Overlayを定義する

OverlayControllerに登録するOverlayを定義する。
MapがレンダリングされるたびにOverlayのdrowメソッドがコールされるので、drowメソッドを自分好みに定義する必要があります。今回は、地図上(画面上ではなく)で常に一定の位置に画像を配置するようにしてみます。

class GraphicOverlay extends Overlay {
  private final BitmapDrawable bmp;
  private final int width, height;
  private final int hw, hh;//half of width, height
  private final Point p;
 
  public GraphicOverlay(Drawable d, Point p) {
    bmp = (BitmapDrawable) d;
    this.p = p;
    width = bmp.getIntrinsicWidth();
    height = bmp.getIntrinsicHeight();
    hw = width / 2;
    hh = height / 2;
  }
 
  public void draw(Canvas canvas, PixelCalculator calculator, boolean shadow) {
    calculator.getPointXY(p, sXYCoords);
    int x = sXYCoords[0];
    int y = sXYCoords[1];
    bmp.setBounds(x - hw, y - hh, x + hw, y + hh);
    bmp.draw(canvas);
  }
}
コンストラクタの実装

コンストラクタの第1引数(Drawable d)は画像です。
第2引数(Point p)は配置する場所です。この場所はGPS上の位置です。
コンストラクタは一度しか呼び出されませんので、ここで決定できる値は全部計算しておきます。ハードウェアを意識したコーディングってやつです。

drawの実装

地図がレンダリングされるたびにこのdrawが呼び出されます。つまり、指定した地図上の位置に常に画像を配置するには、指定した位置が画面上のどこにあるかを計算し、そこに画像を配置します。複雑ですがそういう複雑な計算はAPIが準備されていて楽になっています。

calculator.getPointXY(p, sXYCoords);

このメソッドで地図上の位置から画面上の位置を取得する事ができます。
pはコンストラクタで指定した地図上の位置で、sXYCoordsはint配列でOverlayのインスタンスフィールドで定義されています。一時変数として使える配列です。ここに画面上の位置が格納されます。
あとは、このsXYCoordsを利用して画像を配置します。

本筋からは外れますが、Javaではフィールドへのアクセスよりローカル変数へのアクセスの方が高速なのでdrawのような何度も呼び出される関数の場合はできるだけフィールドを利用しない方が良いと思います。Androidの「Writing Efficient Android Code」にもそう書いてますね。

脱線しました。
さて、ようやくOverlayをaddして完成です。

Overlayを登録する

OverlayControllerにOverlayをaddします。

OverlayController oc = mv.createOverlayController();
Drawable icon = getResources().getDrawable(R.drawable.icon);
Point point = new Point(0, 0);
oc.add(new GraphicOverlay(icon, point), true);

画像を準備するのが面倒なのでres/drawable/icon.pngを利用します。
表示する場所は緯度0度、経度0度です。

おわりに

緯度と経度が現在表示している画面のどの位置にあるのかを計算するのが複雑そうに思いましたがAPIが準備されていて非常に楽でした。さすがGoogleです。感謝。

関連のありそうなエントリ

Comments:0

Comment Form
Remember personal info

*
To prove that you're not a bot, enter this code
Anti-Spam Image

Trackbacks:0

Trackback URL for this entry
http://www.adamrocker.com/blog/171/android_overlay_on_map.html/trackback/
Listed below are links to weblogs that reference
Androidで地図に画像を配置する方法 from throw Life

Home > android > Androidで地図に画像を配置する方法

Search
Feeds
Meta

Return to page top