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

本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

POI = point of interest (兴趣点)

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

先看一下思路图:
Baidu 地图 SDK 的使用(四)---POI Search_第1张图片
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  *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)annotation
{
    if ([annotation isKindOfClass:[YFAnnotation class]]) {
        return [YFAnnotationView annotationViewWithAnnotation:annotation andMapView:mapView];
    }
     /* 当返回的是 nil 的时候,表示的是默认的大头针视图 */
    return nil;
}
这样, 我们在进行 POI Search 的时候就可以看到自定义的大头针视图了, 让我们来看一下实现效果
POI Search及自定义大头针实现效果

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

你可能感兴趣的:(Baidu 地图 SDK 的使用(四)---POI Search)