Android百度地图Poi检索开发总结

本文对百度地图显示后的各种功能开发做详细总结!

显示百度地图的基本步骤

  1. 下载SDK
  2. 加入lib中,依赖jar,并且依赖so文件
  3. application中添加开发者的key
  4. 添加权限
  5. 初始化sdk
  6. 添加布局,实例化对象,显示视图

之前已经有很详细的介绍了:http://blog.csdn.net/wenzhi20102321/article/details/54344613


百度地图的基本图层知识

百度地图SDK为广大开发者提供的基础地图和上面的各种覆盖物元素,具有一定的层级压盖关系,具体如下(从下至上的顺序):
1、基础底图(包括底图、底图道路、卫星图、室内图等);
2、瓦片图层(TileOverlay);
3、地形图图层(GroundOverlay);
4、热力图图层(HeatMap);
5、实时路况图图层(BaiduMap.setTrafficEnabled(true););
6、百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true););
7、底图标注(指的是底图上面自带的那些POI元素);
8、几何图形图层(点、折线、弧线、圆、多边形);
9、标注图层(Marker),文字绘制图层(Text);
10、指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针);
11、定位图层(BaiduMap.setMyLocationEnabled(true););
12、弹出窗图层(InfoWindow);
13、自定义View(MapView.addView(View););
上面十三层,并不是全部都要我们去理解或接触,比如只要简单显示的话,第一层就够用了,2至6层可以选择性的显示,简单的代码就可以实现,7到13层就要使用代码去详细设置了!

百度地图的基础知识

重要类和方法

关于百度地图所有的类和方法的地址:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/1025v4.1.1/index.html

MapView 百度地图的布局的对象
BaiduMap 百度地图的控制对象
Latlng 地理位置对象 latitude纬度,longitude经度
这里科普一下知识:纬度度数范围,0-90。.经度度数范围,0-180度。0度纬线就是赤道。0度经线就是本初子午线。
Overlay 是覆盖物的对象类,标记物Marker是它的子类
OverlayOptions 覆盖物选型基类,子类有很多,
— TextOptions 创建文字覆盖物选项
— DotOptions 创建圆点的选项类
— MarkerOptions 创建图片覆盖物的选项
— GroundOverlayOptions 构造 ground 覆盖物的选项类
— ArcOptions 弧线构造选项
— CircleOptions 创建圆的选项
— PolylineOptions 创建折线覆盖物选项类
— PolygonOptions 创建多边形覆盖物选项类
SearchResult 搜索的对象
—PoiResult Poi检索结果对象
—PoiDetailResult Poi详细检索结果对象
PoiInfo 检索结果数据对象,里面包含很多数据,比如城市,地理位置,电话号码,uid等等,
PoiSearch Poi检索对象,用来发起Poi检索,
BusLineSearch 公交搜索对象,用来发起公交检索,
RoutePlanSearch 路线检索的对象,可以发起步行、驾车、跨城等等路线检索

最简单的地图显示代码

1.设置经纬度

//经纬度是反的 纬度在前,经度在后LatLng latlng = new LatLng(22.536269, 113.95169);

2.地图的显示

//1-20级,20级为室内地图MapStatusUpdate mapStatusUpdate =MapStatusUpdateFactory.newLatLngZoom(latlng, 18);mBaiduMap.setMapStatus(mapStatusUpdate);

百度地图的其他设置

3.地图类型

//打开交通图// mBaiduMap.setTrafficEnabled(true);//打开热力图// mBaiduMap.setBaiduHeatMapEnabled(true);//打开卫星图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

4.地图标注

BitmapDescriptor 生成覆盖物的图片
Overlay是所有覆盖物的基类 文字,点,线,弧,圆,矩形,图片
显示小图标图片在某一个经纬度位置的示例代码:

         Marker marker;//定义Marker标志对象        //定义Maker坐标点,设置大学经度和纬度113.943062,22.54069        //设置的时候经纬度是反的 纬度在前,经度在后        LatLng point = new LatLng(22.54069, 113.943062);        //构建Marker图标        BitmapDescriptor bitmap = BitmapDescriptorFactory                .fromResource(R.mipmap.shenzhen);        //构建MarkerOption,用于在地图上添加Marker        OverlayOptions option = new MarkerOptions()                .position(point)                .icon(bitmap);        //在地图上添加Marker,并显示         marker = (Marker) (mBaiduMap.addOverlay(options));        //1-20级 20级室内地图        MapStatusUpdate mapStatusUpdate =                MapStatusUpdateFactory.newLatLngZoom(point, 19);        mBaiduMap.setMapStatus(mapStatusUpdate);

