SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術

YOLPで挑戦~施設内を検索するAndroidアプリをお手軽に作成!

スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術(4)

周辺施設の選択とビルアイコンのピンを表示

 次に概要の2,3,4に当たる部分を説明します。現在地に移動したので、地図上で長押しした位置にある施設情報を取得してピンを立てます。地図を長押ししたイベントは、MapView.MapTouchListener::onLongPressで受け取ります。onLongPressの第4引数に長押しした地点の座標が返されているので、これを使って「施設内検索API」をリクエストします。

InnerSearchActivity.java
// 長押しした時のイベントを取得し、施設内検索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件以上ある場合はピンを立てます。それ以外の場合は長押しした位置に施設がない旨を表示します。ピンをタップするとポップアップが表示され、ポップアップ内のボタンをタップすると店舗一覧に飛びます。

InnerSearchActivity.java
@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;
}

次のページ
店舗一覧をリストで表示

この記事は参考になりましたか?

スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術連載記事一覧

もっと読む

この記事の著者

中村 友一(ヤフー株式会社)(ナカムラ ユウイチ(ヤフーカブシキガイシャ))

2009年Yahoo!JAPAN入社。「Yahoo!自動車」の開発、「Yahoo!ロコ」の立ち上げを経てAndroid版「地図 Yahoo!ロコ」アプリの開発を担当。フットサル、自動車、楽器、写真など趣味は多数。TwitterIDは@sonatax。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6584 2012/05/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー