美文网首页
iOS 百度地图3-检索

iOS 百度地图3-检索

作者: 何以_aaa | 来源:发表于2017-10-11 18:04 被阅读320次

    百度地图SDK提供的检索服务包括以下功能模块:
    POI检索,
    公交方案检索,
    驾车路线检索,
    步行路线检索,
    行政区边界数据检索,
    地理编码,
    反地理编码,
    公交详情检索,
    在线建议查询,
    短串分享(包括POI搜索结果分享、驾车/公交/骑行/步行路线规划分享、反向地理编码结果分享)。

    每个检索功能模块都包括一个主检索对象,一个用于构造检索参数的Option结构体,和一个用于接收检索结果回调的Delegate,所有检索服务都使用异步回调模式。使用检索服务时,需要先初始化主检索对象,然后通过主检索对象以包含检索参数的Option做为参数发起检索,最后实现相应的检索功能模块的Delegate处理返回结果 。
    更加具体的使用详情可以参看 [百度地图检索功能]
    (http://lbsyun.baidu.com/index.php?title=iossdk/guide/retrieval)

    1 POI周边检索

    POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
    百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。下面将以周边检索为例,向大家介绍如何使用检索服务。

    1.1 在页面上定义一个输入框,内容改变时发起检索

    注意检查 nearBySearchOption.location 内容是否正确,否则总是检索不到结果

    UITextField *poiTextField = [[UITextField alloc] initWithFrame:CGRectMake(30, 30, 100, 20)];
    poiTextField.backgroundColor = [UIColor lightGrayColor];
    [poiTextField addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventEditingChanged];
    [self.view addSubview:poiTextField];
    
    - (void)valueChange:(UITextField *)textField {
        
        _poiSearch = [[BMKPoiSearch alloc]init];
        _poiSearch.delegate = self;
        
        // 附近云检索
        BMKNearbySearchOption *nearBySearchOption = [[BMKNearbySearchOption alloc]init];
        // 检索关键字
        nearBySearchOption.keyword = textField.text;
        // 检索中心点及半径
        nearBySearchOption.location = _locService.userLocation.location.coordinate;
        nearBySearchOption.radius = 10000;
        // 搜索结果排序,距离由近到远
        nearBySearchOption.sortType = BMK_POI_SORT_BY_DISTANCE;
        // 分页索引及数量
        nearBySearchOption.pageIndex = 0;
        nearBySearchOption.pageCapacity = 10;
        
        // 开始检索,结果在代理方法 onGetPoiResult 中返回
        BOOL flag = [_poiSearch poiSearchNearBy:nearBySearchOption];
        if (flag) {
            NSLog(@"搜索成功--%@", textField.text);
        }else {
            NSLog(@"搜索失败");
        }
    }
    

    1.2 结果监听

    调用 poiSearchNearBy 方法后,检索结果 在代理方法 onGetPoiResult 中返回,poiResult.poiInfoList 就是检索到的结果,是一个 BMKPoiInfo 的集合,每个BMKPoiInfo包含该检索点的名称,地址,uid等详细信息。

    - (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode {
        if (errorCode == BMK_SEARCH_NO_ERROR) {
            for (int i = 0; i < poiResult.poiInfoList.count; i++) {
                BMKPoiInfo *info = [poiResult.poiInfoList objectAtIndex:i];
                NSLog(@"地址:%@---%@---%@", info.city ,info.name, info.address);
            }
        }else {
            NSLog(@"检索异常-%d", errorCode);
        }
    }
    
    检索.PNG 检索结果.jpeg

    1.3 展示

    1.3.1 把这些数据显示到tableview上,就是我们常见的搜索框搜索得到对应的结果。

    检索结果.PNG

    1.3.2 或者将搜索出来的结果通过大头针展示在地图上:

    - (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode {
        
        // 清楚屏幕中所有的annotation
        NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
        [_mapView removeAnnotations:array];
        
        if (errorCode == BMK_SEARCH_NO_ERROR) {
            NSMutableArray *arrM = [NSMutableArray array];
            for (int i = 0; i < poiResult.poiInfoList.count; i++) {
                BMKPoiInfo *info = [poiResult.poiInfoList objectAtIndex:i];
                NSLog(@"地址:%@---%@---%@", info.city ,info.name, info.address);
                
                BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
                item.coordinate = info.pt;
                item.title = info.name;
                [arrM addObject:item];
            }
            [_mapView addAnnotations:arrM];
            [_mapView showAnnotations:arrM animated:YES];
            
            self.poiResultArr = poiResult.poiInfoList;
            [self.tableView reloadData];
            
        }else {
            NSLog(@"检索异常-%d", errorCode);
        }
    }
    
    大头针展示.PNG

    2 公交详情信息检索-基于POI

    基于上面POI检索返回的POI结果中,BMKPoiInfo有一属性epoitype,表示POI类型,epoitype字段值为2标示公交路线,4表示地铁路线,把这两种类型的POI的 uid 传给公交信息检索接口,可以得到该POI所代表的路线的详细信息(如:该公交线有多少个站点,每个站点的名称,位置、参考票价和上下线行信息)。

    点击tableView调用 公交详情信息检索,代码如下:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.poiResultArr.count;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ID"];
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ID"];
        }
        
        BMKPoiInfo *info = self.poiResultArr[indexPath.row];
        cell.textLabel.text = info.name;
        
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        
        BMKPoiInfo *info = self.poiResultArr[indexPath.row];
        if (info.epoitype == 2 || info.epoitype == 4) {
            // 发起公交检索
            [self startBusLineSearchWithCity:info.city uid:info.uid];
    
        }else {
            NSLog(@"这不是一条公交线路");
        }
        
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    
    #pragma mark
    #pragma mark -- 公交方案检索
    
    - (void)startBusLineSearchWithCity:(NSString *)city uid:(NSString *)uid{
        _busLineSearch = [[BMKBusLineSearch alloc]init];
        _busLineSearch.delegate = self;
        
        BMKBusLineSearchOption *option = [[BMKBusLineSearchOption alloc]init];
        option.city = city;
        option.busLineUid = uid;
        
        BOOL flag = [_busLineSearch busLineSearch:option];
        if(flag)
        {
            NSLog(@"busline检索发送成功    %@---%@", city, uid);
        }
        else
        {
            NSLog(@"busline检索失败");
        }
    }
    
    - (void)onGetBusDetailResult:(BMKBusLineSearch *)searcher result:(BMKBusLineResult *)busLineResult errorCode:(BMKSearchErrorCode)error {
        if (error == BMK_SEARCH_NO_ERROR) {
            //在此处理正常结果
            NSLog(@"%@,共有%zd站",busLineResult.busLineName, busLineResult.busStations.count);
        }
        else {
            NSLog(@"抱歉,未找到Bus结果%d",error);
        }
    }
    

    注意代理控制:

    -(void)viewWillDisappear:(BOOL)animated
    {
        [_mapView viewWillDisappear];
        _mapView.delegate = nil; // 不用时,置nil,否则影响内存的释放
        _locService.delegate = nil;
        _poiSearch.delegate = nil;
        _busLineSearch.delegate = nil;
    }
    

    分别点击下面第1条,第3条,第4条,打印结果:

    检索结果.PNG 公交检索结果.jpeg

    相关文章

      网友评论

          本文标题:iOS 百度地图3-检索

          本文链接:https://www.haomeiwen.com/subject/poowyxtx.html