BaiduMap开发,获取公交站点信息。
可能有些人会出现无法导入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该站点相关信息,并且把点击的站点设置为地图中心。