PS:装了个deepin,感觉真的很高大上.
学习内容:
1.公交信息检索
2.路线规划
关于百度地图的开发也就这么多了.重要的部分也就那么些.原本打算搞到poi搜索就算了,不过看到了这两个方面还是忍不住去涉猎一下.其实实现的模式和poi搜索没有什么太多的区别.只要将数据信息发送给百度地图的服务器,我们对服务器的返回数据进行处理就可以了.
1.公交信息检索
公交信息检索,顾名思义就是搜索大巴和地铁.实现的过程和poi搜索没什么两样,一般都是现实例化对象,然后设置检索的参数和检索数据的监听.设置完这两个东西后,开始发出检索请求.然后等待服务器段处理完数据信息之后,我们客户端对数据信息进行处理就可以了.(com.baidu.mapapi.search.busline)
通过使用上面的api就可以实现公交信息检索.
还有一点就是公交路线查询也是基于Poi搜索的.当我们完成了Poi搜索之后,才能够实现公交路线的搜索.实现Poi搜索就非常的简单了,这里就不进行细说了.只是说一下Poi结果查询之后回调函数的一些细节.
OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult == null
|| poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
Toast.makeText(BusLineSearchActivity.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();
}
} @Override
public void onGetPoiDetailResult(PoiDetailResult arg0) { }
};
回调函数返回的结果会有各种各样的poi,因此我们需要将这些poi进行遍历,从而查找出我们想要的公交站点.因此这里使用了一个判断条件去保存这些公交信息.这个就是来完成判断的过程.完成了这些后,就可以对公交线路进行相关查询了.
if (poi.type == PoiInfo.POITYPE.BUS_LINE || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
buslineIdList.add(poi.uid);
}
首先是实例化对象.和poi搜索如出一辙,都是使用newInstance()去实例化对象.那么BusLineSearch通过实例化对象去完成公交信息的检索.通过向服务端发送请求,然后获取数据信息就可以了.
busLineSearch = BusLineSearch.newInstance();
然后就是绑定监听事件.当服务器对数据处理完毕之后,作为回调函数,将处理完的数据信息返回给客户端.然后客户端对数据信息进行相关处理.从而获取服务端想要的数据信息.
OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {
@Override
public void onGetBusLineResult(BusLineResult busLineResult) { if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(BusLineSearchActivity.this, "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
} else {
bdMap.clear();
BusLineOverlay overlay = new MyBuslineOverlay(bdMap);// 用于显示一条公交详情结果的Overlay
overlay.setData(busLineResult);
overlay.addToMap();// 将overlay添加到地图上
overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内
bdMap.setOnMarkerClickListener(overlay);
// 公交线路名称
Toast.makeText(BusLineSearchActivity.this,
busLineResult.getBusLineName(), Toast.LENGTH_SHORT)
.show();
}
}
};
监听的设置非常的简单.BusLineResult作为回调函数的参数.然后我们可以获取到公交线路站点信息.同时我们还可以对这些站点信息进行处理.设置站点的监听事件.站点的数据信息获取展示在Map上也是通过Overlay去实现的.我们只需要调用Overlay内部的函数,就可以把所有获取到的结果展示在Map上.
class MyBuslineOverlay extends BusLineOverlay { public MyBuslineOverlay(BaiduMap arg0) {
super(arg0);
}
/**
* 站点点击事件
*/
@Override
public boolean onBusStationClick(int arg0) {
//
MarkerOptions options = (MarkerOptions) getOverlayOptions().get(arg0); //获取被点击的Marker
bdMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition())); //更新地图上的数据信息.
return true;
}
}
同时我们最后配置上查询的相关参数,然后发送请求就可以完成信息的查询了.参数的配置则是通过BusLineSearchOptions去完成配置.公交信息查询的参数则需要配置两个属性.一个是城市参数.一个则是uid.这里的uid表示的是一个标示符(唯一).不是表示公交站点的车号.这点我们需要注意.以下则是通过传递完参数之后进行信息的查询.
busLineSearch.searchBusLine((new BusLineSearchOption().city(city).uid(buslineIdList.get(buslineIndex))));
2.路线规划
路线规划则是根据指定路线,然后设置出最佳路线提供给用户,使得用户能够以最快的时间从出发地到达目的地,路线规划分成三种规划.驾车,换乘,步行三种方式的规划.
规划同时包含了四种策略:躲避拥堵,最短距离,较少费用,时间优先这四大策略.四种策略以枚举的形式被封装起来.这样我们就可以直接在路线规划当中设置策略.然后发送请求.百度地图服务器会根据我们设置的策略进行相应的处理.
驾车路线查询实现
/**
* 驾车线路查询 下拉菜单的四个属性:躲避拥堵,最短距离,较少费用,时间优先
*/
private void drivingSearch(int index) {
DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();
drivingOption.policy(DrivingPolicy.values()[drivingSpinner.getSelectedItemPosition()]);// 设置驾车路线策略.使用了一个下拉菜单去获取四种策略的一种.
drivingOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));// 设置起点
drivingOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));// 设置终点
routePlanSearch.drivingSearch(drivingOption);// 发起驾车路线规划
}
简单的说一下内部的函数: from(PlanNode from)设置起始点函数. passBy(java.util.List<PlanNode>wayPoints)设置途经点函数
policy(DrivingRoutePlanOption.DrivingPolicy policy)设置驾车路线规划策略. to(PlanNode to)要到达的位置
设置起始点,经过点,终点的时候需要传递PlanNode对象.实例化PlanNode对象的时候,一种方式是通过传递城市和地名去实例化.另一种方式则是通过设置经纬度的方式去实例化对象.
换乘路线查询实现
换乘路线其实一般指的就是地铁或者是大巴.这些东西途径时需要实现换乘.
/**
* 换乘路线查询
*/
private void transitSearch(int index) {
TransitRoutePlanOption transitOption = new TransitRoutePlanOption();
transitOption.city("淄博");// 设置换乘路线规划城市,起终点中的城市将会被忽略
transitOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));
transitOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));
transitOption.policy(TransitPolicy.values()[transitSpinner.getSelectedItemPosition()]);// 设置换乘策略
routePlanSearch.transitSearch(transitOption);
}
步行路线查询实现:
/**
* 步行路线查询
*/
private void walkSearch() {
WalkingRoutePlanOption walkOption = new WalkingRoutePlanOption();
walkOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));
walkOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));
routePlanSearch.walkingSearch(walkOption);
}
设置的方式其实都特别的简单,设置完相关方式之后需要设置相关的监听事件用于回调.内部的具体实现过程我就不去实现了,在最后我会再提供一个demo下载.大家可以下载下来进行相关的研究.
/**
* 路线规划结果回调
*/
OnGetRoutePlanResultListener routePlanResultListener = new OnGetRoutePlanResultListener() { /**
* 步行路线结果回调
*/
@Override
public void onGetWalkingRouteResult(
WalkingRouteResult walkingRouteResult) { } /**
* 换成路线结果回调
*/
@Override
public void onGetTransitRouteResult(
TransitRouteResult transitRouteResult) { } /**
* 驾车路线结果回调 查询的结果可能包括多条驾车路线方案
*/
@Override
public void onGetDrivingRouteResult(
DrivingRouteResult drivingRouteResult) { }
};
最后就是实例化对象,然后发送请求就可以了,服务端处理完数据信息之后,通过回调就可以把数据回传了.
最后放一个demo:http://files.cnblogs.com/files/RGogoing/BDMap_1.rar