zoukankan      html  css  js  c++  java
  • Android百度地图开发05之公交信息检索 + 路线规划

    在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索线路规划的内容。

    公交信息检索

        实际上,公交信息检索与POI检索、在线建议检索非常相似,也是把你需要检索的信息发送给百度地图服务器,然后解析得到的结果。

        一般步骤:

        1. 设置检索参数

        2. 添加检索结果监听器

        3. 发起检索

        4. 解析返回结果

        打开程序包com.baidu.mapapi.search.busline    


        在BusLineSearchOption这个类中,我们看到一个参数是城市,另一个是公家路线uid。

    一开始,我以为第二个参数是公交线号,代码编写完毕去查询的时候,总是出错。后来仔细查看了api之后,发现不是公交线号,而是uid。uid我们在之前poi检索的时候,曾经见到过,它实际上即是一个id,是i一个唯一标识。

    所以注意:公交信息检索设置查询参数时,第二个参数是uid

        所以进行公交信息检索之前,需要先进行POI检索。使用searchInCity()方法在每一个城市内查询公交路线号:

    1. city = cityEt.getText().toString();  
    2.             busline = buslineEt.getText().toString();  
    3.             poiSearch.searchInCity((new PoiCitySearchOption()).city(city)  
    4.                     .keyword(busline));  

        得到poi检索的结果时,在PoiResult类中有通过getAllPoi()获取poi检索结果。

    1. @Override  
    2.         public void onGetPoiResult(PoiResult poiResult) {  
    3.             if (poiResult == null  
    4.                     || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果  
    5.                 Toast.makeText(BusLineSearchActivity.this, "未找到结果",  
    6.                         Toast.LENGTH_LONG).show();  
    7.                 return;  
    8.             }  
    9.   
    10.             if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回  
    11.                 // 得到检索结果  
    12.                   
    13.             }  
    14.         }  

        此时如果直接取出PoiInfo中的uid的话,你会发现很多个。但是,我们都知道,一个公交线号最多有两个线路(正向和反向)。所以我们需要筛选出是公交路线的uid。

        在PoiInfo类中有个type字段:0:普通点、1:、公交站 2:、 公交路线 3:、地铁站 4:地铁线路

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

        通过判断type,将正确的uid添加到一个list中。
        得到了uid,就可以结合城市参数,进行公交线路检索了。

    1. private void searchBusline() {  
    2.         if (buslineIndex >= buslineIdList.size()) {  
    3.             buslineIndex = 0;  
    4.         }  
    5.         if (buslineIndex >= 0 && buslineIndex < buslineIdList.size()  
    6.                 && buslineIdList.size() > 0) {  
    7.             boolean flag = busLineSearch  
    8.                     .searchBusLine((new BusLineSearchOption().city(city)  
    9.                             .uid(buslineIdList.get(buslineIndex))));  
    10.             if (flag) {  
    11.                 Toast.makeText(BusLineSearchActivity.this, "检索成功~", 1000)  
    12.                         .show();  
    13.             } else {  
    14.                 Toast.makeText(BusLineSearchActivity.this, "检索失败~", 1000)  
    15.                         .show();  
    16.             }  
    17.             buslineIndex++;  
    18.         }  
    19.     }  
    1. /** 
    2.      * 公交信息查询结果监听器 
    3.      */  
    4.     OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {  
    5.   
    6.         @Override  
    7.         public void onGetBusLineResult(BusLineResult busLineResult) {  
    8.             if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {  
    9.                 Toast.makeText(BusLineSearchActivity.this, "抱歉,未找到结果",  
    10.                         Toast.LENGTH_SHORT).show();  
    11.             } else {  
    12.                 bdMap.clear();  
    13.                 BusLineOverlay overlay = new MyBuslineOverlay(bdMap);// 用于显示一条公交详情结果的Overlay  
    14.                 overlay.setData(busLineResult);  
    15.                 overlay.addToMap();// 将overlay添加到地图上  
    16.                 overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内  
    17.                 bdMap.setOnMarkerClickListener(overlay);  
    18.                 // 公交线路名称  
    19.                 Toast.makeText(BusLineSearchActivity.this,  
    20.                         busLineResult.getBusLineName(), Toast.LENGTH_SHORT)  
    21.                         .show();  
    22.             }  
    23.         }  
    24.     };  

        BusLineResult用来存储查询得到的结果,它又两个内部类和几个普通函数:

        我们可以通过这两个内部类,得到自己想要的信息,这里就不在代码里写了。

        我们依旧通过使用overlayutil包下的相关类(BusLineOverlay)添加覆盖物到地图上。

    1. class MyBuslineOverlay extends BusLineOverlay {  
    2.         public MyBuslineOverlay(BaiduMap arg0) {  
    3.             super(arg0);  
    4.         }  
    5.         /** 
    6.          * 站点点击事件 
    7.          */  
    8.         @Override  
    9.         public boolean onBusStationClick(int arg0) {  
    10.             MarkerOptions options = (MarkerOptions) getOverlayOptions().get(arg0);  
    11.             bdMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition()));  
    12.             return true;  
    13.         }  
    14.     }  


    路线规划

        路线规划分为三种:驾车、换成(公交)、步行。而路线规划又与之前的各种检索相似。

     路线规划先关类都在此包结构下。


        我将这个包下面的类做了一下标注,这样就很清楚了,三种路线规划方式就相当于一个poi检索,只有参数设置的时候需要注意下。


        路线规划里有策略这一概念。那驾车路线规划说,就包括四种策略:躲避拥堵、最短距离、较少费用、时间优先,这四种策略组成了一个枚举类型:DrivingRoutePlanOption.DrivingPolicy。


        设置点的时候,传入的参数是PlanNode类型的。该类有两个静态的方法,一个通过设置城市名和地名,一个通过设置经纬度,都可以返回一个PlanNode对象。

        OK,到此为止,路线规划已经没有任何难处了,下面只贴出驾车路线规划的代码,其余的可以下载demo查看。

    1. DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();  
    2.         drivingOption.policy(DrivingPolicy.values()[drivingSpinner  
    3.                 .getSelectedItemPosition()]);// 设置驾车路线策略  
    4.         drivingOption.from(PlanNode.withCityNameAndPlaceName("北京", startPlace));// 设置起点  
    5.         drivingOption.to(PlanNode.withCityNameAndPlaceName("北京", endPlace));// 设置终点  
    6.         routePlanSearch.drivingSearch(drivingOption);// 发起驾车路线规划  
    1. /** 
    2.          * 驾车路线结果回调 查询的结果可能包括多条驾车路线方案 
    3.          */  
    4.         @Override  
    5.         public void onGetDrivingRouteResult(  
    6.                 DrivingRouteResult drivingRouteResult) {  
    7.             bdMap.clear();  
    8.             if (drivingRouteResult == null  
    9.                     || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {  
    10.                 Toast.makeText(RoutePlanningActivity.this, "抱歉,未找到结果",  
    11.                         Toast.LENGTH_SHORT).show();  
    12.             }  
    13.             if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {  
    14.                 // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息  
    15.                 // drivingRouteResult.getSuggestAddrInfo()  
    16.                 return;  
    17.             }  
    18.             if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {  
    19.                 DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(  
    20.                         bdMap);  
    21.                 drivingRouteOverlay.setData(drivingRouteResult.getRouteLines()  
    22.                         .get(drivintResultIndex));// 设置一条驾车路线方案  
    23.                 bdMap.setOnMarkerClickListener(drivingRouteOverlay);  
    24.                 drivingRouteOverlay.addToMap();  
    25.                 drivingRouteOverlay.zoomToSpan();  
    26.                 totalLine = drivingRouteResult.getRouteLines().size();  
    27.                 Toast.makeText(RoutePlanningActivity.this,  
    28.                         "共查询出" + totalLine + "条符合条件的线路", 1000).show();  
    29.                 if (totalLine > 1) {  
    30.                     nextLineBtn.setEnabled(true);  
    31.                 }  
    32.                 // 通过getTaxiInfo()可以得到很多关于打车的信息  
    33.                 Toast.makeText(  
    34.                         RoutePlanningActivity.this,  
    35.                         "该路线打车总路程"  
    36.                                 + drivingRouteResult.getTaxiInfo()  
    37.                                         .getDistance(), 1000).show();  
    38.             }  
    39.         }  
    40.     };  


    下载

        demo下载地址~~~

  • 相关阅读:
    linux 操作系统/xxx目录下都是什么文件?
    Linux /bin, /sbin, /usr/bin, /usr/sbin 区别
    java初学
    虚拟机联网及远程连接-Linux基础环境命令学习笔记
    Linux 文件操作命令-Linux基础环境命令学习笔记
    Linux 权限、磁盘操作命令-Linux基础环境命令学习笔记
    Linux shell编程命令-Linux基础环境命令学习笔记
    C程序编译执行过程
    刨根问底:什么是yum源,yum的工作原理又是什么
    网关人性化详解
  • 原文地址:https://www.cnblogs.com/kluan/p/4828211.html
Copyright © 2011-2022 走看看