Android百度地图——路线规划搜索

百度地图提供的路线规划搜索有3种:驾车、公交、步行。
3中方式的使用方法类似,步骤如下:
1、初始化地图

/**初始化百度地图
     * 
     */
    private void initBaiduMap(){
        //初始化地图     
        mMapView.showZoomControls(false);
    
        mBaidumap = mMapView.getMap();
        
        //地图点击事件处理
        mBaidumap.setOnMapClickListener(new OnMapClickListener() {
            
            @Override
            public boolean onMapPoiClick(MapPoi arg0) {
                // TODO Auto-generated method stub
                return false;
            }
            
            @Override
            public void onMapClick(LatLng arg0) {
                // TODO Auto-generated method stub
                mBaidumap.hideInfoWindow();
            }
        });
        // 初始化搜索模块,注册事件监听
        mSearch = RoutePlanSearch.newInstance();
        //mSearch.setOnGetRoutePlanResultListener(this);
        mBaidumap.setOnMapLoadedCallback(new OnMapLoadedCallback() {
            
            @Override
            public void onMapLoaded() {
                // TODO Auto-generated method stub
                //地图加载完成
                SearchButtonProcess();//调用路径规划
            }
        });
    }

2、规划路线,包括设置起始点、终点、途经点,并选择一种搜索方式。

/**
     * 发起路线规划搜索示例
     *
     * @param v
     */
    private void SearchButtonProcess() {
        //重置浏览节点的路线数据
        //route = null;
        mBaidumap.clear();
        ArrayList<PlanNode> arg0 =new ArrayList<PlanNode>();
        //设置起终点、途经点信息,对于tranist search 来说,城市名无意义
        PlanNode stNode = PlanNode.withLocation(new LatLng(StationsList.getStationsList().get(0).getLatitude(), StationsList.getStationsList().get(0).getLongitude()));
        PlanNode enNode = PlanNode.withLocation(new LatLng(StationsList.getStationsList().get(StationsList.getStationsList().size()-1).getLatitude(), StationsList.getStationsList().get(StationsList.getStationsList().size()-1).getLongitude()));
        for (int i = 1; i < StationsList.getStationsList().size()-1; i++) {
            PlanNode node = PlanNode.withLocation(new LatLng(StationsList.getStationsList().get(i).getLatitude(), StationsList.getStationsList().get(i).getLongitude()));
            arg0.add(node);
        }
        
        // 实际使用中请对起点终点城市进行正确的设定
            mSearch.drivingSearch((new DrivingRoutePlanOption())
                    .from(stNode)//起点
                    .passBy(arg0)//途经点
                    .to(enNode));//终点
    }

3、接收并处理结果。通常需要集合覆盖物来显示路线。

@Override
    public void onGetDrivingRouteResult(DrivingRouteResult result) {
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            Toast.makeText(activity, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
        }
        if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
            //起终点或途经点地址有岐义,通过以下接口获取建议查询信息
            //result.getSuggestAddrInfo()
            Toast.makeText(activity, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            return;
        }
        if (result.error == SearchResult.ERRORNO.NO_ERROR) {
            
//            route = result.getRouteLines().get(0);
            DrivingRouteOverlay overlay = new MyDrivingRouteOverlay(mBaidumap);//路线覆盖物,MyDrivingRouteOverlay代码下面给出
            routeOverlay = overlay;
//            mBaidumap.setOnMarkerClickListener(overlay);
            overlay.setData(result.getRouteLines().get(0));
            overlay.addToMap();
            overlay.zoomToSpan();
            
        }
    }
    @Override
    public void onGetWalkingRouteResult(WalkingRouteResult result) {
        
    }

    @Override
    public void onGetTransitRouteResult(TransitRouteResult result) {
        
    }

路线覆盖物类MyDrivingRouteOverlay:

