标签:
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
Android学习笔记之使用百度地图实现路线规划+公交信息检索
标签:
原文地址:http://www.cnblogs.com/RGogoing/p/5043222.html