可能有些人会出现无法导入overlayutil的错误,这是因为BaiduMap里面的包把这部分删除掉了,并且官方没有给出说明,这个地方以前也是让我折腾了很久。

不知道现在有没有说明这个问题,如果需要这个包,可以下载官方demo,把这个包复制下载粘贴到自己项目里面。

功能如下:

  • 在地图中显示公交路线。
  • 在log中打印公交路线及其信息。
  • 在地图中添加站点点击显示相应信息。(这里使用百度提供的包,在里面的类直接修改)

1.这里是需要把公交的uid检索出来,遍历所有poi,找到类型为公交线路的poi。在公交信息里面需要使用UID

 /**
* 创建POI检索结果监听器 poiSearch
*/
OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult == null
|| poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
Toast.makeText(MainActivity.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();
}
}

2.这里会根据上面的UID来检索公交信息。具体为公交“检索入口”部分

private void searchBusline() {
//公交的站点大于,该路线的长度。
if (buslineIndex >= buslineIdList.size()) {
buslineIndex = 0;
}
//公交站点 小于这个路线的长度
if (buslineIndex >= 0 && buslineIndex < buslineIdList.size()
&& buslineIdList.size() > 0) {
//定义并设置公交信息结果监听者(与POI类似),并发起公交详情检索;
//如下代码为发起检索代码,定义监听者和设置监听器的方法与POI中的类似
//参数city和这个keyword路线的UID
// 公交检索入口
boolean flag = busLineSearch
.searchBusLine((new BusLineSearchOption().city(city)
.uid(buslineIdList.get(buslineIndex))));
//是否成功检索
if (flag) {
//把布局隐藏
linearLayout.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "检索成功~", Toast.LENGTH_LONG)
.show();
} else {
Toast.makeText(MainActivity.this, "检索失败~", Toast.LENGTH_LONG)
.show();
}
buslineIndex++;
}
}

3.这里是公交信息的监听器,里面有回调函数。

BusLineOverlay overlay = new BusLineOverlay(mBaiduMap);

BusLineOverlay是overlayuti 里面的一个类,下文会讲解。

buslineOverlay.setData(busLineResult,MainActivity.this);
要注意这两个信息。setData()方法也是该BusLineOverlay类的一个方法。

/**
* 公交信息查询结果监听器, busLineSearch
*/
OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {
/* 公交信息查询结果回调函数
* 参数:
*result - 公交信息查询结果
*/
@Override
public void onGetBusLineResult(BusLineResult busLineResult) {
if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "未找到结果",
Toast.LENGTH_SHORT).show();
} else {
mBaiduMap.clear();
// 用于显示一条公交详情结果的Overlay
BusLineOverlay overlay = new BusLineOverlay(mBaiduMap);
overlay.setData(busLineResult,MainActivity.this);//设置公交线数据
overlay.addToMap();// 将overlay添加到地图上
overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内
mBaiduMap.setOnMarkerClickListener(overlay);
//传递参数到MyBuslineOverlay,该方法继承自 BusLineOverlay
buslineOverlay.setData(busLineResult,MainActivity.this);
// 公交线路名称
Toast.makeText(MainActivity.this,
busLineResult.getBusLineName(), Toast.LENGTH_SHORT);
Log.d("hello", "名字" + busLineResult.getBusLineName());
Log.d("hello", "首班车" + busLineResult.getStartTime());
Log.d("hello", "末班车" + busLineResult.getEndTime());
Log.d("hello", "分段信息" + busLineResult.getSteps());
// java.util.List<BusLineResult.BusStation> getStations()
// 获取所有公交站点信息
for(int i = 0; i< busLineResult.getStations().size();i++){
Log.d("hello", "公交信息"+ busLineResult.getStations().get(i).getTitle());
}
}
}
};

busLineResult就是查询结果,通过这个对象可以获取公交的所有信息。如下:

05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 名字32路(海事学院-万平口)
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 首班车Thu Jan 01 06:30:00 GMT+08:00 1970
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 末班车Thu Jan 01 18:00:00 GMT+08:00 1970
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 分段信息[com.baidu.mapapi.search.busline.BusLineResult$BusStep@30ee528]
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息海事学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息外国语职业学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息职业技术学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息济宁医学院西门
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息济宁医学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息公交三公司
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息外国语学校
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息大学科技园管委
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息曲师大
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息山体
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息山体南门
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息市气象局
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息市交通局
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息都市花园
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息四季圣园北区
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息四季圣园
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息太阳广场
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息淄博路东口
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息植物园西门
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息植物园
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息城市规划展览馆
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息万平口

这部分代码也会在地图中显示路线信息:如下

4.可是现在没法点击地图中的站点信息显示啊。。。上面说导入的overlayutil包里面有一个

class BusLineOverlay extends OverlayManager 

