百度地圖開發之poi檢索,線路規划


 

官方文檔 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key

先去官方文檔申請秘鑰下載壓縮文件等操作,參考

百度地圖的秘鑰申請與sdk下載,顯示地圖(1)

公交,步行,駕車路線查詢,附近POI查詢

參考文檔導入所需jar包和so文件

 

 標注點,覆蓋物的實現見官方文檔

 poi檢索:
1.首先獲取地圖,創建poi檢索實例:

   private void initView() {
        //輸入框
        etPoi = (EditText) inflate.findViewById(R.id.fragment_detailpage_search_et_poi);
        //檢索圖標
        ivSearch = (ImageView) inflate.findViewById(R.id.fragment_detailpage_search_iv_search);
        //設置點擊監聽
        ivSearch.setOnClickListener(this);
        //獲取地圖控件引用
        mMapView = (MapView)inflate.findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        //普通地圖
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        //創建POI檢索實例
        mPoiSearch = PoiSearch.newInstance();
     //詳細信息布局 mMarkerInfoLayout
= (RelativeLayout)inflate. findViewById(R.id.layout_map_rl_layout); }

 

 2.為poi檢索設置監聽,監聽回調了兩個方法,第一個是poi檢索結果的監聽,當用戶進行poi檢索后,會回調該方法,第二個方法,是對檢索后顯示的標注點(marker)進行點擊后回調的方法,會傳入該點的詳情結果對象,我們可以通過該對象得到名字,地址,url地址等

      //設置監聽
        mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {

        /*    1.獲得poi檢索結果的監聽*/

            @Override
            public void onGetPoiResult(PoiResult poiResult) {
         //創建覆蓋物對象 myPoiOverlay
= new MyPoiOverlay(mBaiduMap); myPoiOverlay.setData(poiResult); myPoiOverlay.addToMap(); myPoiOverlay.zoomToSpan(); //給poi的結果設置點擊事件,點擊marker后彈出詳情頁 mBaiduMap.setOnMarkerClickListener(myPoiOverlay); Log.i("tag", "獲得poi檢索結果的監聽 "); } /* 3. poi的詳情頁結果*/ @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(getActivity(), "抱歉,未找到結果", Toast.LENGTH_SHORT).show(); etPoi.setText(""); } else {// 正常返回結果的時候,此處可以獲得很多相關信息 //獲取詳情頁的請求結果 String detailUrl = poiDetailResult.getDetailUrl(); //得到當前經緯度 Log.i("tag", "獲取詳情頁的請求結果: detailUrl -" + poiDetailResult.getName() + ": " + poiDetailResult.getAddress()); Toast.makeText(getActivity(), detailUrl, Toast.LENGTH_SHORT).show(); //彈出窗體 // 設置詳細信息布局為可見 mMarkerInfoLayout.setVisibility(View.VISIBLE); //根據商家信息為詳細信息布局設置信息 popupInfo(mMarkerInfoLayout, poiDetailResult); }} @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } });

上面創建的MyPoiOverlay是繼承了PoiOverLay的,需要重寫onPoiClick,當poi檢索的結果被點擊的時候回調該方法,然后通過獲得該標注點的uid得到詳情結果然后將詳情結果,傳入檢索監聽中的onGetPoiDetailResult(PoiDetailResult poiDetailResult),

注意:需要為marker設置點擊監聽,

 mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
   class MyPoiOverlay extends PoiOverlay {

        /**
         * 構造函數
         *
         * @param baiduMap 該 PoiOverlay 引用的 BaiduMap 對象
         */
        public MyPoiOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }

        /*2.當poi的結果點被點擊的時候調用*/
        @Override
        public boolean onPoiClick(int i) {

            //獲取i對應的點的uid
            String uid = getPoiResult().getAllPoi().get(i).uid;
            Log.i("tag", "當poi的結果點被點擊的時候調用: "+uid);
            //uid是POI檢索中獲取的POI ID信息
            mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(uid));
            return super.onPoiClick(i);
        }
    }

