android poi筛选没经纬度的结果,Android百度地图开发05之公交信息检索 + 路线规划...

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

公交信息检索

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

一般步骤:

1. 设置检索参数

2. 添加检索结果监听器

3. 发起检索

4. 解析返回结果

打开程序包com.baidu.mapapi.search.buslinedafebf4679d8a8d2e578fe4dbdb92124.png

17212dd95f1af0ba94671a5a69aa6e9d.png

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

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

所以注意:公交信息检索设置查询参数时,第二个参数是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的话,你会发现很多个。但是,我们都知道,一个公交线号最多有两个线路(正向和反向)。所以我们需要筛选出是公交路线的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添加到一个list中。

得到了uid,就可以结合城市参数,进行公交线路检索了。

private void searchBusline() {

if (buslineIndex >= buslineIdList.size()) {

buslineIndex = 0;

}

if (buslineIndex >= 0 && buslineIndex 

&& 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);// 用于显示一条公交详情结果的Overlay

overlay.setData(busLineResult);

overlay.addToMap();// 将overlay添加到地图上

overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内

bdMap.setOnMarkerClickListener(overlay);

// 公交线路名称

Toast.makeText(BusLineSearchActivity.this,

busLineResult.getBusLineName(), Toast.LENGTH_SHORT)

.show();

}

}

};

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

5a5113c7e4ad3a6837b67c31f5b27db1.png

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

我们依旧通过使用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;

}

}

路线规划

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

43cffa57d31d1de746b03e326625cf20.png 路线规划先关类都在此包结构下。

6ca0a93e6ac2129ee18e5c92daba113e.png

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

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

51a9178e8ea59b322a171193083c5d78.png

设置点的时候,传入的参数是PlanNode类型的。该类有两个静态的方法,一个通过设置城市名和地名,一个通过设置经纬度,都可以返回一个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));// 设置一条驾车路线方案

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();

}

}

};

下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值