在地图范围显示一个圆圈

    //在地图范围添加一个圆圈,传入圆心点的坐标point,填充的颜色,半径(米),还可以设置边框等等        CircleOptions circle = new CircleOptions().center(point).fillColor(0x80ff0000).radius(100);        mBaiduMap.addOverlay(circle);

5.地图事件

//监听事件

   //地图改变时的监听, 缩放等级,一般用于地图缩放时,标记的图标消失,或变小!        mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {           //地图缩放状态改变开始时           @Override           public void onMapStatusChangeStart(MapStatus mapStatus) {           }           //地图缩放状态改变时           @Override           public void onMapStatusChange(MapStatus mapStatus) {               //清除所有覆盖物               mBaiduMap.clear();               if (mapStatus.zoom >= 15) {                   //创建覆盖物                   OverlayOptions options = new                           MarkerOptions().position(latlng).icon(bitmap);                   //添加覆盖物                   mBaiduMap.addOverlay(options);               }           }           //地图缩放状态改变后           @Override           public void onMapStatusChangeFinish(MapStatus mapStatus) {           }       }    );
    //单击地图的监听        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {                    //地图单击事件回调方法                    @Override                    public void onMapClick(LatLng latLng) {                        Log.e("TAG", "点击到地图上了!纬度" + latLng.latitude + "经度" + latLng.longitude);                    }                     //Poi 单击事件回调方法,比如点击到地图上面的商店,公交车站,地铁站等等公共场所                        @Override                        public boolean onMapPoiClick(MapPoi mapPoi) {                            Log.e("TAG", "点击到地图上的POI物体了!名称:" + mapPoi.getName() + ",Uid:" + mapPoi.getUid());                            return true;                        }                }        );
    //双击地图的监听        mBaiduMap.setOnMapDoubleClickListener(new BaiduMap.OnMapDoubleClickListener() {                          @Override                          public void onMapDoubleClick(LatLng latLng) {                              Log.e("TAG", "双击到地图上了!" + latLng.latitude + "经度" + latLng.longitude);                          }                      }        );
//长按地图时的监听    mBaiduMap.OnMapLongClickListener 因为没啥应用就不详细写了
     //地图上标记物点击的监听        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {            @Override            public boolean onMarkerClick(Marker marker) {                Toast.makeText(getBaseContext(), "点击了标记物",Toast.LENGTH_SHORT).show();                return false;            }        });
    //覆盖物拖拽事件,这个有必要要说一下:有时候拖拽事件的方法为啥没有得到回调!!因为会跟其他的监听事件有才冲突    //如果要拖拽事件得到回调,不能监听地图改变的缩放事件,也就是setOnMapStatusChangeListener方法不能设置        mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {             //拖拽中             public void onMarkerDrag(Marker marker) {                Log.e("TAG", "拖拽中");            }            //拖拽结束            public void onMarkerDragEnd(Marker marker) {                Log.e("TAG", "拖拽结束,纬度:" + marker.getPosition().latitude + ",经度:" + marker.getPosition().longitude);            }            //开始拖拽            public void onMarkerDragStart(Marker marker) {                Log.e("TAG", "开始拖拽");            }        });

6.弹出窗覆盖物

        //一个地图页面只能显示一个弹出框,创建第二个时,第一个会消失        ImageView iv = new ImageView(getApplication());        iv.setImageResource(R.mipmap.shenzhen);        //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量(坐标的位置偏离的像素点)        InfoWindow mInfoWindow = new InfoWindow(iv, latLng, -47);        //显示InfoWindow        mBaiduMap.showInfoWindow(mInfoWindow);

7.POI检索

这是百度地图中,比较实用的,也是有点难的知识!
包括的内容也是比较多的,有:城市检索,周边检索,公交路线检索,驾车路线检索,骑车路线检索等等
这里最好实用百度地图里面的工具包的类,里面已经写好了很多代码,特别是数据传递这一块。
下载里面的百度地图的Demo文件夹的src\com\baidu\mapapi\overlayutil下有十几个java文件的工具类,复制到自己的工程中,就可以使用。但是要记得把\res\drawable-hdpi里面的图标也复制到自己的工程中,因为搜索地点是会有ABC这样的标记图标。


