Android学习笔记之使用百度地图实现路线规划+公交信息检索

PS:装了个deepin,感觉真的很高大上.

学习内容:

1.公交信息检索

2.路线规划

  关于百度地图的开发也就这么多了.重要的部分也就那么些.原本打算搞到poi搜索就算了,不过看到了这两个方面还是忍不住去涉猎一下.其实实现的模式和poi搜索没有什么太多的区别.只要将数据信息发送给百度地图的服务器,我们对服务器的返回数据进行处理就可以了.

1.公交信息检索

  公交信息检索,顾名思义就是搜索大巴和地铁.实现的过程和poi搜索没什么两样,一般都是现实例化对象,然后设置检索的参数和检索数据的监听.设置完这两个东西后,开始发出检索请求.然后等待服务器段处理完数据信息之后,我们客户端对数据信息进行处理就可以了.(com.baidu.mapapi.search.busline)

  通过使用上面的api就可以实现公交信息检索.

  还有一点就是公交路线查询也是基于Poi搜索的.当我们完成了Poi搜索之后,才能够实现公交路线的搜索.实现Poi搜索就非常的简单了,这里就不进行细说了.只是说一下Poi结果查询之后回调函数的一些细节.

OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() {
        @Override
        public void onGetPoiResult(PoiResult poiResult) {
            if (poiResult == null
                    || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
                Toast.makeText(BusLineSearchActivity.this, "未找到结果",
                        Toast.LENGTH_LONG).show();
                return;
            }

            if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
                // 遍历所有poi,找到类型为公交线路的poi
                buslineIdList.clear();
                for (PoiInfo poi : poiResult.getAllPoi()) {
                    if (poi.type == PoiInfo.POITYPE.BUS_LINE
                            || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
                        buslineIdList.add(poi.uid);
                    }
                }
                searchBusline();
            }
        }

        @Override
        public void onGetPoiDetailResult(PoiDetailResult arg0) {

        }
    };

   回调函数返回的结果会有各种各样的poi,因此我们需要将这些poi进行遍历,从而查找出我们想要的公交站点.因此这里使用了一个判断条件去保存这些公交信息.这个就是来完成判断的过程.完成了这些后,就可以对公交线路进行相关查询了.

  if (poi.type == PoiInfo.POITYPE.BUS_LINE || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
        buslineIdList.add(poi.uid);
  }

  首先是实例化对象.和poi搜索如出一辙,都是使用newInstance()去实例化对象.那么BusLineSearch通过实例化对象去完成公交信息的检索.通过向服务端发送请求,然后获取数据信息就可以了.

busLineSearch = BusLineSearch.newInstance();

  然后就是绑定监听事件.当服务器对数据处理完毕之后,作为回调函数,将处理完的数据信息返回给客户端.然后客户端对数据信息进行相关处理.从而获取服务端想要的数据信息.

OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {
        @Override
        public void onGetBusLineResult(BusLineResult busLineResult) {

            if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(BusLineSearchActivity.this, "抱歉,未找到结果",
                        Toast.LENGTH_SHORT).show();
            } else {
                bdMap.clear();
                BusLineOverlay overlay = new MyBuslineOverlay(bdMap);// 用于显示一条公交详情结果的Overlay
                overlay.setData(busLineResult);
                overlay.addToMap();// 将overlay添加到地图上
                overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内
                bdMap.setOnMarkerClickListener(overlay);
                // 公交线路名称
                Toast.makeText(BusLineSearchActivity.this,
                        busLineResult.getBusLineName(), Toast.LENGTH_SHORT)
                        .show();
            }
        }
    };

  监听的设置非常的简单.BusLineResult作为回调函数的参数.然后我们可以获取到公交线路站点信息.同时我们还可以对这些站点信息进行处理.设置站点的监听事件.站点的数据信息获取展示在Map上也是通过Overlay去实现的.我们只需要调用Overlay内部的函数,就可以把所有获取到的结果展示在Map上.

class MyBuslineOverlay extends BusLineOverlay {

