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;
}
网友评论