可能有些人会出现无法导入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. hdu 4607 Park Visit(树上最长链)

    求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...

  2. [反汇编练习] 160个CrackMe之008

    [反汇编练习] 160个CrackMe之008. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  3. C语言中strcpy(char *strDest, const char *strScr)字符串复制库函数的理解与分析

    1.原版的strcpy()函数原型 char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) &am ...

  4. zoj 1842 Prime Distance

    // 数论题,增强的筛法,回想素数筛法 // 只要筛到最大数的开方,剩下的就是素数 // 于是这里,开一个 sqrt(2^31) 大约 65536 的素数表,然后 // 对于每个 L~U 的区间,筛掉 ...

  5. 编译boost (windows msvc14)

    我的环境 OS: WIN10 (x64) IDE: VS2015 (VC14) http://www.boost.org/ 1. 下载 下载boost包, boost_1_62_0.7z 使用ASIO ...

  6. Linux如何统计进程的CPU利用率

    1.0 概述 在Linux的/proc文件系统,可以看到自启动时候开始,所有CPU消耗的时间片:对于个进程,也可以看到进程消耗的时间片.这是一个累计值,可以"非阻塞"的输出.获得一 ...

  7. spoj 694(后缀数组)

    题意:求一个字符串的不重复子串的个数. 分析:对于下标为i的位置,能够产生的前缀子串个数为len-i(下标从0开始),对于与它字典序相邻的后缀产生的子串是重复的(就是他们的最长公共前缀),所以我们要减 ...

  8. Android之APK文件签名——keytool和jarsigner

    一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行:keytool -genkey -alias ChangeBackgroundWidget.keystore -keyalg RSA - ...

  9. 联通光纤上网配置+华为HG8240光猫+TL-WR842N

    最近搬家改用北京联通宽带,光纤入户的那种.联通送的光猫是华为HG8240,没看到天线,应该是不带无线路由.然后自己再买了个TP-Link的TL-WR842N,用来组局域网,也供ipad.kindle. ...

  10. Myeclipse8.5 svn插件安装两种方式

    第一种方式:(亲测成功)第一步:准备插件包:site-1.6.18.zip解压该包里面有features和plugins文件夹,删除该包里面的xml结尾的文件. 第二:我的Myeclipse8.5安装 ...