        public MyBuslineOverlay(BaiduMap arg0) {
            super(arg0);
        }
        /**
         * 站点点击事件
         */
        @Override
        public boolean onBusStationClick(int arg0) {
            //
            MarkerOptions options = (MarkerOptions) getOverlayOptions().get(arg0);  //获取被点击的Marker
            bdMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition()));  //更新地图上的数据信息.
            return true;
        }
    }

  同时我们最后配置上查询的相关参数,然后发送请求就可以完成信息的查询了.参数的配置则是通过BusLineSearchOptions去完成配置.公交信息查询的参数则需要配置两个属性.一个是城市参数.一个则是uid.这里的uid表示的是一个标示符(唯一).不是表示公交站点的车号.这点我们需要注意.以下则是通过传递完参数之后进行信息的查询.

busLineSearch.searchBusLine((new BusLineSearchOption().city(city).uid(buslineIdList.get(buslineIndex))));  

2.路线规划

  路线规划则是根据指定路线,然后设置出最佳路线提供给用户,使得用户能够以最快的时间从出发地到达目的地,路线规划分成三种规划.驾车,换乘,步行三种方式的规划.

  规划同时包含了四种策略:躲避拥堵,最短距离,较少费用,时间优先这四大策略.四种策略以枚举的形式被封装起来.这样我们就可以直接在路线规划当中设置策略.然后发送请求.百度地图服务器会根据我们设置的策略进行相应的处理.

  驾车路线查询实现

   /**
     * 驾车线路查询 下拉菜单的四个属性:躲避拥堵,最短距离,较少费用,时间优先
     */
    private void drivingSearch(int index) {
        DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();
        drivingOption.policy(DrivingPolicy.values()[drivingSpinner.getSelectedItemPosition()]);// 设置驾车路线策略.使用了一个下拉菜单去获取四种策略的一种.
        drivingOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));// 设置起点
        drivingOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));// 设置终点
        routePlanSearch.drivingSearch(drivingOption);// 发起驾车路线规划
    }

  简单的说一下内部的函数: from(PlanNode from)设置起始点函数. passBy(java.util.List<PlanNode>wayPoints)设置途经点函数  

  policy(DrivingRoutePlanOption.DrivingPolicy policy)设置驾车路线规划策略. to(PlanNode to)要到达的位置

  设置起始点,经过点,终点的时候需要传递PlanNode对象.实例化PlanNode对象的时候,一种方式是通过传递城市和地名去实例化.另一种方式则是通过设置经纬度的方式去实例化对象.

  换乘路线查询实现

  换乘路线其实一般指的就是地铁或者是大巴.这些东西途径时需要实现换乘.

   /**
     * 换乘路线查询
     */
    private void transitSearch(int index) {
        TransitRoutePlanOption transitOption = new TransitRoutePlanOption();
        transitOption.city("淄博");// 设置换乘路线规划城市,起终点中的城市将会被忽略
        transitOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));
        transitOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));
        transitOption.policy(TransitPolicy.values()[transitSpinner.getSelectedItemPosition()]);// 设置换乘策略
        routePlanSearch.transitSearch(transitOption);
    }

    步行路线查询实现:

   /**
     * 步行路线查询
     */
    private void walkSearch() {
        WalkingRoutePlanOption walkOption = new WalkingRoutePlanOption();
        walkOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));
        walkOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));
        routePlanSearch.walkingSearch(walkOption);
    }

    设置的方式其实都特别的简单,设置完相关方式之后需要设置相关的监听事件用于回调.内部的具体实现过程我就不去实现了,在最后我会再提供一个demo下载.大家可以下载下来进行相关的研究.

    /**
     * 路线规划结果回调
     */
    OnGetRoutePlanResultListener routePlanResultListener = new OnGetRoutePlanResultListener() {

        /**
         * 步行路线结果回调
         */
        @Override
        public void onGetWalkingRouteResult(
                WalkingRouteResult walkingRouteResult) {
            
        }

        /**
         * 换成路线结果回调
         */
        @Override
        public void onGetTransitRouteResult(
                TransitRouteResult transitRouteResult) {
            
        }

        /**
         * 驾车路线结果回调 查询的结果可能包括多条驾车路线方案
         */
        @Override
        public void onGetDrivingRouteResult(
                DrivingRouteResult drivingRouteResult) {
        
        }
    };

   最后就是实例化对象,然后发送请求就可以了,服务端处理完数据信息之后,通过回调就可以把数据回传了.

  最后放一个demo:http://files.cnblogs.com/files/RGogoing/BDMap_1.rar

 

原文地址:https://www.cnblogs.com/RGogoing/p/5043222.html