android百度地图使用(四)

继续我们的百度地图之旅,这篇我将要介绍百度地图中路线规划,逆地理编码的应用,这也是百度地图最后一篇。虽然百度的其他功能自己也用过,但是项目中使用的较少,暂且不谈,因为要把百度地图的所有功能都说一边那是不可能的事。

路径搜索以步行搜索为例。
RoutePlanSearch:路径搜索的关键类,发起不同类型的路线规划
WalkingRoutePlanOption:步行路径规划参数类
OnGetRoutePlanResultListener:路线结果回调

路线规划的执行方法如下:

    public  static  void routPlan(OnGetRoutePlanResultListener listener,RoutePlanSearch mSearch,LatLng stLatLng,LatLng endLatLng){
        //传入开始节点
        PlanNode   stNode = PlanNode.withLocation(stLatLng);
        //传入结束节点
        PlanNode  enNode = PlanNode.withLocation(endLatLng);
        //获取搜索实例
        mSearch = RoutePlanSearch.newInstance();
        //注册监听回调
        mSearch.setOnGetRoutePlanResultListener(listener);
        //执行步行路线检索
        mSearch.walkingSearch((new WalkingRoutePlanOption())
                .from(stNode)
                .to(enNode));
    }

路线回调之后就将路线显示到地图上,路线回调的时候要分清这几件事,第一路线规划回调的不只是一条路线,第二,路线规划要在地图上显示要利用overlay,本质上就是路线规划回多个位置点,然后在每个点上添加overlay,路线其实就是overlay的集合。

OverlayManager:这个是官方demo封装的overlay管理的基类,这个类中有overlay添加到地图,移除地图,将overlay显示到可视范围内的方法。

 /**
     * 缩放地图,使所有Overlay都在合适的视野
     * 注: 该方法只对Marker类型的overlay有效
     * 
     */
    public void zoomToSpan() {
        if (mBaiduMap == null) {
            return;
        }
        if (mOverlayList.size() > 0) {
            LatLngBounds.Builder builder = new LatLngBounds.Builder();
            for (Overlay overlay : mOverlayList) {
                // polyline 中的点可能太多,只按marker 缩放
                if (overlay instanceof Marker) {
                    builder.include(((Marker) overlay).getPosition());
                }
            }
            mBaiduMap.setMapStatus(MapStatusUpdateFactory
                    .newLatLngBounds(builder.build()));
        }
    }

因为这个方法只对marker类型的overlay有效,所以也说明了路线本质上是一系列的marker点。
WalkingRouteOverlay:这个类继承了OverlayManager是填充数据的类,实现了OverlayManager抽象出getOverlayOptions()方法,这个方法在调用OverlayManager的addToMap()方法时将获取到的OverlayOptions进行了遍历。

  if (result.error == SearchResult.ERRORNO.NO_ERROR) {
            route = result.getRouteLines().get(0);
            overlay = new MyWalkingRouteOverlay(baiduMap);
            overlay.setLineColor(Color.argb(178, 0, 78, 255));
            overlay.setIsAddIcon(true);
            overlay.setData(result.getRouteLines().get(0));
            overlay.addToMap();
            overlay.zoomToSpan();
        }

在路线回调里添加这个方法就可以实现将路线添加到地图上,百度地图支持将多条路线在地图上共同显示,只需要多调用几次获取实例的方法就可以了,还有在获取实例的时候尽量不要放到activity的oncreate()方法里,放在地图加载完成之后,这样更安全些。

逆地理编码
GeoCoder:地理编码查询接口
GeoCodeOption:地理编码请求
ReverseGeoCodeOption:反地理编码请求
OnGetGeoCoderResultListener:请求结果回调

第一步:

//获取地理编码查询实例
 GeoCoder geoCoder = GeoCoder.newInstance();
//设置回调监听
 geoCoder.setOnGetGeoCodeResultListener(this);

第二步:

     LatLng center = mapStatus.bound.getCenter();
        // 反Geo搜索
        geoCoder.reverseGeoCode(new ReverseGeoCodeOption()
                .location(center))

第三步:

//地理信息转化为坐标的回调
 @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
    }
    //坐标转化为位置信息的回调
    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
        finalLng = result.getLocation().longitude;
        finalLat = result.getLocation().latitude;
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            showshortToast("抱歉,未能找到结果");
            return;
        }
        mtv_pointName.setText(result.getAddress());
    }

计算两个经纬度的距离:

//计算p1、p2两点之间的直线距离,单位:米  
DistanceUtil. getDistance(p1, p2);

以上就包含了一般项目中常用的操作了,至于百度导航,我认为很少应用会用到,建议使用定位的跟随模式+路线规划实现。这只是建议,根据需求选择自己适合的功能集成就好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值