你的位置:首页 > 操作系统

[操作系统]iOS开发之百度地图的集成——地图标注POI检索


本篇分为两部分:

一、地图标注

  第一步:首先创建 BMKMapView 视图

  第二步:在视图完全显示出来后设置,并实现代理方法

  第三步:运行程序,此时大头针效果可以正常显示

二、POI检索

  第一步:延时加载对象

  第二步:实现BMKPoiSearchDelegate代理方法

  第三步:实现 BMKPoiSearchDelegate 处理回调结果

  第四步:运行程序,此时便可检索到附近小吃相关标注


一、地图标注

标注BMKAnnotation一定要实现为标注对应的protocal<BMKMapViewDelegate>

第一步:首先创建 BMKMapView 视图

- (BMKMapView *)mapView {  if (!_mapView) {    _mapView = [[BMKMapView alloc] initWithFrame:self.view.bounds];    self.view = _mapView;  }  return _mapView;}

 第二步:在视图完全显示出来后设置,并实现代理方法

- (void) viewDidAppear:(BOOL)animated {  // 添加一个PointAnnotation  BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];  CLLocationCoordinate2D coor;  coor.latitude = 39.915;  coor.longitude = 116.404;  annotation.coordinate = coor;  annotation.title = @"这里是北京";  annotation.subtitle = @"我为你无法呼吸~";  [_mapView addAnnotation:annotation];}// 自定义添加大头针方法- (void)addAnnoWithPT:(CLLocationCoordinate2D)coor andTitle:(NSString *)title andAddress:(NSString *)address {  // 添加一个PointAnnotation  BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];  annotation.coordinate = coor;  annotation.title = title;  annotation.subtitle = address;  [_mapView addAnnotation:annotation];}#pragma mark#pragma mark - BMKLocationServiceDelegate 代理方法,用于添加大头针- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation {  static NSString *identifier = @"myAnnotation";  if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {    BMKPinAnnotationView *newAnnotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];    if (!newAnnotationView) {      newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];    }    newAnnotationView.annotation = annotation;    newAnnotationView.pinColor = BMKPinAnnotationColorPurple;    newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示        //添加按钮监听点击事件    UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];    newAnnotationView.rightCalloutAccessoryView = btn;    [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];        return newAnnotationView;  }  return nil;}

 

 第三步:运行程序,此时大头针效果可以正常显示

 


二、POI检索

第一步:延时加载对象

- (BMKPoiSearch *)poiSearch {  if (!_poiSearch) {    _poiSearch = [[BMKPoiSearch alloc] init];    _poiSearch.delegate = self;  }  return _poiSearch;}

第二步:实现BMKPoiSearchDelegate代理方法

// 长按地图时会调用此方法- (void)mapview:(BMKMapView *)mapView onLongClick:(CLLocationCoordinate2D)coordinate {  //发起检索  BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];  option.pageIndex = 0;  option.pageCapacity = 20;  option.location = coor;  option.keyword = @"小吃";  BOOL flag = [self.poiSearch poiSearchNearBy:option];  if(flag) {    NSLog(@"周边检索发送成功");  } else {    NSLog(@"周边检索发送失败");  }    // 设置初始化区域  CLLocationCoordinate2D center = option.location;  BMKCoordinateSpan span;  span.latitudeDelta = 0.016263;  span.longitudeDelta = 0.012334;  BMKCoordinateRegion region;  region.center = center;  region.span = span;  [self.mapView setRegion:region animated:YES];}

 第三步:实现 BMKPoiSearchDelegate 处理回调结果

- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error {  if (error == BMK_SEARCH_NO_ERROR) {    //在此处理正常结果//    NSLog(@"成功:%@", poiResultList.poiInfoList);        [poiResultList.poiInfoList enumerateObjectsUsingBlock:^(BMKPoiInfo * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {//      NSLog(@"%@----%@", obj.name, obj.address); // 由于设置检索时,每页指定了10条,所以此处检索出10条相关信息      [self addAnnoWithPT:obj.pt andTitle:obj.name andAddress:obj.address];    }];  }  else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){    //当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表    // result.cityList;    NSLog(@"起始点有歧义");  } else {    NSLog(@"抱歉,未找到结果, %zd", error);  }}

 第四步:运行程序,此时便可检索到附近小吃相关标注

 注意:需要引入的头文件

#import <BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件#import <BaiduMapAPI_Search/BMKSearchComponent.h>//引入检索功能所有的头文件#import <BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的头文件