Google Mapsで、現在地にアイコンを表示する


Google Mapで現在地を取得し表示する にて、Google mapを用いて現在地の座標を取得し、その場所を画面中央に表示してみました。
今回は、現在地を画面中央に表示するだけでなく、アイコンを表示してみましょう。

画像を表示するためには、ItemizedOverlayクラスを利用します。

それでは続きをどうぞ。

ItemizedOverlayクラスの継承
今回は、ItemizedOverlayクラスを継承したSampleItemizedOverlayクラスを作成します。
SampleItemizedOverlayには、次のようなメソッドを記述します。

まずコンストラクタを作成します。コンストラクタでは、アイコンを現在地の座標に対してどの位置に配置するかを設定します。
今回は、現在地座標の上部真ん中に貼付けます。

//コンストラクタ
public SampleItemizedOverray(Drawable marker) {
	//boundCenterBottom アイコンの中央下部を原点とする。
	super(boundCenterBottom(marker));
	// TODO Auto-generated constructor stub
}

次に、OverlayItemを取得するためのメソッドcreateItem()を記述します。
ついでに、ItemizedOverlayを継承した際に必須のsize()メソッドも記述します。

private ArrayList<OverlayItem> Items = new ArrayList<OverlayItem>();

//populate()メソッドにて呼ばれる。
//アイテムを生成して返す。
@Override
protected OverlayItem createItem(int p){
	return Items.get(p);
}

//pointsに格納されているアイテム数を返す。
//populate()が呼ばれる度に一度だけ呼ばれる。
@Override
public int size() {
	// TODO Auto-generated method stub
	return Items.size();
}

createItem()はpopulate()メソッドが実行されると呼ばれます。
createItem()メソッドは、各種オーバーレイが格納されているArrayList型のItemsから、int型の数値pで指定したオーバーレイを取得して返します。
size()メソッドはpopulate()メソッドが呼ばれる度に一度だけ呼び出されますが、Itemsに格納してあるオーバーレイの個数を返します。

次に、先ほど登場したArrayList型のItemsに、各種オーバーレイを格納するメソッドを記述します。

public void addItems(OverlayItem overlay){
	this.Items.add(overlay);
	populate();
}

ここでは、Itemsにオーバーレイを格納後、populate()メソッドを呼ぶことでcreateItemが呼ばれ、オーバーレイを返却します。

現在地座標にアイコンを表示する

では、作成したSampleItemizedOverrayクラスを用いて、アイコンを表示させてみます。
今回は、プロジェクトを作成した際にデフォルトでres/drawable(-hdpi)に格納されているicon.pngを表示させてみます。
現在地の座標を取得し、その座標を画面の中央に持ってくるところまでは、Google Mapで現在地を取得し表示するを参考にします。
詳しくはそちらをご覧下さい。

private SampleItemizedOverray myLocateOverlay;
private OverlayItem myOverlayItem;

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       requestWindowFeature(Window.FEATURE_NO_TITLE);
       //MapView生成
	...省略
       setContentView(mapView);

       //アイコンリソース取得
       myLocateDraw = getResources().getDrawable( R.drawable.icon);

       //SampleItemizedOverrayのインスタンスにアイコン登録
       myLocateOverlay = new SampleItemizedOverray(myLocateDraw);

   }

onCreateにて、アイコンのリソースの取得と、OverlayItemのインスタンスへの登録を行います。

次に、メニューボタンからの「現在地」を選択した際の処理を記述します。

case MY_PLACE:
 ….省略
 //現在地までアニメーションで移動
 MapCtrl.animateTo(GP);

 //処理の追加分
 //OverlayItemのインスタンスを取得。第一引数に現在地のGeoPointを渡す。
 myOverlayItem = new OverlayItem(GP, "","");

 //オーバーレイをリストに追加
 myLocateOverlay.addItems(myOverlayItem);

 //マップビューにオーバーレイ追加
 mapView.getOverlays().add(myLocateOverlay);
 ….省略

以上で、メニューから「現在地」を選択した際に、現在地に移動すると同時にアイコンを表示させることができます。