使用百度地图查询经过某一公交站的所有公交线路

百度提供的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(@"抱歉,未找到结果");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值