周辺施設の選択とビルアイコンのピンを表示
次に概要の2,3,4に当たる部分を説明します。現在地に移動したので、地図上で長押しした位置にある施設情報を取得してピンを立てます。地図を長押ししたイベントは、MapView.MapTouchListener::onLongPressで受け取ります。onLongPressの第4引数に長押しした地点の座標が返されているので、これを使って「施設内検索API」をリクエストします。
// 長押しした時のイベントを取得し、施設内検索API へリクエストする
public boolean onLongPress(MapView map, Object obj, PinOverlay pin,
GeoPoint point) {
m_point = point;
// onLongPress が発生するとピンが立つのでそれを削除
mapview.removeOverlay(pin);
// 別の位置の結果があった場合はそのピンも削除
if (m_pin != null) {
mapview.removeOverlay(m_pin);
m_pin = null;
}
// 長押しした位置の緯度経度を取得する
double selectLat = point.m_latitudeE6 / 1000000.0;
double selectLon = point.m_longitudeE6 / 1000000.0;
// 施設内検索API リクエスト用のclass を呼び出し
m_innerSearch = new InnerSearch(this);
// 緯度経度のパラメータをセットする
m_innerSearch.setLat(String.valueOf(selectLat));
m_innerSearch.setLon(String.valueOf(selectLon));
// 検索を実行
m_innerSearch.executeAsync(this, true);
return false;
}
「施設内検索API」へリクエストした結果はendYolpSearchに返されます。別クラスとして実装しているAPIリクエストクラスではリクエストURI、アプリケーションIDの指定とAPIから返された結果をパースする処理が書かれています。
検索結果がArrayList<InnerSearchData>として返されるので、結果が1件以上ある場合はピンを立てます。それ以外の場合は長押しした位置に施設がない旨を表示します。ピンをタップするとポップアップが表示され、ポップアップ内のボタンをタップすると店舗一覧に飛びます。
@Override
public boolean endYolpSearch(YolpApiBase api, Object results) {
// 検索結果(ArrayList)の取得
innerData = m_innerSearch.getInnerResult();
// 画面初期化
mapview.removeOverlayAll();
// 検索結果件数が1以上だった場合はピンを立てる
if (innerData.size() > 0) {
m_innerData = innerData.get(0);
// ここでポップアップに出力する文字列を指定(任意に指定して下さい)
String buildingName = "施設数: " + innerData.size() + "件";
String buildingDesc = "全" + m_innerData.getBuildingFloor() + "フロア";
// 地図の中心にピンを移動させる
MapController mapctl = mapview.getMapController();
mapctl.animateTo(m_point);
// ビルのピンアイコンを読み込んで表示用のピンとして指定する
Drawable buildingPin = getResources().getDrawable(
R.drawable.pin_building);
m_pin = new PinOverlay(buildingPin);
mapview.getOverlays().add(m_pin);
m_popup = new PopupOverlay() {
@Override
public void onTap(OverlayItem item) {
// ポップアップ内のボタンをタップしたら店舗一覧を表示させる
Intent intent = new Intent(InnerSearchActivity.this,
InnerListActivity.class);
// API のリクエスト結果を店舗一覧ページに渡す
intent.putExtra("RESULT", innerData);
startActivity(intent);
}
};
// ポップアップ表示
mapview.getOverlays().add(m_popup);
m_pin.setOnFocusChangeListener(m_popup);
// 地図上にピンを追加
m_pin.addPoint(m_point, buildingName, buildingDesc);
} else {
// 検索結果が0件だった場合はアラートダイアログを表示
new AlertDialog.Builder(this).setTitle("施設がありません")
.setPositiveButton("OK", null).show();
}
return false;
}
