程序员人生 网站导航

[置顶] 百度地图开发(五)之公交信息检索 + 路线规划

栏目:php教程时间:2015-03-19 08:18:11

转载请注明出处:

    在上1篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索线路计划的内容。

公交信息检索

    实际上,公交信息检索与POI检索、在线建议检索非常相似,也是把你需要检索的信息发送给百度地图服务器,然后解析得到的结果。

    1般步骤:

    1. 设置检索参数

    2. 添加检索结果监听器

    3. 发起检索

    4. 解析返回结果

    打开程序包com.baidu.mapapi.search.busline    


    在BusLineSearchOption这个类中,我们看到1个参数是城市,另外一个是公众线路uid。

1开始,我以为第2个参数是公交线号,代码编写终了去查询的时候,总是出错。后来仔细查看了api以后,发现不是公交线号,而是uid。uid我们在之前poi检索的时候,曾见到过,它实际上即是1个id,是i1个唯1标识。

所以注意:公交信息检索设置查询参数时,第2个参数是uid

    所以进行公交信息检索之前,需要先进行POI检索。使用searchInCity()方法在每个城市内查询公交线路号:

city = cityEt.getText().toString(); busline = buslineEt.getText().toString(); poiSearch.searchInCity((new PoiCitySearchOption()).city(city) .keyword(busline));
    得到poi检索的结果时,在PoiResult类中有通过getAllPoi()获得poi检索结果。
@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) {// 检索结果正常返回 // 得到检索结果 } }
    此时如果直接取出PoiInfo中的uid的话,你会发现很多个。但是,我们都知道,1个公交线号最多有两个线路(正向和反向)。所以我们需要挑选出是公交线路的uid。

    在PoiInfo类中有个type字段:0:普通点、1:、公交站 2:、 公交线路 3:、地铁站 4:地铁线路

if (poi.type == PoiInfo.POITYPE.BUS_LINE || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) { buslineIdList.add(poi.uid); }
    通过判断type,将正确的uid添加到1个list中。
    得到了uid,就能够结合城市参数,进行公交线路检索了。

private void searchBusline() { if (buslineIndex >= buslineIdList.size()) { buslineIndex = 0; } if (buslineIndex >= 0 && buslineIndex < buslineIdList.size() && buslineIdList.size() > 0) { boolean flag = busLineSearch .searchBusLine((new BusLineSearchOption().city(city) .uid(buslineIdList.get(buslineIndex)))); if (flag) { Toast.makeText(BusLineSearchActivity.this, "检索成功~", 1000) .show(); } else { Toast.makeText(BusLineSearchActivity.this, "检索失败~", 1000) .show(); } buslineIndex++; } }
/** * 公交信息查询结果监听器 */ 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);// 用于显示1条公交详情结果的Overlay overlay.setData(busLineResult); overlay.addToMap();// 将overlay添加到地图上 overlay.zoomToSpan();// 缩放地图,使所有overlay都在适合的视野范围内 bdMap.setOnMarkerClickListener(overlay); // 公交线路名称 Toast.makeText(BusLineSearchActivity.this, busLineResult.getBusLineName(), Toast.LENGTH_SHORT) .show(); } } };

    BusLineResult用来存储查询得到的结果,它又两个内部类和几个普通函数:

    我们可以通过这两个内部类,得到自己想要的信息,这里就不在代码里写了。

    我们照旧通过使用overlayutil包下的相干类(BusLineOverlay)添加覆盖物到地图上。

class MyBuslineOverlay extends BusLineOverlay { public MyBuslineOverlay(BaiduMap arg0) { super(arg0); } /** * 站点点击事件 */ @Override public boolean onBusStationClick(int arg0) { MarkerOptions options = (MarkerOptions) getOverlayOptions().get(arg0); bdMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition())); return true; } }


线路计划

    线路计划分为3种:驾车、换成(公交)、步行。而线路计划又与之前的各种检索相似。

 线路计划先关类都在此包结构下。


    我将这个包下面的类做了1下标注,这样就很清楚了,3种线路计划方式就相当于1个poi检索,只有参数设置的时候需要注意下。


    线路计划里有策略这1概念。那驾车线路计划说,就包括4种策略:躲避拥堵、最短距离、较少费用、时间优先,这4种策略组成了1个枚举类型:DrivingRoutePlanOption.DrivingPolicy。


    设置点的时候,传入的参数是PlanNode类型的。该类有两个静态的方法,1个通过设置城市名和地名,1个通过设置经纬度,都可以返回1个PlanNode对象。

    OK,到此为止,线路计划已没有任何难处了,下面只贴出驾车线路计划的代码,其余的可以下载demo查看。

DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption(); drivingOption.policy(DrivingPolicy.values()[drivingSpinner .getSelectedItemPosition()]);// 设置驾车线路策略 drivingOption.from(PlanNode.withCityNameAndPlaceName("北京", startPlace));// 设置出发点 drivingOption.to(PlanNode.withCityNameAndPlaceName("北京", endPlace));// 设置终点 routePlanSearch.drivingSearch(drivingOption);// 发起驾车线路计划

/** * 驾车线路结果回调 查询的结果可能包括多条驾车线路方案 */ @Override public void onGetDrivingRouteResult( DrivingRouteResult drivingRouteResult) { bdMap.clear(); if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(RoutePlanningActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); } if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) { // 起终点或途经点地址有岐义,通过以下接口获得建议查询信息 // drivingRouteResult.getSuggestAddrInfo() return; } if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) { DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay( bdMap); drivingRouteOverlay.setData(drivingRouteResult.getRouteLines() .get(drivintResultIndex));// 设置1条驾车线路方案 bdMap.setOnMarkerClickListener(drivingRouteOverlay); drivingRouteOverlay.addToMap(); drivingRouteOverlay.zoomToSpan(); totalLine = drivingRouteResult.getRouteLines().size(); Toast.makeText(RoutePlanningActivity.this, "共查询出" + totalLine + "条符合条件的线路", 1000).show(); if (totalLine > 1) { nextLineBtn.setEnabled(true); } // 通过getTaxiInfo()可以得到很多关于打车的信息 Toast.makeText( RoutePlanningActivity.this, "该线路打车总路程" + drivingRouteResult.getTaxiInfo() .getDistance(), 1000).show(); } } };

下载

    demo下载地址~~~


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