我们只需要修改里面的一份方法就可以了。该方法里面还有一个 onBusStationClick()方法,站点点击操作只需要在这里面修改。
/**
* 覆写此方法以改变默认点击行为
*
* @param index
* 被点击的站点在
* {@link com.baidu.mapapi.search.busline.BusLineResult#getStations()}
* 中的索引
* @return 是否处理了该点击事件
*/
public boolean onBusStationClick(int index) {
if (mBusLineResult.getStations() != null
&& mBusLineResult.getStations().get(index) != null) {
// 获取 站点位置坐标
//newLatLng(LatLng latLng)设置地图新中心点
MainActivity.mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(mBusLineResult
.getStations().get(index).getLocation())); Toast.makeText(context, mBusLineResult.getStations()
.get(index).getTitle(),Toast.LENGTH_SHORT).show(); }
return false;
}

5.该类还有一个setData()方法,因为我需要context参数用于Toast信息,所以修改了该类的方法,只不过增加了一个参数的传递。

/**
* 设置公交线数据
*
* @param result
* 公交线路结果数据
*/
public void setData(BusLineResult result,Context context) {
this.mBusLineResult = result;
this.context =context; }

这样,点击地图中的站点就会Toast该站点相关信息,并且把点击的站点设置为地图中心。

BaiduMap开发,获取公交站点信息。的更多相关文章

  1. NET Core开发-获取所有注入(DI)服务

    NET Core开发-获取所有注入(DI)服务 获取ASP.NET Core中所有注入(DI)服务,在ASP.NET Core中加入了Dependency Injection依赖注入. 我们在Cont ...

  2. android开发获取网络状态,wifi,wap,2g,3g.工具类(一)

    android开发获取网络状态整理: package com.gzcivil.utils; import android.content.Context; import android.net.Con ...

  3. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  4. 微信js-sdk开发获取签名和获取地理位置接口示例

    ###微信js-sdk开发获取签名和获取地理位置接口示例 前言:在做微信公众号开发时需要获取用户的地理位置信息,之前通过高德或者百度.腾讯等地图的api时发现经常获取不到,毕竟第三方的东西,后来改为采 ...

  5. android笔记---百度地图api应用 (二) 获取公交路线的详细信息

    package com.example.bdtest; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKPlanNode; imp ...

  6. NX二次开发-获取WCS坐标系的原点坐标和矩阵标识

    函数:UF_CSYS_ask_csys_info() 函数说明:获取工作坐标系对象的标识符. 用法: #include <uf.h> #include <uf_csys.h> ...

  7. NX二次开发-获取WCS标识

    函数:UF_CSYS_ask_wcs() 函数说明:获取工作坐标系对象的标识. 用法: 1 #include <uf.h> 2 #include <uf_csys.h> 3 e ...

  8. 使用百度地图api接口获取公交地图路线和车站

    需要在页面文件中引用百度的js @*<script type="text/javascript" src="http://api.map.baidu.com/api ...

  9. iOS 开发获取唯一标识

    在做流量精灵的时候有这样一个需求,帐户默认需要取手机的imsi 信息.这就有一个好处,即便用户删除我们的应用后从新下载,下次进入时他们还会以同样的身份登陆,并且获得原先纪录.这样不仅对于开发公司人员来 ...

随机推荐

  1. Windows Sockets Error Codes

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx Most Windows Sockets ...

  2. Hadoop集群中Hbase的介绍、安装、使用

    导读 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. 一.Hbase ...

  3. Flash Player”又来了“!

    2012年,Adobe宣布缩小对Linux平台的支持,自Flash Player 11.2版本之后,只为Linux平台上的Flash Player提供安全更新和bug修复,而不再提供版本更新. 四年之 ...

  4. [Everyday Mathematics]20150130

    计算下列积分 $$\bex \int_0^\infty \frac{\sin^3x}{x^3}\rd x. \eex$$

  5. 《Python 学习手册4th》 第九章 元组、文件及其他

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  6. Multiple View Geometry in Computer Vision Second Edition by Richard Hartley 读书笔记(二)

    // Chapter 2介绍的是2d下的投影变换,摘录下了以下定理 Result 2.1. The point x lies on the line l if and only if xTl = 0. ...

  7. JDBC获取表的主键

    JDBC获取表的主键 案例,创建订单,并根据订单号向订单明细表插入数据 sql语句: 创建两表 create table orders(  id number(4) primary key,  cus ...

  8. Java内部类this$0字段产生的一个bug

    首先查看下面一段代码,我指出了问题代码的所在,读者先自己思考一下这段代码会有什么问题. 这是用clone方法完整拷贝一个二项堆(BinomialHeap)结构的代码.二项堆中包含一个内部类Binomi ...

  9. C/C++:类模板

    类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型. 类模板的声明形式如下: template ...

  10. 多校6 1003 HDU5795 A Simple Nim (sg函数)

    思路:直接打表找sg函数的值,找规律,没有什么技巧 还想了很久的,把数当二进制看,再类讨二进制中1的个数是必胜或者必败状态.... 打表: // #pragma comment(linker, &qu ...