1. 程式人生 > >百度地圖:加強篇(範圍+點檢索)

百度地圖:加強篇(範圍+點檢索)

核心類: MKSearch和MKSearchListener
MKSearch用於位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索

 int    busLineSearch(String city, String busLineUid) 
          公交路線詳細資訊搜尋 非同步函式,返回結果在MKSearchListener裡的onGetBusDetailResult方法通知
 int    drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end) 
          駕乘路線搜尋.
 int
drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end, ArrayList<MKWpNode> wpNodes) 駕車路線搜尋,可設定途經點 非同步函式,返回結果在MKSearchListener裡的onGetDrivingRouteResult方法通知 int geocode(String strAddr, String city) 根據地址名獲取地址資訊 非同步函式,返回結果在MKSearchListener裡的onGetAddrResult方法通知 static int
getPoiPageCapacity() 返回每頁容量 int goToPoiPage(int num) 獲取指定頁的的poi結果. boolean init(BMapManager bmapMan, MKSearchListener listener) 初使化 int poiDetailSearch(String uid) poi詳細資訊檢索 int poiMultiSearchInbounds(String[] keys, GeoPoint ptLB, GeoPoint ptRT) 根據範圍和檢索詞發起範圍檢索. int
poiMultiSearchNearBy(String[] keys, GeoPoint pt, int radius) 根據中心點、半徑與檢索詞發起周邊檢索. int poiSearchInbounds(String key, GeoPoint ptLB, GeoPoint ptRT) 根據範圍和檢索詞發起範圍檢索. int poiSearchInCity(String city, String key) 城市poi檢索. int poiSearchNearBy(String key, GeoPoint pt, int radius) 根據中心點、半徑與檢索詞發起周邊檢索. int reverseGeocode(GeoPoint pt) 根據地理座標點獲取地址資訊 非同步函式,返回結果在MKSearchListener裡的onGetAddrResult方法通知 int setDrivingPolicy(int policy) 設定駕車路線規劃策略. static void setPoiPageCapacity(int num) 設定每頁容量. int setTransitPolicy(int policy) 設定路線規劃策略. int suggestionSearch(String key, String city) 聯想詞檢索,根據模糊的不完備的檢索詞返回精確的建議搜尋詞 非同步函式,返回結果在MKSearchListener裡的onGetSuggestionResult方法通知 int transitSearch(String city, MKPlanNode start, MKPlanNode end) 公交路線搜尋. int walkingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end) 步行路線搜尋.

實現思路
初始化MKSearch類,通過init方法註冊搜尋結果的監聽物件MKSearchListener,實現非同步搜尋服務。
通過自定義MySearchListener實現類,獲得搜尋結果。
注意,MKSearchListener只支援一個,以最後一次設定為準
1、實現目的:矩形區域加油站搜尋
實現過程:
1、新建MKSearch的物件,然後用到public int poiSearchInbounds(String key,
GeoPoint ptLB,
GeoPoint ptRT)方法來進行對ptLB-ptRT矩形範圍內key的搜尋。返回結果在MKSearchListener裡的onGetPoiResult方法通知。
2、由於MKSearchListener是一個介面,如果我們實現了這個介面就需要實現它裡面的很多方法,這樣影響程式碼修改的效能,我們新建了一個基類(BaseAdapter)來實現這個介面,然後新建一個MySearchListener來繼承該類,僅實現我們需要的方法即可,此處需要用到onGetPoiResult方法來獲的搜尋結果。
3、對搜尋結果進行展示:新建了一個PoiOverlay物件,然後給這個物件設定資料,並且將這個物件新增到overlays集合裡面,然後重新整理mapView。
4、為了使得我們點選poi有響應,我們設定了controller.enableClick(true);
// 讓地圖上的興趣點可以被點選
5、設定Mainfest.xml的內容
注意:
poi檢索結果每頁容量預設情況下為10,可以通過setPoiPageCapacity設定,支援1-50(10)
翻頁功能通過MKSearch類的goToPoiPage實現,該方法是非同步函式,搜尋成功後會呼叫註冊的事件處理函式onGetPoiResult 返回查詢頁的結果。
支援分類搜尋,例如mSearch.poiSearchInCity(“北京”, “娛樂”)