popInfo:使用viewHolder復用布局

 private void popupInfo(RelativeLayout mMarkerInfoLayout,final PoiDetailResult poiDetailResult) {
        ViewHolder viewHolder = null;
        if(mMarkerInfoLayout.getTag() == null){
            viewHolder = new ViewHolder();
            viewHolder.poiName = (TextView) inflate.findViewById(R.id.layout_map_poiname);
            viewHolder.poiAddress = (TextView)inflate.findViewById(R.id.layout_map_poiaddress);
            viewHolder.poiSearch = (TextView) inflate.findViewById(R.id.layout_map_button);
            mMarkerInfoLayout.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) mMarkerInfoLayout.getTag();
            viewHolder.poiName.setText(poiDetailResult.getName());
            viewHolder.poiAddress.setText(poiDetailResult.getAddress());
            viewHolder.poiSearch.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                       //彈出新的頁面展示poi詳情
                Intent intent = new Intent(getActivity(), PoiDetailActivity.class);
                intent.putExtra("POI_DETAIL_URL",poiDetailResult.getDetailUrl());
                startActivity(intent);
                }
            });
        }
    }
    class ViewHolder{
        TextView poiName;
        TextView poiSearch;
        TextView poiAddress;

    }

為地圖設置點擊事件,點擊隱藏布局

        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener()
        {
            @Override
            public boolean onMapPoiClick(MapPoi arg0)
            {
                return false;
            }

            @Override
            public void onMapClick(LatLng arg0)
            {
                mMarkerInfoLayout.setVisibility(View.GONE);
                mBaiduMap.hideInfoWindow();
            }
        });

 開始搜索poi:按城市內搜索

    public void onStartSearch(View view){
       // String keyword = etKeyword.getText().toString().trim();
    /*    if (TextUtils.isEmpty(keyword)){
            return;
        }*/
        Log.i("tag", "onStartSearch: ");
        mPoiSearch.searchInCity(new PoiCitySearchOption().city("杭州").keyword("美食").pageNum(10));
        /**
         * 附近檢索
         */
/*
        PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
        nearbySearchOption.location(new LatLng(latitude, longitude));
        nearbySearchOption.keyword(editSearchKeyEt.getText().toString());
        nearbySearchOption.radius(1000);// 檢索半徑,單位是米
        nearbySearchOption.pageNum(10);
        mPoiSearch.searchNearby(nearbySearchOption);// 發起附近檢索請求*/

    }

DetailPoiActivity

public class PoiDetailActivity extends Activity {

    private WebView wbPoiDetail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_poidetail);

        wbPoiDetail = (WebView) findViewById(R.id.wv_poidetail);
        Intent intent = getIntent();
        String url = intent.getStringExtra("POI_DETAIL_URL");
        Log.i("MainActivity", "url-" + url);
        //webview加載數據
        wbPoiDetail.loadUrl(url);

        wbPoiDetail.setWebViewClient(new WebViewClient(){//解決辦法
                         public boolean shouldOverrideUrlLoading(WebView view, String url) {
                                //返回true的時候網頁在webView中去打開,如果為false則是調用系統瀏覽器打開
                               view.loadUrl(url);
                                return true;
                            }
        });

    }
}

 

效果如下:

線路規划基本步驟:

分析:
1.創建路規划檢索實例
設置點擊事件
2.准備檢索起、終點信息
3.發起線路規划的檢索
1.公交檢索
2.駕車檢索
3.步行
4.設置檢索結果監聽器
5.實現監聽器
根據不同的結果展示不同的路線
1.公交檢索
2.駕車檢索
3.步行
public class RoutePlanActivity extends Activity {
    private MapView mMapView;
    private RoutePlanSearch mSearch;
    private EditText etStartName;
    private EditText etEndName;
    private BaiduMap mBaiduMap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_routeplan);
        etStartName = (EditText) findViewById(R.id.et_startname);
        etEndName = (EditText) findViewById(R.id.et_endname);

        //獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();