//定制RouteOverly
    private class MyDrivingRouteOverlay extends DrivingRouteOverlay {

        public MyDrivingRouteOverlay(BaiduMap baiduMap) {
            super(baiduMap,StationsList.getStationsList().size());
        }

        @Override
        public BitmapDescriptor getStartMarker() {
        //覆写此方法以改变默认起点图标
            return BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);
        //这里可以使用BitmapDescriptorFactory.fromView(view)实现自定义view覆盖物,自定义覆盖物请关注以后的文章。
        }
        
        @Override
        public int getLineColor() {
            // TODO Auto-generated method stub
            //覆写此方法以改变默认绘制颜色
            //Returns:
            //线颜色
            return super.getLineColor();
        }
        @Override
        public BitmapDescriptor getTerminalMarker() {
           //覆写此方法以改变默认终点图标
            return BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);
        }
        
        @Override
        public boolean onRouteNodeClick(int i) {
            // TODO Auto-generated method stub
                //覆写此方法以改变默认点击处理
            return true;
        }
    }

DrivingRouteOverlay是百度提供的源码,可以去官网下载,源码如下:

package com.baidu.mapapi.overlayutil;

import android.R.integer;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.route.DrivingRouteLine;
import com.baidu.mapapi.search.route.DrivingRouteLine.DrivingStep;

import java.util.ArrayList;
import java.util.List;

/**
 * 用于显示一条驾车路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示,当数据中包含路况数据时,则默认使用路况纹理分段绘制
 */
public class DrivingRouteOverlay extends OverlayManager {
    private int stationsize=0;
    private DrivingRouteLine mRouteLine = null;
    boolean focus = false;

