iOS 高德地图 仿大众点评 区域内搜索

2020-06-12  本文已影响0人  唐人街的乞丐

仿大众点评 区域内搜索

区域内搜索

1 申请KEY
(1)到高德开放平台-我的应用申请iOS key;

2.集成高德地图SDK
(2)集成高德地图SDK,我是通过 CocoaPods 来集成的,好处就不说了~

platform :ios, '11.0'
target 'CJMap' do
pod 'AMapSearch' #搜索服务SDK
pod 'AMapLocation'
pod 'AMapNavi'#这个要放到其他高德sdk后
pod 'JZLocationConverter'#gps纠偏
 end

3.添加位置权限

        <key>NSLocationAlwaysUsageDescription</key>
    <string>是否允许使用定位来给您提供服务?</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>是否允许使用定位来给您提供服务?</string>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

4.添加KEY

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    [AMapServices sharedServices].apiKey = MapKey;
    [AMapServices sharedServices].enableHTTPS = YES;
    return YES;
}

5.初始化地图,和搜索API

//初始化地图,和搜索API
- (void)initMapView {
    self.mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
    self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.mapView.delegate = self;
    //  不支持旋转
    self.mapView.rotateEnabled = NO;
    //倾斜收拾
    self.mapView.rotateCameraEnabled = NO;
//    表示不显示比例尺
    self.mapView.showsScale= NO;
    ///如果您需要进入地图就显示定位小蓝点,则需要下面两行代码
    self.mapView.showsUserLocation = YES;
    self.mapView.zoomLevel = 14;
    self.mapView.userTrackingMode = MAUserTrackingModeFollow;
    [self.view addSubview:self.mapView];
    self.search = [[AMapSearchAPI alloc] init];
     self.search.delegate = self;

}

5.POI搜索获取当前左上角和右下角的经纬度, 使用POI多边形搜索,构成一个封闭的矩形

/**
 * @brief 地图区域改变完成后会调用此接口
 * @param mapView 地图View
 * @param animated 是否动画
 */
- (void)mapView:(MAMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
    
  CLLocationCoordinate2D leftTop  =   [mapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:self.view];
    self.leftTop = leftTop;
    CLLocationCoordinate2D rightBtm  =   [mapView convertPoint:CGPointMake(self.mapView.mj_w, self.mapView.mj_h) toCoordinateFromView:self.view];
    self.rightBtm = rightBtm;

}

6.按钮点击事件,执行搜索操作

//  按钮click
-(void)buttonClick{
    NSLog(@"click");
    NSArray *points = [NSArray arrayWithObjects:
                       [AMapGeoPoint locationWithLatitude:self.leftTop.latitude longitude:self.leftTop.longitude],
                       [AMapGeoPoint locationWithLatitude:self.rightBtm.latitude longitude:self.rightBtm.longitude],
                       nil];
    AMapGeoPolygon *polygon = [AMapGeoPolygon polygonWithPoints:points];

    AMapPOIPolygonSearchRequest *request = [[AMapPOIPolygonSearchRequest alloc] init];

    request.polygon             = polygon;
    request.keywords            = @"餐饮";
    request.requireExtension    = YES;
    [self.search AMapPOIPolygonSearch:request];
}

7.POI 多边形搜索回调.

/* POI 搜索回调. */
- (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response
{
    [self.mapView removeAnnotations:self.searchResultArr];
    [self.searchResultArr removeAllObjects];
    if (response.pois.count == 0)
    {
        return;
    }
    
    [response.pois enumerateObjectsUsingBlock:^(AMapPOI * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        // 这里使用了自定义的坐标是为了区分系统坐标

      CJSearchPOIPointAnnotation *annotation = [[CJSearchPOIPointAnnotation alloc] init];
        [annotation setCoordinate:CLLocationCoordinate2DMake(obj.location.latitude, obj.location.longitude)];
        [annotation setTitle:[NSString stringWithFormat:@"%@", obj.name]];
//        [annotation setSubtitle:[NSString stringWithFormat:@"%zd米",obj.distance]];
        [annotation setSubtitle:@""];
        [self.searchResultArr addObject:annotation];
    }];
    // 向地图窗口添加一组标注
       [self.mapView addAnnotations:self.searchResultArr];
}

8,地图添加上自定义图标的大头针即可

//只要有标注点需要显示,该回调就会被调用
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation {
      //  自己的位置
    if ([annotation isKindOfClass:[MAUserLocation class]]) {


       return nil;

    }else  if ([annotation isKindOfClass:[CJSearchPOIPointAnnotation class]] )
     {
          
         static NSString *tipIdentifier = @"ZZOilAnnotation";
         NSLog(@"annotation.title----%@",annotation.title);
         MAAnnotationView *poiAnnotationView = (MAAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:tipIdentifier];
         if (poiAnnotationView == nil)
         {
             poiAnnotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:tipIdentifier];
         }
         poiAnnotationView.canShowCallout= YES; //设置气泡可以弹出,默认为NO
         poiAnnotationView.selected = YES;  //设置标注动画显示,默认为NO
         poiAnnotationView.image = [UIImage imageNamed:@"map_local_oil1"];
         poiAnnotationView.centerOffset= CGPointMake(0, mapCenterOffset);
         [poiAnnotationView setSelected:YES animated:NO];
         
         //        点击大头针显示的右边视图
         UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
         rightButton.backgroundColor = [UIColor redColor];
         [rightButton setTitle:@"导航" forState:UIControlStateNormal];
         [rightButton addTarget:self action:@selector(navBtnClick) forControlEvents:UIControlEventTouchUpInside];
         poiAnnotationView.rightCalloutAccessoryView = rightButton;
         return poiAnnotationView;
     }
    
      return nil;

}

更多关于高德地图的完整代码在完整代码GitHub
(包括:高德地图展示,当前位置,自定义圆点图,圆点带方向旋转,驾车路线轨迹,区域内搜索(类似于大众点评),地理编码(地址转坐标),反地理编码(坐标转地址),自定义地图样式)

上一篇下一篇

猜你喜欢

热点阅读