百度地图Android 路线规划监听事件,Android学习笔记之使用百度地图实现路线规划+公交信息检索...

PS:装了个deepin,感觉真的很高大上.

学习内容:

1.公交信息检索

2.路线规划

关于百度地图的开发也就这么多了.重要的部分也就那么些.原本打算搞到poi搜索就算了,不过看到了这两个方面还是忍不住去涉猎一下.其实实现的模式和poi搜索没有什么太多的区别.只要将数据信息发送给百度地图的服务器,我们对服务器的返回数据进行处理就可以了.

1.公交信息检索

公交信息检索,顾名思义就是搜索大巴和地铁.实现的过程和poi搜索没什么两样,一般都是现实例化对象,然后设置检索的参数和检索数据的监听.设置完这两个东西后,开始发出检索请求.然后等待服务器段处理完数据信息之后,我们客户端对数据信息进行处理就可以了.(com.baidu.mapapi.search.busline)

通过使用上面的api就可以实现公交信息检索.

还有一点就是公交路线查询也是基于Poi搜索的.当我们完成了Poi搜索之后,才能够实现公交路线的搜索.实现Poi搜索就非常的简单了,这里就不进行细说了.只是说一下Poi结果查询之后回调函数的一些细节.

OnGetPoiSearchResultListener poiSearchResultListener = newOnGetPoiSearchResultListener() {

@Overridepublic voidonGetPoiResult(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();

}

}

@Overridepublic voidonGetPoiDetailResult(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 = newOnGetBusLineSearchResultListener() {

@Overridepublic voidonGetBusLineResult(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 extendsBusLineOverlay {publicMyBuslineOverlay(BaiduMap arg0) {super(arg0);

}/*** 站点点击事件*/@Overridepublic boolean onBusStationClick(intarg0) {// 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(intindex) {

DrivingRoutePlanOption drivingOption= newDrivingRoutePlanOption();

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.ListwayPoints)设置途经点函数

policy(DrivingRoutePlanOption.DrivingPolicy policy)设置驾车路线规划策略. to(PlanNode to)要到达的位置

设置起始点,经过点,终点的时候需要传递PlanNode对象.实例化PlanNode对象的时候,一种方式是通过传递城市和地名去实例化.另一种方式则是通过设置经纬度的方式去实例化对象.

换乘路线查询实现

换乘路线其实一般指的就是地铁或者是大巴.这些东西途径时需要实现换乘.

/*** 换乘路线查询*/

private void transitSearch(intindex) {

TransitRoutePlanOption transitOption= newTransitRoutePlanOption();

transitOption.city("淄博");//设置换乘路线规划城市,起终点中的城市将会被忽略

transitOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));

transitOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));

transitOption.policy(TransitPolicy.values()[transitSpinner.getSelectedItemPosition()]);//设置换乘策略

routePlanSearch.transitSearch(transitOption);

}

步行路线查询实现:

/*** 步行路线查询*/

private voidwalkSearch() {

WalkingRoutePlanOption walkOption= newWalkingRoutePlanOption();

walkOption.from(PlanNode.withCityNameAndPlaceName("淄博", startPlace));

walkOption.to(PlanNode.withCityNameAndPlaceName("淄博", endPlace));

routePlanSearch.walkingSearch(walkOption);

}

设置的方式其实都特别的简单,设置完相关方式之后需要设置相关的监听事件用于回调.内部的具体实现过程我就不去实现了,在最后我会再提供一个demo下载.大家可以下载下来进行相关的研究.

/*** 路线规划结果回调*/OnGetRoutePlanResultListener routePlanResultListener= newOnGetRoutePlanResultListener() {/*** 步行路线结果回调*/@Overridepublic voidonGetWalkingRouteResult(

WalkingRouteResult walkingRouteResult) {

}/*** 换成路线结果回调*/@Overridepublic voidonGetTransitRouteResult(

TransitRouteResult transitRouteResult) {

}/*** 驾车路线结果回调 查询的结果可能包括多条驾车路线方案*/@Overridepublic voidonGetDrivingRouteResult(

DrivingRouteResult drivingRouteResult) {

}

};

最后就是实例化对象,然后发送请求就可以了,服务端处理完数据信息之后,通过回调就可以把数据回传了.

最后放一个demo:http://files.cnblogs.com/files/RGogoing/BDMap_1.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值