實現結果:
這裡寫圖片描述
點選某個點,彈出吐司顯示相應加油站名稱。
這裡寫圖片描述
BaseActivity .java

package huaxa.it.map;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

/**
 * @專案名: BaiduMap
 * @包名: huaxa.it.map
 * @類名: GraphicsOverlayDemo
 * @建立者: 黃夏蓮
 * @建立時間: 2016年11月30日 ,下午11:13:13
 * 
 * @描述: TODO
 */
public class BaseActivity extends Activity
{

    public BMapManager      manager;
    public MapController    controller;
    public MapView          mapView;
    public int              latitude    = (int) (23.039 * 1E6);             // 緯度
    public int              longitude   = (int) (113.404 * 1E6);                // 經度
    public GeoPoint         geoPoint    = new GeoPoint(latitude, longitude);

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        // KEY的校驗
        initManager();
        setContentView(R.layout.common);
        init();

    }

    private void init()
    {
        // 地圖的縮放級別(版本V2.X:3-19,V1.X:3-18級放大)
        // V2.X與V1.X的主要區別:
        // ①修改了地圖檔案的格式(節省了空間)
        // ②放大級別,增加3D(18、19)的特效

        // MapController管理某個具體的MapView,縮放、旋轉、移動
        mapView = (MapView) findViewById(R.id.MapView);
        controller = mapView.getController();
        controller.setZoom(12);// 設定地圖的縮放級別。 這個值的取值範圍是[3,19]。 
        mapView.setBuiltInZoomControls(true);// 設定是否啟用內建的縮放控制元件。
                                                // 如果啟用,MapView將自動顯示這些縮放控制元件。
        controller.setCenter(geoPoint);// 設定地圖中心點
        // 讓地圖上的興趣點可以被點選
        controller.enableClick(true);
    }

    /**
     * 初始化地圖引擎
     */
    private void initManager()
    {
        manager = new BMapManager(getApplicationContext());

        /**
         * public boolean init(String strKey, MKGeneralListener listener) 引數:
         * strKey - 申請的授權驗證碼 listener -
         * 註冊回撥事件,該介面返回網路狀態,授權驗證等結果,使用者需要實現該介面以處理相應事件
         */
        // KEY的校驗
        manager.init(CanstantValue.KEY, new MKGeneralListener()
        {
            // MKEvent存放常量

            @Override
            public void onGetPermissionState(int iError)
            {
                // TODO 授權驗證
                if (iError == MKEvent.ERROR_PERMISSION_DENIED)
                {
                    Toast.makeText(getApplicationContext(),
                            "授權驗證失敗" + MKEvent.ERROR_PERMISSION_DENIED,
                            Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onGetNetworkState(int iError)
            {
                // TODO 網路狀態
                if (iError == MKEvent.ERROR_NETWORK_CONNECT)
                {
                    Toast.makeText(getApplicationContext(), "網路無連線",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    @Override
    protected void onResume()
    {
        // TODO Auto-generated method stub
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause()
    {
        // TODO Auto-generated method stub
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy()
    {
        // TODO Auto-generated method stub
        super.onDestroy();
        mapView.destroy();
    }

}

BaseAdapter.java

package huaxa.it.map;

import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;

/**
 * @專案名:     BaiduMap
 * @包名:         huaxa.it.map
 * @類名:         BaseAdapter
 * @建立者:     黃夏蓮
 * @建立時間: 2016年12月2日 ,下午5:09:41
 * 
 * @描述:          基類監聽器 
 */

/*
 * onGetAddrResult(MKAddrInfo result, int iError) 返回地址資訊搜尋結果
 * onGetBusDetailResult(MKBusLineResult result, int iError) 返回公交車詳情資訊搜尋結果 
 * onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) 返回駕乘路線搜尋結果
 * onGetPoiDetailSearchResult(int type, int iError) 返回poi相信資訊搜尋的結果 
 * onGetPoiResult(MKPoiResult result, int type, int iError) 返回poi搜尋結果
 * onGetSuggestionResult(MKSuggestionResult result, int iError) 返回聯想詞資訊搜尋結果
 * onGetTransitRouteResult(MKTransitRouteResult result, int iError) 返回公交搜尋結果
 * onGetWalkingRouteResult(MKWalkingRouteResult result, int iError)返回步行路線搜尋結果
 */

    public class BaseAdapter implements MKSearchListener{

        @Override
        public void onGetAddrResult(MKAddrInfo result, int iError)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onGetBusDetailResult(MKBusLineResult result, int iError)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onGetPoiDetailSearchResult(int result, int iError)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onGetPoiResult(MKPoiResult result, int type, int iError)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onGetSuggestionResult(MKSuggestionResult result, int iError)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onGetTransitRouteResult(MKTransitRouteResult result, int iError)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError)
        {
            // TODO Auto-generated method stub

        }

    }

PoiSearchInboundsDemo.java

package huaxa.it.map;

import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.platform.comapi.basestruct.GeoPoint;

import android.os.Bundle;
import android.widget.Toast;

/**
 * @專案名: BaiduMap
 * @包名: huaxa.it.map
 * @類名: PoiSearchInboundsDemo
 * @建立者: 黃夏蓮
 * @建立時間: 2016年12月2日 ,下午4:59:23
 * 
 * @描述: 在矩形區域內搜尋興趣點(加油站)
 */
public class PoiSearchInboundsDemo extends BaseActivity
{
    private MKSearch    search;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Search();
    }

    private void Search()
    {
        search = new MKSearch();
        MySearchListener mkSearchListener = new MySearchListener();
        search.init(manager, mkSearchListener);
        // 發起矩形搜尋
        // poiSearchInbounds(String key, GeoPoint ptLB, GeoPoint ptRT)
        // 根據範圍和檢索詞發起範圍檢索.
        // 非同步函式,返回結果在MKSearchListener裡的onGetPoiResult方法通知
        // 引數:
        // keys - 關鍵詞列表,必須大於1個,小於等於10個。
        // ptLB - 地理座標,範圍的左下角
        // ptRT - 地理座標,範圍的右上角
        // 返回:
        // 成功返回0,否則返回-1
        GeoPoint ptLB = new GeoPoint((int) (23 * 1E6), (int) (113 * 1E6));
        GeoPoint ptRT = new GeoPoint((int) (24 * 1E6), (int) (114 * 1E6));
        search.poiSearchInbounds("加油站", ptLB, ptRT);
    }

    class MySearchListener extends BaseAdapter
    {
        @Override
        public void onGetPoiResult(MKPoiResult result, int type, int iError)
        {
            // XXXActivity.this返回的當前Activity的例項,getApplicationContext()返回的是application的例項
            if (result != null && iError == 0)
            {
                // public PoiOverlay(Activity activity,MapView mapView)
                PoiOverlay overlay = new PoiOverlay(PoiSearchInboundsDemo.this,
                        mapView);
                overlay.setData(result.getAllPoi());
                mapView.getOverlays().add(overlay);
                mapView.refresh();
            } else
            {
                Toast.makeText(getApplicationContext(), "未搜尋到結果",
                        Toast.LENGTH_LONG).show();
            }

            super.onGetPoiResult(result, type, iError);
        }
    }

}

2、實現目的:實現圓形搜尋

3、實現目的:實現全城搜尋
實現過程:需要實現資料分頁處理,即對result資料進行處理。
以下是MKPoiResult result的方法:

方法摘要
 ArrayList<MKPoiInfo>   getAllPoi() 

 MKCityListInfo getCityListInfo(int index) 
          獲取第index個城市資訊,index0開始
 int    getCityListNum() 
          返回城市列表頁的結果數
 int    getCurrentNumPois() 
          獲取當前頁的poi結果數
 ArrayList<MKPoiResult> getMultiPoiResult() 

 int    getNumPages() 
          獲取本次poi搜尋的總頁數
 int    getNumPois() 
          獲取本次poi搜尋的總結果數
 int    getPageIndex() 
          返回當前頁的索引
 MKPoiInfo  getPoi(int index) 
          獲取第index個poi資訊

此處我們主要是用到a = getPageIndex() 方法來得到當前頁的索引,並可以通過MKSearch.goToPoiPage(++a)跳轉到下一頁。
在add(overlay)之前需要對之前的overlays集合進行clear();操作,否則會點的顯示會混亂。
實現效果:

這裡寫圖片描述
這裡寫圖片描述
PoiSearchInCityDemo.java

package huaxa.it.map;

import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;

import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;

/**
 * @專案名: BaiduMap
 * @包名: huaxa.it.map
 * @類名: PoiSearchInCityDemo
 * @建立者: 黃夏蓮
 * @建立時間: 2016年12月2日 ,下午7:44:07
 * 
 * @描述: 全城檢索
 */
public class PoiSearchInCityDemo extends BaseActivity
{
    private MKSearch    search;
    private int         pageIndex;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Search();
    }

    private void Search()
    {
        search = new MKSearch();
        MySearchListener mkSearchListener = new MySearchListener();
        search.init(manager, mkSearchListener);
        // 發起全城檢索
        // public int poiSearchInCity(String city,String key)
        // 城市poi檢索.
        // 非同步函式,返回結果在MKSearchListener裡的onGetPoiResult方法通知
        //
        // 引數:
        // city - 城市名
        // key - 關鍵詞
        // 返回:
        // 成功返回0,否則返回-1
        search.poiSearchInCity("廣州", "加油站");
    }

    class MySearchListener extends BaseAdapter
    {

        @Override
        public void onGetPoiResult(MKPoiResult result, int type, int iError)
        {
            // XXXActivity.this返回的當前Activity的例項,getApplicationContext()返回的是application的例項
            if (result != null && iError == 0)
            {
                /*
                 * ArrayList<MKPoiInfo> getAllPoi()
                 * 
                 * MKCityListInfo getCityListInfo(int index)
                 * 獲取第index個城市資訊,index從0開始 int getCityListNum() 返回城市列表頁的結果數 int
                 * getCurrentNumPois() 獲取當前頁的poi結果數 ArrayList<MKPoiResult>
                 * getMultiPoiResult()
                 * 
                 * int getNumPages() 獲取本次poi搜尋的總頁數 int getNumPois()
                 * 獲取本次poi搜尋的總結果數 int getPageIndex() 返回當前頁的索引 MKPoiInfo
                 * getPoi(int index) 獲取第index個poi資訊
                 */

                pageIndex = result.getPageIndex();
                String info = "第" + result.getPageIndex() + "頁,共"
                        + result.getNumPages() + "頁條目數" + "每頁條目:"
                        + result.getCurrentNumPois();
                Toast.makeText(getApplicationContext(), info, Toast.LENGTH_LONG)
                        .show();
                // public PoiOverlay(Activity activity,MapView mapView)
                PoiOverlay overlay = new PoiOverlay(PoiSearchInCityDemo.this,
                        mapView);
                // public void setData(ArrayList<MKPoiInfo> data)
                // 設定poi 資料
                // 引數:
                // data - : poi 資訊集合
                overlay.setData(result.getAllPoi());// 當前頁全部內容
                mapView.getOverlays().clear();
                mapView.getOverlays().add(overlay);
                mapView.refresh();
            } else
            {
                Toast.makeText(getApplicationContext(), "未搜尋到結果",
                        Toast.LENGTH_LONG).show();
            }

            super.onGetPoiResult(result, type, iError);
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if (keyCode == KeyEvent.KEYCODE_1)
        {
            pageIndex++;
            search.goToPoiPage(pageIndex);
        }
        return super.onKeyDown(keyCode, event);
    }
}