美文网首页安卓学习程序员支付,地图,分享
百度地图总结第四篇之路线规划功能

百度地图总结第四篇之路线规划功能

作者: 菜鸟_一枚 | 来源:发表于2016-04-28 11:54 被阅读1707次

    百度地图总结第四篇之路线规划功能

    线路规划:
    今天总结的有四种路线方案,分别是驾车、公交(通从)、步行(同城)、骑行。(自3.7.0起,新增骑行线路规划功能)
    好了下面我们来看下吧,这里的代码有点多,我在本篇结束后,会给出github地址,以便参考(这里基本也是demo里面的代码)。
    公交线路规化:
    第一步,创建公交线路规划检索实例;

    mSearch = RoutePlanSearch.newInstance();
    

    第二步,创建公交线路规划检索监听者;

    OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {  
        public void onGetWalkingRouteResult(WalkingRouteResult result) {  
            //    
        }  
        public void onGetTransitRouteResult(TransitRouteResult result) {  
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();  
            }  
            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {  
                //起终点或途经点地址有岐义,通过以下接口获取建议查询信息  
                //result.getSuggestAddrInfo()  
                return;  
            }  
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {  
                TransitRouteOverlay overlay = new MyTransitRouteOverlay(mBaidumap);  
                mBaidumap.setOnMarkerClickListener(overlay);  
                overlay.setData(result.getRouteLines().get(0));  
                overlay.addToMap();  
                overlay.zoomToSpan();  
            }  
        }  
        public void onGetDrivingRouteResult(DrivingRouteResult result) {  
            //   
        }  
    };
    

    第三步,设置公交线路规划检索监听者;

    mSearch.setOnGetRoutePlanResultListener(listener);
    

    第四步,准备检索起、终点信息;

    PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "龙泽");  
    PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "西单");
    

    第五步,发起公交线路规划检索;

    mSearch.transitSearch((new TransitRoutePlanOption())  
        .from(stNode)  
        .city("北京")  
        .to(enNode));
    

    第六步,释放检索实例;

    mSearch.destory();
    

    其他的三种路线规划的大致步奏和公交路线大致相同,可以参考下。
    这里我们就直接上代码了(里面做了解释):

    package com.example.mylocation;
    
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.BitmapDescriptor;
    import com.baidu.mapapi.map.BitmapDescriptorFactory;
    import com.baidu.mapapi.map.InfoWindow;
    import com.baidu.mapapi.map.MapPoi;
    import com.baidu.mapapi.map.MapStatusUpdateFactory;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.model.LatLng;
    
    import com.baidu.mapapi.search.core.RouteLine;
    import com.baidu.mapapi.search.core.SearchResult;
    import com.baidu.mapapi.search.route.BikingRouteLine;
    import com.baidu.mapapi.search.route.BikingRoutePlanOption;
    import com.baidu.mapapi.search.route.BikingRouteResult;
    import com.baidu.mapapi.search.route.DrivingRouteLine;
    import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
    import com.baidu.mapapi.search.route.DrivingRouteResult;
    import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
    import com.baidu.mapapi.search.route.PlanNode;
    import com.baidu.mapapi.search.route.RoutePlanSearch;
    import com.baidu.mapapi.search.route.TransitRouteLine;
    import com.baidu.mapapi.search.route.TransitRoutePlanOption;
    import com.baidu.mapapi.search.route.TransitRouteResult;
    import com.baidu.mapapi.search.route.WalkingRouteLine;
    import com.baidu.mapapi.search.route.WalkingRoutePlanOption;
    import com.baidu.mapapi.search.route.WalkingRouteResult;
    import com.example.mylocation.overly.BikingRouteOverlay;
    import com.example.mylocation.overly.DrivingRouteOverlay;
    import com.example.mylocation.overly.OverlayManager;
    import com.example.mylocation.overly.TransitRouteOverlay;
    import com.example.mylocation.overly.WalkingRouteOverlay;
    
    /**
     * 此demo用来展示如何进行驾车、步行、公交路线搜索并在地图使用RouteOverlay、TransitOverlay绘制
     * 同时展示如何进行节点浏览并弹出泡泡
     */
    public class RoutePlanDemo extends AppCompatActivity implements BaiduMap.OnMapClickListener,
            OnGetRoutePlanResultListener {
        // 浏览路线节点相关
        Button mBtnPre = null; // 上一个节点
        Button mBtnNext = null; // 下一个节点
        int nodeIndex = -1; // 节点索引,供浏览节点时使用
        RouteLine route = null;  //路线
        OverlayManager routeOverlay = null;  //该类提供一个能够显示和管理多个Overlay的基类
        boolean useDefaultIcon = false;  //
        private TextView popupText = null; // 泡泡view
    
        // 地图相关,使用继承MapView的MyRouteMapView目的是重写touch事件实现泡泡处理
        // 如果不处理touch事件,则无需继承,直接使用MapView即可
        MapView mMapView = null;    // 地图View
        BaiduMap mBaidumap = null;
        // 搜索相关
        RoutePlanSearch mSearch = null;    // 搜索模块,也可去掉地图模块独立使用
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_routeplan);
            CharSequence titleLable = "路线规划功能";
            setTitle(titleLable);
            // 初始化地图
            mMapView = (MapView) findViewById(R.id.map);
            mBaidumap = mMapView.getMap();
            mBtnPre = (Button) findViewById(R.id.pre);
            mBtnNext = (Button) findViewById(R.id.next);
            mBtnPre.setVisibility(View.INVISIBLE);
            mBtnNext.setVisibility(View.INVISIBLE);
            // 地图点击事件处理
            mBaidumap.setOnMapClickListener(this);
            // 初始化搜索模块,注册事件监听
            mSearch = RoutePlanSearch.newInstance();
            mSearch.setOnGetRoutePlanResultListener(this);
        }
    
        /**
         * 发起路线规划搜索示例
         *
         * @param v
         */
        public void searchButtonProcess(View v) {
            // 重置浏览节点的路线数据
            route = null;
            mBtnPre.setVisibility(View.INVISIBLE);
            mBtnNext.setVisibility(View.INVISIBLE);
            mBaidumap.clear();
            // 处理搜索按钮响应
            EditText editSt = (EditText) findViewById(R.id.start);
            EditText editEn = (EditText) findViewById(R.id.end);
            // 设置起终点信息,对于tranist search 来说,城市名无意义
            PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", editSt.getText().toString());
            PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", editEn.getText().toString());
    
            // 实际使用中请对起点终点城市进行正确的设定
            if (v.getId() == R.id.drive) {
                //驾车行驶
                mSearch.drivingSearch((new DrivingRoutePlanOption())
                        .from(stNode).to(enNode));
            } else if (v.getId() == R.id.transit) {
                //公交行驶
                mSearch.transitSearch((new TransitRoutePlanOption())
                        .from(stNode).city("北京").to(enNode));
            } else if (v.getId() == R.id.walk) {
                //步行
                mSearch.walkingSearch((new WalkingRoutePlanOption())
                        .from(stNode).to(enNode));
            } else if (v.getId() == R.id.bike) {
                //骑行
                mSearch.bikingSearch((new BikingRoutePlanOption())
                        .from(stNode).to(enNode));
            }
        }
    
        /**
         * 节点浏览示例
         *
         * @param v
         */
        public void nodeClick(View v) {
            if (route == null || route.getAllStep() == null) {
                return;
            }
            if (nodeIndex == -1 && v.getId() == R.id.pre) {
                return;
            }
            // 设置节点索引
            if (v.getId() == R.id.next) {
                if (nodeIndex < route.getAllStep().size() - 1) {
                    nodeIndex++;
                } else {
                    return;
                }
            } else if (v.getId() == R.id.pre) {
                if (nodeIndex > 0) {
                    nodeIndex--;
                } else {
                    return;
                }
            }
            // 获取节结果信息
            LatLng nodeLocation = null;  //经纬度
            String nodeTitle = null;  //节点title(驾程信息)
            Object step = route.getAllStep().get(nodeIndex);
            if (step instanceof DrivingRouteLine.DrivingStep) {
                //驾车
                nodeLocation = ((DrivingRouteLine.DrivingStep) step).getEntrance().getLocation();
                nodeTitle = ((DrivingRouteLine.DrivingStep) step).getInstructions();
            } else if (step instanceof WalkingRouteLine.WalkingStep) {
                //步行
                nodeLocation = ((WalkingRouteLine.WalkingStep) step).getEntrance().getLocation();
                nodeTitle = ((WalkingRouteLine.WalkingStep) step).getInstructions();
            } else if (step instanceof TransitRouteLine.TransitStep) {
                //公交
                nodeLocation = ((TransitRouteLine.TransitStep) step).getEntrance().getLocation();
                nodeTitle = ((TransitRouteLine.TransitStep) step).getInstructions();
            } else if (step instanceof BikingRouteLine.BikingStep) {
                //骑行
                nodeLocation = ((BikingRouteLine.BikingStep) step).getEntrance().getLocation();
                nodeTitle = ((BikingRouteLine.BikingStep) step).getInstructions();
            }
    
            if (nodeLocation == null || nodeTitle == null) {
                return;
            }
            // 移动节点至中心
            mBaidumap.setMapStatus(MapStatusUpdateFactory.newLatLng(nodeLocation));
            // show popup
            //这个是在每次点击左或者右(也就是前后节点,这个时候就会在站点的上方弹出一个infowindow,显示路线换成信息)
            popupText = new TextView(RoutePlanDemo.this);
            popupText.setBackgroundResource(R.mipmap.popup);
            popupText.setTextColor(0xFF000000);
            popupText.setText(nodeTitle);
            mBaidumap.showInfoWindow(new InfoWindow(popupText, nodeLocation, 0));
    
        }
    
        /**
         * 切换路线图标,刷新地图使其生效
         * 注意: 起终点图标使用中心对齐.
         */
        public void changeRouteIcon(View v) {
            if (routeOverlay == null) {
                return;
            }
            if (useDefaultIcon) {
                ((Button) v).setText("自定义起终点图标");
                Toast.makeText(this,
                        "将使用系统起终点图标",
                        Toast.LENGTH_SHORT).show();
    
            } else {
                ((Button) v).setText("系统起终点图标");
                Toast.makeText(this,
                        "将使用自定义起终点图标",
                        Toast.LENGTH_SHORT).show();
    
            }
            useDefaultIcon = !useDefaultIcon;
            routeOverlay.removeFromMap();  //将所有overlay从地图中溢出
            routeOverlay.addToMap();  //添加
        }
    
    
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
        }
    
        /**
         * 得到步行路线的结果
         * @param result
         */
        @Override
        public void onGetWalkingRouteResult(WalkingRouteResult result) {
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                // result.getSuggestAddrInfo()
                return;
            }
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                nodeIndex = -1;
                mBtnPre.setVisibility(View.VISIBLE);
                mBtnNext.setVisibility(View.VISIBLE);
                route = result.getRouteLines().get(0);
                WalkingRouteOverlay overlay = new MyWalkingRouteOverlay(mBaidumap);
                mBaidumap.setOnMarkerClickListener(overlay);
                routeOverlay = overlay;
                //设置路线数据
                overlay.setData(result.getRouteLines().get(0));
                overlay.addToMap();  //将所有overlay添加到地图中
                overlay.zoomToSpan();//缩放地图
            }
    
        }
    
        /**
         * 得到公交车的驾驶路线
         * @param result
         */
        @Override
        public void onGetTransitRouteResult(TransitRouteResult result) {
    
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                // result.getSuggestAddrInfo()
                return;
            }
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                nodeIndex = -1;
                mBtnPre.setVisibility(View.VISIBLE);
                mBtnNext.setVisibility(View.VISIBLE);
                route = result.getRouteLines().get(0);
                TransitRouteOverlay overlay = new MyTransitRouteOverlay(mBaidumap);
                mBaidumap.setOnMarkerClickListener(overlay);
                routeOverlay = overlay;
                //设置路线数据
                overlay.setData(result.getRouteLines().get(0));
                overlay.addToMap();  //将所有overlay添加到地图中
                overlay.zoomToSpan();//缩放地图
            }
        }
    
        /**
         * 得到驾车路线
         * @param result
         */
        @Override
        public void onGetDrivingRouteResult(DrivingRouteResult result) {
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                // result.getSuggestAddrInfo()
                return;
            }
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                nodeIndex = -1;
                mBtnPre.setVisibility(View.VISIBLE);
                mBtnNext.setVisibility(View.VISIBLE);
                route = result.getRouteLines().get(0);
                DrivingRouteOverlay overlay = new MyDrivingRouteOverlay(mBaidumap);
                routeOverlay = overlay;
                mBaidumap.setOnMarkerClickListener(overlay);
                overlay.setData(result.getRouteLines().get(0));  //设置路线数据
                overlay.addToMap(); //将所有overlay添加到地图中
                overlay.zoomToSpan();//缩放地图
            }
        }
    
        /**
         * 得到步行的路线
         *
         * @param bikingRouteResult
         */
        @Override
        public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
            if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (bikingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                // result.getSuggestAddrInfo()
                return;
            }
            if (bikingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                nodeIndex = -1;
                mBtnPre.setVisibility(View.VISIBLE);
                mBtnNext.setVisibility(View.VISIBLE);
                route = bikingRouteResult.getRouteLines().get(0);
                BikingRouteOverlay overlay = new MyBikingRouteOverlay(mBaidumap);
                routeOverlay = overlay;
                mBaidumap.setOnMarkerClickListener(overlay);
                overlay.setData(bikingRouteResult.getRouteLines().get(0));//设置路线数据
                overlay.addToMap();//将所有overlay添加到地图中
                overlay.zoomToSpan(); //缩放地图
            }
        }
    
        /**
         * 用于显示一条驾车路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示,当数据中包含路况数据时,则默认使用路况纹理分段绘制
         */
        // 定制RouteOverly
        private class MyDrivingRouteOverlay extends DrivingRouteOverlay {
    
            public MyDrivingRouteOverlay(BaiduMap baiduMap) {
                super(baiduMap);
            }
    
            @Override
            public BitmapDescriptor getStartMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_st);
                }
                return null;
            }
    
            @Override
            public BitmapDescriptor getTerminalMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_en);
                }
                return null;
            }
        }
    
        /**
         * 用于显示步行路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示
         */
        private class MyWalkingRouteOverlay extends WalkingRouteOverlay {
    
            public MyWalkingRouteOverlay(BaiduMap baiduMap) {
                super(baiduMap);
            }
    
            @Override
            public BitmapDescriptor getStartMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_st);
                }
                return null;
            }
    
            @Override
            public BitmapDescriptor getTerminalMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_en);
                }
                return null;
            }
        }
    
        /**
         * 用于显示换乘路线的Overlay,自3.4.0版本起可实例化多个添加在地图中显示
         */
        private class MyTransitRouteOverlay extends TransitRouteOverlay {
    
            public MyTransitRouteOverlay(BaiduMap baiduMap) {
                super(baiduMap);
            }
    
            @Override
            public BitmapDescriptor getStartMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_st);
                }
                return null;
            }
    
            @Override
            public BitmapDescriptor getTerminalMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_en);
                }
                return null;
            }
        }
    
        /**
         * 用于显示骑行路线的Overlay
         */
        private class MyBikingRouteOverlay extends BikingRouteOverlay {
            public  MyBikingRouteOverlay(BaiduMap baiduMap) {
                super(baiduMap);
            }
    
            @Override
            public BitmapDescriptor getStartMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_st);
                }
                return null;
            }
    
            @Override
            public BitmapDescriptor getTerminalMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.mipmap.icon_en);
                }
                return null;
            }
    
        }
    
        @Override
        public void onMapClick(LatLng point) {
            mBaidumap.hideInfoWindow();
        }
    
        @Override
        public boolean onMapPoiClick(MapPoi poi) {
            return false;
        }
    
        @Override
        protected void onPause() {
            mMapView.onPause();
            super.onPause();
        }
    
        @Override
        protected void onResume() {
            mMapView.onResume();
            super.onResume();
        }
    
        @Override
        protected void onDestroy() {
            mSearch.destroy();
            mMapView.onDestroy();
            super.onDestroy();
        }
    
    }
    
    

    我们来看下路线截图:


    由于用到了其他的类,这几个类在百度地图D:\迅雷下载\BaiduMap_AndroidSDK_All\BaiduMap_AndroidSDK_v3.7.1\BaiduMap_AndroidSDK_v3.7.1_Sample\BaiduMap_AndroidSDK_v3.7.1_Sample\BaiduMapsApiASDemo\app\src\main\java\com\baidu\mapapi\overlayutil这个目录下:
    这里上传github地址,方便参考:https://github.com/wuyinlei/BaiDuMap

    相关文章

      网友评论

        本文标题:百度地图总结第四篇之路线规划功能

        本文链接:https://www.haomeiwen.com/subject/bwchrttx.html