• 百度地图开发之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();
        }
    }
  • 相关阅读:
    BZOJ 4716 假摔
    【UER #4】量子态的棋盘
    [Lydsy2017省队十连测]最长路径
    [Lydsy2017省队十连测]航海舰队
    [Lydsy2017省队十连测]公路建设
    [Lydsy2017省队十连测]商店购物
    湖南省队集训题【2018】(我也不知道是第几场)
    CXMS 胡策2
    [TJOI2018]异或
    TJOI 2018 数学计算
  • 原文地址:https://www.cnblogs.com/fangg/p/5987245.html
Copyright © 2020-2023  润新知