美文网首页程序设计iOS Developer
Baidu 地图 SDK 的使用(四)---POI Search

Baidu 地图 SDK 的使用(四)---POI Search

作者: 小冰山口 | 来源:发表于2016-10-05 10:50 被阅读114次
    POI = point of interest (兴趣点)

    兴趣点检索应该是地图类 SDK 最重要的接口了, 也是电商类 , 打车类APP 必备的功能,那么兴趣点检索的功能如何完成呢?

    先看一下思路图:
    POI Search思路图
    让我们来 step by step 吧
    • 在 BaiduMapManager 类中设置 BMKPoiSearch 属性,并对其进行懒加载初始化
    // -------- POI 兴趣点查找 --------
    - (BMKPoiSearch *)poiSearch
    {
        if (!_poiSearch) {
            _poiSearch = [[BMKPoiSearch alloc]init];
        }
        return _poiSearch;
    }
    
    • 创建 poiSearch分类,并将处理POI Search 的逻辑写在这个分类里
        // -------- 根据关键词查询兴趣点 --------
    - (void)poiSearchWithKeyword:(NSString *)keyword
    {
        kBaiduMapManager.poiSearch.delegate = self;
         /* 初始化查询请求 */
        BMKNearbySearchOption *searchOption = [[BMKNearbySearchOption alloc]init];
        
         /* 设置查询请求的属性 */
        /* note : 关键词一定要设置,不然代理的 API 不走 */
        searchOption.keyword = keyword;
        searchOption.location = kBaiduMapManager.locationService.userLocation.location.coordinate;
        searchOption.radius = 1000;
        
         /* 执行查询请求 */
        [kBaiduMapManager.poiSearch poiSearchNearBy:searchOption];
    }
    
    • 暴露一个接口,供外界使用, 在这个 demo 中,我使用的是 searchBar, 当我点击 searchBar 自动弹出键盘, 点击"search/ 查找"键时,自动根据搜索框的文本进行查找
    #pragma mark *** UISearchBarDelegate 代理方法 ***
    -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
    {
        [searchBar resignFirstResponder];
        /* 根据 searchBar 的关键字搜索 */
        [kBaiduMapManager poiSearchWithKeyword:searchBar.text];
    }
    
    • 查询结果代理 API 回调,将回调结果转换成 Annotation 模型
    #pragma mark *** BMKPoiSearchDelegate API 回调 ***
    
     /* 设置大头针模型缓存 */
    NSMutableArray *annotationsCache = nil;
    
        // -------- POI 查询结果回调 --------
    - (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResult errorCode:(BMKSearchErrorCode)errorCode
    {
         /* 在显示新的查询结果之前清空缓存 */
        [kBaiduMapManager.mapView removeAnnotations:annotationsCache];
        annotationsCache = [NSMutableArray array];
        NSArray <BMKPoiInfo *> *infoArray = poiResult.poiInfoList;
        for (BMKPoiInfo *info in infoArray) {
             /* 将查询结果信息转化为大头针模型 */
            YFAnnotation *annotation = [[YFAnnotation alloc]init];
            annotation.coordinate = info.pt;
            annotation.title = info.name;
            [annotationsCache addObject:annotation];
        }
         /* 将大头针添加在视图上 */
        [kBaiduMapManager.mapView addAnnotations:annotationsCache];
    }
    
    • 自定义 YFAnnotationView 视图,继承自 BMKAnnotationView
    #import "YFAnnotationView.h"
    
    static NSString *reuseIdentifier = @"YFAnnotationViewReuseIdentifier";
    @implementation YFAnnotationView
    
    // -------- 自定义构造方法返回大头针视图 --------
    + (instancetype)annotationViewWithAnnotation:(YFAnnotation *)annotation andMapView:(BMKMapView *)mapView
    {
        /* 已创建好大头针视图时重用 */
        YFAnnotationView *annotationView = (YFAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIdentifier];
        
        /* 未创建好大头针视图时创建 */
        if (!annotationView) {
            annotationView = [[YFAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
            /* image 属性选用自定义的图片,创建一次不再创建 */
            annotationView.image = [UIImage imageNamed:@"cm2_fm_btn_loved"];
        }
        /* 当模型修改时,更改模型 */
        annotationView.annotation = annotation;
        return annotationView;
    }
    @end
    
    • 在 BMKMapViewDelegate 的代理方法中返回自定义的大头针视图
    #pragma mark *** BMKMapViewDelegate 的代理方法 ***
    
    // -------- 返回自定义的大头针视图 --------
    - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[YFAnnotation class]]) {
            return [YFAnnotationView annotationViewWithAnnotation:annotation andMapView:mapView];
        }
         /* 当返回的是 nil 的时候,表示的是默认的大头针视图 */
        return nil;
    }
    
    这样, 我们在进行 POI Search 的时候就可以看到自定义的大头针视图了, 让我们来看一下实现效果
    POI Search及自定义大头针实现效果

    相关文章

      网友评论

      本文标题:Baidu 地图 SDK 的使用(四)---POI Search

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