PoiSearch的详细说明:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/1025v4.1.1/index.html

具体的操作步骤:

1.搜索对象的创建,这里要使用的是静态方法:newInstance

  PoiSearch   search = PoiSearch.newInstance();

2.重写简单搜索的类,可以进行市区搜索和周边搜索,如果是路线搜索要重写另外的类
代码如下:

/** * 重写和设置最基础的覆盖类 * 用来处理搜索到的对象的信息数据 * 这里的PoiOverlay是工具类里面的类,需要自己去复制过来使用 */public class MyOverLay extends PoiOverlay {    /**     * 构造函数     */    PoiSearch poiSearch;    public MyOverLay(BaiduMap baiduMap, PoiSearch poiSearch) {        super(baiduMap);        this.poiSearch = poiSearch;    }    /**     * 覆盖物被点击时     */    @Override    public boolean onPoiClick(int i) {        //获取点击的标记物的数据        PoiInfo poiInfo = getPoiResult().getAllPoi().get(i);        Log.e("TAG", poiInfo.name + "   " + poiInfo.address + "   " + poiInfo.phoneNum);        //  发起一个详细检索,要使用uid        poiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(poiInfo.uid));        return true;    }}

3.创建搜索的监听对象,要重写三个方法,代码:

    //POI检索的监听对象    OnGetPoiSearchResultListener resultListener = new OnGetPoiSearchResultListener() {        //获得POI的检索结果,一般检索数据都是在这里获取        @Override        public void onGetPoiResult(PoiResult poiResult) {            //如果搜索到的结果不为空,并且没有错误            if (poiResult != null && poiResult.error == PoiResult.ERRORNO.NO_ERROR) {                MyOverLay overlay = new MyOverLay(mBaiduMap, search);//这传入search对象,因为一般搜索到后,点击时方便发出详细搜索                //设置数据,这里只需要一步,                overlay.setData(poiResult);                //添加到地图                overlay.addToMap();                //将显示视图拉倒正好可以看到所有POI兴趣点的缩放等级                overlay.zoomToSpan();//计算工具                //设置标记物的点击监听事件                mBaiduMap.setOnMarkerClickListener(overlay);            } else {                Toast.makeText(getApplication(), "搜索不到你需要的信息!", Toast.LENGTH_SHORT).show();            }        }        //获得POI的详细检索结果,如果发起的是详细检索,这个方法会得到回调(需要uid)        //详细检索一般用于单个地点的搜索,比如搜索一大堆信息后,选择其中一个地点再使用详细检索        @Override        public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {            if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {                Toast.makeText(getApplication(), "抱歉,未找到结果",                        Toast.LENGTH_SHORT).show();            } else {// 正常返回结果的时候,此处可以获得很多相关信息                Toast.makeText(getApplication(), poiDetailResult.getName() + ": "                                + poiDetailResult.getAddress(),                        Toast.LENGTH_LONG).show();            }        }        //获得POI室内检索结果        @Override        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {        }    };

4.设置监听对象

        search.setOnGetPoiSearchResultListener(resultListener);

5.触发搜索

        //城市搜索,需要城市名称和关键字        String city = et_city.getText().toString();        String key = et_key.getText().toString();        //发起检索        PoiCitySearchOption poiCity = new PoiCitySearchOption();        poiCity.keyword(key).city(city);//这里还能设置显示的个数,默认显示10个        search.searchInCity(poiCity);//执行搜索,搜索结束后,在搜索监听对象里面的方法会被回调

这里说一下范围检索和周边检索:
周边检索是指定圆形位置和圆的半径的检索
而范围检索,指定的是一个长方向的范围检索,需要指定左上和右下角的地理位置
//我执行周边检索和范围检索的时候,不知道为什么指定的范围没起到什么作用!搜到的数据好像是会超出范围的!!!

        //POI搜索,范围检索        //定义Maker坐标点,深圳大学经度和纬度113.943062,22.54069        double latitude = 22.54069;        double longitude = 113.943062;        //获得Key        String key = et_around.getText().toString();        //发起周边检索        PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();        LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南        LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北        LatLngBounds bounds = new LatLngBounds.Builder().include(southwest)                .include(northeast).build();// 得到一个地理范围对象        boundSearchOption.bound(bounds);// 设置poi检索范围        boundSearchOption.keyword(key);// 检索关键字        boundSearchOption.pageNum(1);//搜索一页        search.searchInBound(boundSearchOption);// 发起poi范围检索请求
  //POI搜索,周边检索,        //定义Maker坐标点,深圳大学经度和纬度113.943062,22.54069        //设置的时候经纬度是反的 纬度在前,经度在后        LatLng point = new LatLng(22.54069, 113.943062);        //获得Key        String key = et_point.getText().toString();        //周边检索        PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();        nearbySearchOption.location(point);        nearbySearchOption.keyword(key);        nearbySearchOption.radius(100);// 检索半径,单位是米        nearbySearchOption.pageNum(1);//搜索一页        search.searchNearby(nearbySearchOption);// 发起附近检索请求

上面五步就可以就可以完成各种点的PoiSearch搜寻。
如果要要实现路线搜索确实是要麻烦一点的。使用的类不仅要PoiSearch,还有其他的类,比如公交路线搜索使用的是BusLineSearch,而所有的路线搜索的使用步骤也是基本一样的。

8.公交、地铁路线检索

路线搜索的类:
BusLineSearch 公交、地铁路线搜索

    //路线搜索,大致思路:    //1.先发起一个poi检索,(新建一个Poi检索对象)    //2.在poi的检索结果中发起公交搜索    //3.在公交检索搜索结果中获取数据

虽然公交、地铁的路线检索步骤多得很,但是也是要说的:

1.搜索对象的创建,这里要使用的是静态方法,使用的类就是PoiSearch和BusLineSearch

  PoiSearch   busPoiSearch = PoiSearch.newInstance();//Poi检索对象  BusLineSearch  busLineSearch = BusLineSearch.newInstance();//公交检索对象

2.重写简单搜索的类MyOverLay,可以进行市区搜索和周边搜索,这里路线搜索要还要重写另外的类BusLineOverlay
MyOverLay类重写这里就不重复写了,这里简单说一下重写BusLineOverlay
代码如下:

/** * 重写和设置公交路线的覆盖类 * 用来处理搜索到的对象的信息数据 * 把数据保存在每一个对应的Mark对象中 */public class MyBusOverLay extends BusLineOverlay {    /**     * 构造函数     */    PoiSearch busPoiSearch;    public MyBusOverLay(BaiduMap baiduMap, PoiSearch busPoiSearch) {        super(baiduMap);        this.busPoiSearch = busPoiSearch;    }    @Override    public boolean onBusStationClick(int index) {        //获取点击的标记物的数据        Log.e("TAG", "站点:" + mBusLineResult.getBusLineName());        Log.e("TAG", "运营时间:" + mBusLineResult.getStartTime() + "---" + mBusLineResult.getEndTime());        Log.e("TAG", "费用:" + mBusLineResult.getBasePrice() + "---" + mBusLineResult.getMaxPrice());        //  发起一个详细检索,要使用uid        busPoiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(mBusLineResult.getUid()));        return true;    }}

3.创建搜索的监听对象,要重写三个方法,代码:

     //公交路线的点的POI检索的监听对象,和上面的接口对象其实是一个类的,但是里面的处理是不一样的    //在里面判断是否是搜索到公交路线的Poi点    OnGetPoiSearchResultListener busPoiSearchResultListener = new OnGetPoiSearchResultListener() {        //获得POI的检索结果,一般检索数据都是在这里获取        @Override        public void onGetPoiResult(PoiResult poiResult) {            mBaiduMap.clear();//清除标志            if (poiResult != null && poiResult.error == PoiResult.ERRORNO.NO_ERROR) {//如果没有错误                //遍历所有数据                for (int i = 0; i < poiResult.getAllPoi().size(); i++) {                    //获取里面的数据对象                    PoiInfo poiInfo = poiResult.getAllPoi().get(i);                    //判断检索到的点的类型是不是公交路线或地铁路线                    //poiInfo类中有个type字段:0:普通点、1:、公交站 2:、 公交路线 3:、地铁站 4:地铁线路                    if (poiInfo.type == PoiInfo.POITYPE.BUS_LINE || poiInfo.type == PoiInfo.POITYPE.SUBWAY_LINE) {                        //发起公交检索                        BusLineSearchOption busLineOptions = new BusLineSearchOption();                        busLineOptions.city("深圳").uid(poiInfo.uid);//公交检索要指定城市和uid!                        busLineSearch.searchBusLine(busLineOptions);                    }                }                return;            } else {                Toast.makeText(getApplication(), "搜索不到你需要的信息!", Toast.LENGTH_SHORT).show();            }        }        //获得POI的详细检索结果,如果发起的是详细检索,这个方法会得到回调(需要uid)        @Override        public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {            if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {                Toast.makeText(getApplication(), "抱歉,未找到结果",                        Toast.LENGTH_SHORT).show();            } else {// 正常返回结果的时候,此处可以获得很多相关信息                Toast.makeText(getApplication(), poiDetailResult.getName() + ": "                                + poiDetailResult.getAddress(),                        Toast.LENGTH_LONG).show();            }        }        //获得POI室内检索结果        @Override        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {        }    };

4.设置监听对象,两个!

        //这里是Poi检索的监听            busPoiSearch.setOnGetPoiSearchResultListener(busPoiSearchResultListener);         //设置公交监听对象,公交检索得到结果后,里面的方法得到回调,这里是公交检索的监听        busLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {            @Override            public void onGetBusLineResult(BusLineResult busLineResult) {                MyBusOverLay overlay = new MyBusOverLay(mBaiduMap,busPoiSearch);//这里用到了MyBusOverLay类                //设置数据,这里只需要一步,                overlay.setData(busLineResult);                //添加到地图                overlay.addToMap();                //将显示视图拉倒正好可以看到所有POI兴趣点的缩放等级                overlay.zoomToSpan();//计算工具                //设置标记物的点击监听事件                mBaiduMap.setOnMarkerClickListener(overlay);            }        });

5.触发搜索

         String key = et_start.getText().toString();        //城市内的公交、地铁路线检索        PoiCitySearchOption poiCitySearchOptions = new PoiCitySearchOption();        poiCitySearchOptions.city("深圳").keyword(key);//城市检索的数据设置        busPoiSearch.searchInCity(poiCitySearchOptions);//发起城市检索,当然也可以发送范围检索和周边检索        //之后的思路也简单说一下:这里发送城市检索后,Poi检索的监听对象的方法会接收到数据        //Poi检索的方法接收到数据后发起公交检索,公交检索的监听对象的方法就会得到回调,就会显示公交路线在地图上面        //因为在MyBusOverLay中重写了Onclick方法,所以点击是会发起Poi的详细检索,详细检索的监听方法得到回调后会土司(当然也可以实现页面跳转!)

9.自定义路线检索

RoutePlanSearch 驾车/骑车/步行的路线搜索,
路线检索其实并不是很难,这里并没有用到Poi检索,简单的路线检索要指定起点和终点,点的位置可以只用经纬度,也可以使用城市+关键字。
步行路线检索最简单,这里把步骤写下:
1.创建路线规划对象

 RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();//路线规划对象

这里没有重写那些工具类,是因为一般不需要点击路线上面的点,如果需要也是可以重写的!
2.给路线规划创建监听,这里要重写很多的方法,如果知道是发起的哪一个路线检索,就在哪一个路线检索的回调方法里面设置显示路线在地图上面。

 //给路线规划添加监听        routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {            //步行路线结果回调            @Override            public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {                mBaiduMap.clear();                if (walkingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {                    WalkingRouteOverlay walkingOverlay = new WalkingRouteOverlay(mBaiduMap);                    walkingOverlay.setData(walkingRouteResult.getRouteLines().get(0));// 设置一条路线方案                    walkingOverlay.addToMap();                    walkingOverlay.zoomToSpan();                    mBaiduMap.setOnMarkerClickListener(walkingOverlay);                    Log.e("TAG", walkingOverlay.getOverlayOptions() + "");                } else {                    Toast.makeText(getBaseContext(), "搜不到!", Toast.LENGTH_SHORT).show();                }            }            //换乘线结果回调            @Override            public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {            }            //跨城公共交通路线结果回调            @Override            public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {            }            //驾车路线结果回调            @Override            public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {                mBaiduMap.clear();//清除图标或路线                if (drivingRouteResult == null                        || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {                    Toast.makeText(getBaseContext(), "抱歉,未找到结果",                            Toast.LENGTH_SHORT).show();                }                if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {                    DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(                            mBaiduMap);                    drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(1));// 设置一条驾车路线方案                    mBaiduMap.setOnMarkerClickListener(drivingRouteOverlay);                    drivingRouteOverlay.addToMap();                    drivingRouteOverlay.zoomToSpan();                    int totalLine = drivingRouteResult.getRouteLines().size();                    Toast.makeText(getBaseContext(),                            "共查询出" + totalLine + "条符合条件的线路", Toast.LENGTH_LONG).show();                    // 通过getTaxiInfo()可以得到很多关于驾车的信息                }            }            //室内路线规划回调            @Override            public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {            }            // 骑行路线结果回调            @Override            public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {            }        });

3.触发搜索,这里要保证上面的回调方法已经设置好!

        //发起步行路线检索,这里发起的是某一个位置到深圳大学的位置的路线          //定义Maker坐标点,深圳大学经度和纬度113.943062,22.54069        //设置的时候经纬度是反的 纬度在前,经度在后        LatLng point = new LatLng(22.54069, 113.943062);        //获得关键字        String key = et_start.getText().toString();        //创建步行路线搜索对象        WalkingRoutePlanOption walkingSearch = new WalkingRoutePlanOption();        //设置节点对象,可以通过城市+关键字或者使用经纬度对象来设置        PlanNode fromeNode = PlanNode.withCityNameAndPlaceName("深圳", key);        PlanNode toNode = PlanNode.withLocation(point);        walkingSearch.from(fromeNode).to(toNode);        routePlanSearch.walkingSearch(walkingSearch);//发起路线检索

驾车路线,比步行路线可以设置的属性相对多一点,比如可以设置经过那个点,选择路线的策略( 躲避拥堵,最短距离,较少费用,时间优先)

    //发起驾车路线检索,这里发起的是某一个位置到深圳大学的位置的路线    //定义Maker坐标点,深圳大学经度和纬度113.943062,22.54069        //设置的时候经纬度是反的 纬度在前,经度在后        LatLng point = new LatLng(22.54069, 113.943062);        //获得关键字        String key = et_start.getText().toString();        //创建驾车路线搜索对象        DrivingRoutePlanOption drivingOptions = new DrivingRoutePlanOption();        //设置节点对象,可以通过城市+关键字或者使用经纬度对象来设置        PlanNode fromeNode = PlanNode.withCityNameAndPlaceName("深圳", key);        PlanNode toNode = PlanNode.withLocation(point);        drivingOptions.from(fromeNode).to(toNode);        //drivingOptions.passBy(list);//设置路线经过的点,要放入一个PlanNode的集合对象        drivingOptions.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_AVOID_JAM);//设置驾车策略,避免拥堵        routePlanSearch.drivingSearch(drivingOptions);//发起驾车检索

其他的路线规划,用法其实差不多,这里就不重复了,应用中也是常用步行路线规划和驾车规划!

下面提供一个程序的源码,效果如下:
POI城市检索效果:

范围检索和周边检索的效果:

公交路线检索的效果:

步行、驾车到深圳大学路线检索的效果:

代码下载网址:
http://download.csdn.net/detail/wenzhi20102321/9738985

更多相关文章

  1. Android(安卓)dumpsys工具分析
  2. Android网络请求框架AsyncHttpClient详解(整理)
  3. Android(安卓)Hook Java
  4. Android(安卓)okHttp 实战(三):okHttp网络请求之Json解析
  5. Android开发指导文档(译)--content provider(一)
  6. Android(安卓)retrofit2+OkHttp3的初尝试
  7. Android(安卓)VideoView 循环播放视频
  8. Android知识体系总结之Android部分之Intent篇
  9. Android(安卓)用户界面---定制组件(Custom Components)(一)

随机推荐

  1. python基础练习--求1+2!+3!+...+20!的和
  2. 绕脑的汉诺塔递归
  3. Django代理模型返回父模型
  4. sqlalchemy的基础使用,sqlalchemy调用外部
  5. 转换器4:手写PHP转Python编译器,语法解析部
  6. Tensorflow:恢复图形和模型,然后在单个图像
  7. 机器学习Python数据特征选定
  8. 在混合的Bash-Python代码片段中,变量的双
  9. python基础(7)--深浅拷贝、函数
  10. Python学习之四sys.argv