百度提供的POI检索接口:
http://lbsyun.baidu.com/index.php?title=iossdk/guide/retrieval
每个检索功能模块都包括一个主检索对象,一个用于构造检索参数的Option结构体,和一个用于接收检索结果回调的Delegate,所有检索服务都使用异步回调模式。使用检索服务时,需要先初始化主检索对象,然后通过主检索对象以包含检索参数的Option做为参数发起检索,最后实现相应的检索功能模块的Delegate处理返回结果 。
1、根据公交站名,使用城内POI检索 “poiSearchInCity:”获取经过该站的所有“线路名称”;
2、根据公交线路名称,使用城内POI检索 “poiSearchInCity:”获取该“线路UID”;
3、根据公交线路UID,使用公交详情信息检索“busLineSearch:”获取经过该站的所有“线路的具体信息”。
@interface BusStationDetailsVC ()<BMKPoiSearchDelegate,BMKBusLineSearchDelegate>
{
NSString *_currentCity; //当前城市
BMKPoiSearch *_poiSearch; //poi搜索器
BMKBusLineSearch* _busLinesearch; //busLine搜索器
NSMutableArray *_busLineNameArray;//保存经过该站所有线路的名称
NSMutableArray *_busLineInfoArray;//保存经过该站所有线路的详情
NSString * _busStationTitle; //该站的名称
NSString * _busStationUid; //该站的UID
BOOL _willGetBusLineNameArray; //是否要获取线路名称
}
@end
@implementation SLBusStationDetailsVC
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
_poiSearch.delegate = self; //此处记得不用的时候需要置nil,否则影响内存的释放
_busLinesearch.delegate = self;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
_poiSearch.delegate = nil; // 不用时,置nil
_busLinesearch.delegate = nil;
}
- (void)viewDidLoad {
[super viewDidLoad];
willGetBusLineNameArray = YES;//默认是要获取线路名称的
//初始化poi搜索器
_poiSearch = [[BMKPoiSearch alloc] init];
_poiSearch.delegate = self;
//初始化busLine搜索器
_busLinesearch = [[BMKBusLineSearch alloc] init];
_busLinesearch.delegate = self;
//获取当前城市名字,搜索时要作为参数使用
_currentCity = [UserDefaults instance].current_cityName;
_busLineNameArray = [NSMutableArray array];
_busLineUidArray = [NSMutableArray array];
_busLineInfoArray = [NSMutableArray array];
NSLog(@"当前城市是:%@",_currentCity);
[TJTools showTextHud:HUD_TEXT_LOADING];//正在检索,提示等待
//获取经过该站的所有线路的名称
[self getBusLineName];
}
// 步骤1、获取经过该站的所有线路的线路名称和线路UID
// 1-1、获取经过该站的所有线路的名称
- (void)getBusLineName
{
//根据公交站名称进行POI城市内检索
BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc] init];
citySearchOption.city = _currentCity;
citySearchOption.keyword = _busStationTitle//站名;
BOOL flag = [_poiSearch poiSearchInCity:citySearchOption];
if(flag)
{
//详情检索发起成功
NSLog(@"城市内检索发送成功");
}
else
{
//详情检索发送失败
NSLog(@"城市内检索发送失败");
}
}
//poiSearchInCity的回调处理,功能1:获取经过该站的所有线路的名称,功能2: 获取该线路UID
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResult errorCode:(BMKSearchErrorCode)errorCode
{
if (errorCode == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
//1、遍历POI检索结果
for (NSInteger i = 0; i < poiResult.poiInfoList.count; i++)//遍历poiInfoList数组,该数组中存储着检索到的所有poi信息
{
//BMKPoiInfo就是检索出来的poi信息
BMKPoiInfo* poi = [poiResult.poiInfoList objectAtIndex:i];
//NSLog(@"编号:%ld——名字:%@——UID:%@——address:%@——epoitype:%d",i,poi.name ,poi.uid ,poi.address,poi.epoitype);
//功能1 —-> 当检索公交站名称获取经过该站的线路名称时用以下判断条件
if ((poi.epoitype == 1 || poi.epoitype == 3) && _willGetBusLineNameArray ) {//1为公交站,3为地铁站
//poi.addres是一个字符串,存放着经过该站的所有线路名称,例子:@“11路;78路;Y818路”
//从字符;中分隔出线路名称并生成一个数组,该数组保存经过该站的所有线路名称
NSArray *array = [poi.address componentsSeparatedByString:@";"];
//将该poi(有多个poi)对应的线路添加到公交线路数组中
[_busLineNameArray addObjectsFromArray:array];
// NSLog(@"线路名称数组:%@",_busLineNameArray);
}
//功能2 —-> 当检索线路名称获取该线路UID时用以下判断条件
if (poi.epoitype == 2 || poi.epoitype == 4) {//2为公交线路,4为地铁线路
[_busLineUidArray addObject:poi.uid];
// NSLog(@"线路Uid数组目前有%ld条线路,%@",_busLineUidArray.count,_busLineUidArray);
}
}
//已经获取了所有的线路名称,不需要再进行线路名称的获取
_willGetBusLineNameArray = NO;
//2、获取经过该站的所有线路的UID
[self getBusLineUid];
}
else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
// result.cityList;
NSLog(@"起始点有歧义");
} else {
NSLog(@"抱歉,未找到结果");
}
}
//获取经过该站的所有线路的UID
- (void)getBusLineUid
{
// NSLog(@"开始进行公交线路查询!,目前_busLineNameArray的数据有%lu条",(unsigned long)_busLineNameArray.count);
//根据公交线路名称进行POI城市内检索
//检索_busLineNameArray中的第一个公交线路名称
if (_busLineNameArray.count) {
BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc] init];
citySearchOption.city = _currentCity;
citySearchOption.keyword = [_busLineNameArray objectAtIndex:0];
BOOL flag = [_poiSearch poiSearchInCity:citySearchOption];
if(flag)
{
//详情检索发起成功
NSLog(@"城市内检索发送成功");
//检索完一个线路的名称就删除掉
[_busLineNameArray removeObjectAtIndex:0];
}
else
{
//详情检索发送失败
NSLog(@"城市内检索发送失败");
}
}else{//已经获取了所有线路的UID
// NSLog(@"_busLineNameArray中没有线路了,已经获取了所有线路的UID!");
// NSLog(@"开始获取线路详情!!!");
//获取经过该站的所有公交线路的详细信息
[self getBusLineInfo];
}
}
#pragma mark 获取经过该站的所有线路的线路具体信息
//获取经过该站的所有线路的具体信息
- (void)getBusLineInfo
{
if (_busLineUidArray.count){
BMKBusLineSearchOption *buslineSearchOption = [[BMKBusLineSearchOption alloc]init];
buslineSearchOption.city= _currentCity;
buslineSearchOption.busLineUid= [_busLineUidArray objectAtIndex:0];
BOOL flag = [_busLinesearch busLineSearch:buslineSearchOption];
if(flag) {
NSLog(@"busline检索发送成功");
//检索完一个线路的名称就删除掉
[_busLineUidArray removeObjectAtIndex:0];
//只要完成一条线路的检索就先在tableView显示出来,因为如果等所有线路都检索完,都写进线路详情数组:_busLineInfoArray需要等待好几秒,这期间界面上什么都没有或者一直提示等待,这对用户很不友好
[TJTools hideHud];
[self.tableView reloadData];
}
else {
NSLog(@"busline检索发送失败");
}
}else{//已经获取了所有线路的详情
NSLog(@"_busLineUidArray中没有线路了,已经获取了所有线路的详情!");
[self.tableView reloadData];
[TJTools hideHud];
}
}
//busLineSearch的回调处理
- (void)onGetBusDetailResult:(BMKBusLineSearch*)searcher result:(BMKBusLineResult*)busLineResult errorCode:(BMKSearchErrorCode)error {
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
// NSLog(@"%@--%@--%@--%@--%@--%d--%@--%@",busLineResult.busCompany,busLineResult.busLineName,busLineResult.uid,busLineResult.startTime,busLineResult.endTime,busLineResult.isMonTicket,busLineResult.busStations,busLineResult.busSteps);
[_busLineInfoArray addObject:busLineResult];
// NSLog(@"_busLineInfoArray中的个数是:%lu个",(unsigned long)_busLineInfoArray.count);
//获取经过该站的所有公交线路的详细信息
[self getBusLineInfo];
}
else {
NSLog(@"抱歉,未找到结果");
}
}