    /**
     * 构造函数
     * 
     * @param baiduMap
     *            该DrivingRouteOvelray引用的 BaiduMap
     */
    public DrivingRouteOverlay(BaiduMap baiduMap) {
        super(baiduMap);
    }
    public DrivingRouteOverlay(BaiduMap baiduMap,int size) {
        super(baiduMap);
        stationsize=size;
    }
    @Override
    public final List<OverlayOptions> getOverlayOptions() {
        if (mRouteLine == null) {
            return null;
        }

        List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
        // step node
//        if (mRouteLine.getAllStep() != null
//                && mRouteLine.getAllStep().size() > 0) {
//            
//            for (DrivingRouteLine.DrivingStep step : mRouteLine.getAllStep()) {
//                Bundle b = new Bundle();
//                b.putInt("index", mRouteLine.getAllStep().indexOf(step));
//                if (step.getEntrance() != null) {
//                    overlayOptionses.add((new MarkerOptions())
//                            .position(step.getEntrance().getLocation())
//                                    .anchor(0.5f, 0.5f)
//                                            .zIndex(10)
//                                                    .rotate((360 - step.getDirection()))
//                                                            .extraInfo(b)
//                                                                    .icon(BitmapDescriptorFactory
//                                                                            .fromAssetWithDpi("Icon_line_node.png")));
//                }
//                // 最后路段绘制出口点
//                if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine
//                        .getAllStep().size() - 1) && step.getExit() != null) {
//                    overlayOptionses.add((new MarkerOptions())
//                            .position(step.getExit().getLocation())
//                                    .anchor(0.5f, 0.5f)
//                                            .zIndex(10)
//                                                    .icon(BitmapDescriptorFactory
//                                                            .fromAssetWithDpi("Icon_line_node.png")));
//
//                }
//            }
//        }

        if (mRouteLine.getStarting() != null) {
            overlayOptionses.add((new MarkerOptions())
                    .position(mRouteLine.getStarting().getLocation())
                            .icon(getStartMarker() != null ? getStartMarker() :
                                    BitmapDescriptorFactory
                                            .fromAssetWithDpi("Icon_start.png")).zIndex(0));
        }
        if (mRouteLine.getTerminal() != null) {
            overlayOptionses
                    .add((new MarkerOptions())
                            .position(mRouteLine.getTerminal().getLocation())
                                    .icon(getTerminalMarker() != null ? getTerminalMarker() :
                                            BitmapDescriptorFactory
                                                    .fromAssetWithDpi("Icon_end.png"))
                                                            .zIndex(stationsize-1));
        }
        // poly line
        if (mRouteLine.getAllStep() != null
                && mRouteLine.getAllStep().size() > 0) {
        
            List<DrivingStep> steps = mRouteLine.getAllStep();
            int stepNum = steps.size();
            
            
            List<LatLng> points = new ArrayList<LatLng>();
            ArrayList<Integer> traffics = new ArrayList<Integer>();
            int totalTraffic = 0;
            for (int i = 0; i < stepNum ; i++) {
                if (i == stepNum - 1) {
                    points.addAll(steps.get(i).getWayPoints());
                } else {
                    points.addAll(steps.get(i).getWayPoints().subList(0, steps.get(i).getWayPoints().size() - 1));
                }
                
                totalTraffic += steps.get(i).getWayPoints().size() - 1;
                if (steps.get(i).getTrafficList() != null && steps.get(i).getTrafficList().length > 0) {
                    for (int j = 0;j < steps.get(i).getTrafficList().length;j++) {
                        traffics.add(steps.get(i).getTrafficList()[j]);
                    }
                }
            }
            
//            Bundle indexList = new Bundle();
//            if (traffics.size() > 0) {
//                int raffic[] = new int[traffics.size()];
//                int index = 0;
//                for (Integer tempTraff : traffics) {
//                    raffic[index] = tempTraff.intValue();
//                    index++;
//                }
//                indexList.putIntArray("indexs", raffic);
//            }
            boolean isDotLine = false;
            
            if (traffics != null && traffics.size() > 0) {
                isDotLine = true;
            }
            PolylineOptions option = new PolylineOptions().points(points).textureIndex(traffics)
                    .width(10).dottedLine(isDotLine).focus(true)
                        .color(getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255)).zIndex(0);
            if (isDotLine) {
                option.customTextureList(getCustomTextureList());
            }
            overlayOptionses.add(option);
        }
        return overlayOptionses;
    }

    /**
     * 设置路线数据
     * 
     * @param routeLine
     *            路线数据
     */
    public void setData(DrivingRouteLine routeLine) {
        this.mRouteLine = routeLine;
    }

    /**
     * 覆写此方法以改变默认起点图标
     * 
     * @return 起点图标
     */
    public BitmapDescriptor getStartMarker() {
        return null;
    }

    /**
     * 覆写此方法以改变默认绘制颜色
     * @return 线颜色
     */
    public int getLineColor() {
        return 0;
    }
    public List<BitmapDescriptor> getCustomTextureList() {
        ArrayList<BitmapDescriptor> list = new ArrayList<BitmapDescriptor>();
        list.add(BitmapDescriptorFactory.fromAsset("Icon_road_blue_arrow.png"));
        list.add(BitmapDescriptorFactory.fromAsset("Icon_road_green_arrow.png"));
        list.add(BitmapDescriptorFactory.fromAsset("Icon_road_yellow_arrow.png"));
        list.add(BitmapDescriptorFactory.fromAsset("Icon_road_red_arrow.png"));
        list.add(BitmapDescriptorFactory.fromAsset("Icon_road_nofocus.png"));
        return list;
    }
    /**
     * 覆写此方法以改变默认终点图标
     * 
     * @return 终点图标
     */
    public BitmapDescriptor getTerminalMarker() {
        return null;
    }

    /**
     * 覆写此方法以改变默认点击处理
     * 
     * @param i
     *            线路节点的 index
     * @return 是否处理了该点击事件
     */
    public boolean onRouteNodeClick(int i) {
        if (mRouteLine.getAllStep() != null
                && mRouteLine.getAllStep().get(i) != null) {
            Log.i("baidumapsdk", "DrivingRouteOverlay onRouteNodeClick");
        }
        return false;
    }

    @Override
    public final boolean onMarkerClick(Marker marker) {
        for (Overlay mMarker : mOverlayList) {
            if (mMarker instanceof Marker && mMarker.equals(marker)) {
                if (marker.getExtraInfo() != null) {
                    onRouteNodeClick(marker.getExtraInfo().getInt("index"));
                }
            }
        }
        return true;
    }

    @Override
    public boolean onPolylineClick(Polyline polyline) {
        boolean flag = false;
        for (Overlay mPolyline : mOverlayList) {
            if (mPolyline instanceof Polyline && mPolyline.equals(polyline)) {
                // 选中
                flag = true;
                break;
            }
        }
        setFocus(flag);
        return true;
    }

    public void setFocus(boolean flag) {
        focus = flag;
        for (Overlay mPolyline : mOverlayList) {
            if (mPolyline instanceof Polyline) {
                // 选中
                ((Polyline) mPolyline).setFocus(flag);

                break;
            }
        }

    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容