程序设计iOS Developer

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

2016-10-05  本文已影响114人  小冰山口
POI = point of interest (兴趣点)

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

先看一下思路图:
POI Search思路图
让我们来 step by step 吧
// -------- POI 兴趣点查找 --------
- (BMKPoiSearch *)poiSearch
{
    if (!_poiSearch) {
        _poiSearch = [[BMKPoiSearch alloc]init];
    }
    return _poiSearch;
}
    // -------- 根据关键词查询兴趣点 --------
- (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];
}
#pragma mark *** UISearchBarDelegate 代理方法 ***
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
    /* 根据 searchBar 的关键字搜索 */
    [kBaiduMapManager poiSearchWithKeyword:searchBar.text];
}
#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];
}
#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
#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及自定义大头针实现效果
上一篇下一篇

猜你喜欢

热点阅读