在上一篇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. if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
  10. // 得到检索结果
  11. }
  12. }

此时如果直接取出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. @Override
  6. public void onGetBusLineResult(BusLineResult busLineResult) {
  7. if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
  8. Toast.makeText(BusLineSearchActivity.this, "抱歉,未找到结果",
  9. Toast.LENGTH_SHORT).show();
  10. } else {
  11. bdMap.clear();
  12. BusLineOverlay overlay = new MyBuslineOverlay(bdMap);// 用于显示一条公交详情结果的Overlay
  13. overlay.setData(busLineResult);
  14. overlay.addToMap();// 将overlay添加到地图上
  15. overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内
  16. bdMap.setOnMarkerClickListener(overlay);
  17. // 公交线路名称
  18. Toast.makeText(BusLineSearchActivity.this,
  19. busLineResult.getBusLineName(), Toast.LENGTH_SHORT)
  20. .show();
  21. }
  22. }
  23. };

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下载地址~~~

Android百度地图开发05之公交信息检索 + 路线规划的更多相关文章

  1. Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

      标签: Android百度地图API Key  分类: Android 百度地图开发(2)    最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地 ...

  2. android 百度地图开发实例(转载)

    因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...

  3. [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

    一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...

  4. Android 百度地图开发之一(Hello BaiDu Map)

    之前也接触过百度地图的开发,但那是在网上找的案例或代码,而且是比较老的版本.打算重新学习一下百度地图的开发. 本次使用的百度地图的版本是 Android SDK v3.0.0 本篇文章主要讲述百度地图 ...

  5. [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

        近期做android百度地图,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--仅仅显示网格而没有显示地图,网 ...

  6. android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索

    最近跟着百度地图API学地图开发,先是学了路径搜索,对于已知坐标的两点进行驾车.公交.步行三种路径的搜索(公交路径运行没效果,待学习中),后来又 学了定位功能,能够获取到自己所在位置的经纬度,但当将两 ...

  7. Android百度地图开发(一)环境搭建

    1.百度地图官方API文档下载 版本 使用说明 下载 Android SDK 通用资源下载 <离线地图>提供新版离线地图(百度矢量地图)与旧版离线地图(百度栅格地图)下载. 备注: 自An ...

  8. Android百度地图附加搜索和公交路线方案搜索

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 综述: 今 ...

  9. Android百度地图开发(一)之初体验

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/42614603 做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需 ...

随机推荐

  1. java rest框架jersey数组单记录问题解决

    JAVA数据接口采用jersey技术,可以返回xml,json等格式,可以根据客户端请求accept,如:Application/json,Application/xml 来得到不同的接口数据,非常好 ...

  2. 软件工程随堂小作业——寻找“水桶”(C++)

    一.设计思想 思路与寻找一个水王相似,这次只是计数器和嫌疑人变量都设置为数组.每次选取一个ID与三个嫌疑人比较,若有相同则计数:若三个都不相同,则三个计数器都减一.若减为0,则从新赋值给嫌疑人. 二. ...

  3. 前端之JavaScript第三天学习(7)-JavaScript-数据类型

    字符串.数字.布尔.数组.对象.Null.Undefined JavaScript 拥有动态类型 JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: 实例 var x      ...

  4. 使用WatchService监控指定目录内的文件的改动

    package coin; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Pat ...

  5. shell 进程查询相关的命令

    同一个进程部署多个,如何知道删除哪个: ll /proc/ 会显示位置 查看pid下哪些socket链接 ll /proc//fd

  6. Linux - 常用命令行(一)

    今天和大家分享一些最基本常用命令行:也是作为新手最应该了解掌握的 ls 命令:用来显示指定工作目录下内容 dir命令:与ls命令一致 cd  命令:变化工作目录 pwd命令:显示用户当前的工作路径,显 ...

  7. hdu 3046 Pleasant sheep and big big wolf 最小割

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046 In ZJNU, there is a well-known prairie. And it a ...

  8. Spring Mail

    想必大家在今天这个特殊的日子里,一定热血沸腾了一把.为上午的阅兵点70个赞! 进入Spring Mail的主题: 前后大概花了8个小时的时间来研究Spring封装的javaMail.本来觉得挺简单的应 ...

  9. Leetcode#147 Insertion Sort List

    原题地址 心得:有关链表的题目,多用中间变量,代码写得清晰一点,适当注释 代码: ListNode *insertionSortList(ListNode *head) { if (!head) re ...

  10. KIP-32 Add timestamps to Kafka message

    通过KIP32,Kafka的每条消息都加进了时间戳,这个KIP在0.10.0.0被加入. 说到“时间”,先贴张图,娱乐一下(如果对星球大战系列电影不熟的话,请自动略过……) 这个KIP的文档在 KIP ...