//            1.創建路規划檢索實例;
        mSearch = RoutePlanSearch.newInstance();

        //設置檢索結果監聽器
        mSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {

            /*步行結果監聽*/
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
                if(walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
                    Toast.makeText(RoutePlanActivity.this, "請求結果有誤", Toast.LENGTH_SHORT).show();
                }
                if (walkingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    //構造公交線路的圖層對象
                    WalkingRouteOverlay walkingRouteOverlay = new WalkingRouteOverlay(mBaiduMap);

                    //給覆蓋物設置數據
                    walkingRouteOverlay.setData(walkingRouteResult.getRouteLines().get(0));
                    //添加到map
                    walkingRouteOverlay.addToMap();
                    //設置自適應縮放
                    walkingRouteOverlay.zoomToSpan();

                }
            }

            /*公交線路監聽*/
            @Override
            public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
                if(transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
                    Toast.makeText(RoutePlanActivity.this, "請求結果有誤", Toast.LENGTH_SHORT).show();
                }
                if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    //構造公交線路的圖層對象
                    TransitRouteOverlay transitRouteOverlay = new TransitRouteOverlay(mBaiduMap);

                    //給覆蓋物設置數據
                    transitRouteOverlay.setData(transitRouteResult.getRouteLines().get(0));
                    //添加到map
                    transitRouteOverlay.addToMap();
                    //設置自適應縮放
                    transitRouteOverlay.zoomToSpan();

                }


                }

            /*駕車線路監聽*/
            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
                if(drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
                    Toast.makeText(RoutePlanActivity.this, "請求結果有誤", Toast.LENGTH_SHORT).show();
                }
                if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    //構造公交線路的圖層對象
                    DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(mBaiduMap);

                    //給覆蓋物設置數據
                    drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(0));
                    //添加到map
                    drivingRouteOverlay.addToMap();
                    //設置自適應縮放
                    drivingRouteOverlay.zoomToSpan();

                }
            }

            @Override
            public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {

            }
        });
    }

    public void onSearchRuote(View view) {
        //檢查數據是否合法
        String startName = etStartName.getText().toString().trim();
        String endName = etEndName.getText().toString().trim();
        if (TextUtils.isEmpty(startName) || TextUtils.isEmpty(endName)) {
            return;
        }

        PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", startName);
        PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", endName);

        switch (view.getId()) {
            case R.id.btn_transit:
                mSearch.transitSearch(new TransitRoutePlanOption().from(stNode).to(enNode).city("北京"));
                break;
            case R.id.btn_driving:
                mSearch.drivingSearch(new DrivingRoutePlanOption().from(stNode).to(enNode));
                break;
            case R.id.btn_walking:
                mSearch.walkingSearch(new WalkingRoutePlanOption().from(stNode).to(enNode));
                break;
            default:
                break;
        }

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理
        mMapView.onPause();
    }
}

 


公交線路規划:

public class BusLineSearchActivity extends Activity {
    private MapView mMapView;
    private BaiduMap mBaiduMap;
    private EditText etKeyword;
    private PoiSearch mPoiSearch;
    private BusLineSearch mBusLineSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buslinesearch);
        //獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();

        etKeyword = (EditText) findViewById(R.id.et_keyword);
//       創建POI檢索實例
        mPoiSearch = PoiSearch.newInstance();
        //創建buslineserarch的實例
        mBusLineSearch = BusLineSearch.newInstance();

        //設置監聽
        mBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
            @Override
            public void onGetBusLineResult(BusLineResult busLineResult) {
                    //展示公交線路信息
                BusLineOverlay busLineOverlay = new BusLineOverlay(mBaiduMap);
                busLineOverlay.setData(busLineResult);
                busLineOverlay.addToMap();
                busLineOverlay.zoomToSpan();
            }
        });

        mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                    //獲得公交信息的poi檢索結果
                if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    return;
                }
                //只展示第一條公交信息
                PoiInfo poiInfo = poiResult.getAllPoi().get(0);

               //重新請求
                //如下代碼為發起檢索代碼,定義監聽者和設置監聽器的方法與POI中的類似
                mBusLineSearch.searchBusLine((new BusLineSearchOption()
                        .city("北京")
                        .uid(poiInfo.uid)));
            }

            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

            }
        });
    }

    public void onStartSearch(View view){
        String keyword = etKeyword.getText().toString().trim();
        if (TextUtils.isEmpty(keyword)){
            return;
        }
        mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(keyword));

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理
        mMapView.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理
        mMapView.onPause();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM