iOS关于地图定位和热点搜索使用小结

  最近项目刚刚忙完,有空整理一下用到的相关技术点。地图是比较常见的功能模块,现在用的比较多的是地图当前位置显示,公交、骑行、步行路线信息,附近热点位置搜索。现在国内用的比较多的是高德、百度,国外的话可以用谷歌、腾讯。路线信息的内容之前博文里面有所提及,本文以高德地图为例,主要介绍一下其他两点。

  1、pod导入相应的地图库,添加引用和协议

      #import <MAMapKit/MAMapKit.h>

          #import <AMapFoundationKit/AMapFoundationKit.h>

          #import <AMapLocationKit/AMapLocationKit.h>

          #import <AMapSearchKit/AMapSearchKit.h>

      <MAMapViewDelegate,AMapLocationManagerDelegate,AMapSearchDelegate>

  2、定义地图、地图管理变量,热点搜索,经纬度信息变量

  

/**

 高德地图

 */

@property (nonatomic,strong) MAMapView *mapView;

/**

 定位管理

 */

@property (nonatomic,strong) AMapLocationManager *locService;

/**

 用户当前位置

 */

@property (nonatomic,strong) MAPointAnnotation *curAnnotation;

/**

 周边检索

 */

@property (nonatomic,strong) AMapSearchAPI *poiSearch;

/**

 周边检索条件

 */

@property (nonatomic,strong) AMapPOIAroundSearchRequest *placeAround;

  3、实例化相关变量,并开启定位

  

-(void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

    

    self.mapView.delegate    = self;

    self.locService.delegate = self;

    self.poiSearch.delegate  = self;

}

 

-(void)viewWillDisappear:(BOOL)animated{

    

    [super viewWillDisappear:animated];

    

    [self.mapView removeAnnotation:self.curAnnotation];

    self.curAnnotation = nil;

    self.mapView.delegate    = nil;

    self.locService.delegate = nil;

    self.poiSearch.delegate  = nil;

}

 

-(void)viewDidAppear:(BOOL)animated{

    [super viewDidAppear:animated];

    //    self.locService.delegate = self;

    [self.locService startUpdatingLocation];

    

}

#pragma mark - 懒加载

-(MAMapView *)mapView{

    

    if (!_mapView) {

        _mapView = [[MAMapView alloc]initWithFrame:self.mapBackView.bounds];

        [_mapView setMapType:MAMapTypeStandard];

        _mapView.showsCompass = NO;

        [_mapView setZoomLevel:16];

    }

    return _mapView;

}

-(AMapLocationManager *)locService{

    if (!_locService) {

        _locService = [[AMapLocationManager alloc] init];

        //设置不允许系统暂停定位

        [_locService setPausesLocationUpdatesAutomatically:NO];

        //设置允许在后台定位

        [_locService setAllowsBackgroundLocationUpdates:YES];

        //设置允许连续定位逆地理

        [_locService setLocatingWithReGeocode:YES];

    }

    return _locService;

}

 

-(AMapSearchAPI *)poiSearch{

    

    if (!_poiSearch) {

        _poiSearch = [[AMapSearchAPI alloc]init];

    }

    return _poiSearch;

}

 

-(AMapPOIAroundSearchRequest *)placeAround{

    

    if (!_placeAround) {

        _placeAround = [[AMapPOIAroundSearchRequest alloc]init];

        _placeAround.radius = 1500;

        _placeAround.offset = 10;

        _placeAround.keywords = @"";

        _placeAround.sortrule            = 0;

        _placeAround.requireExtension    = YES;

        _placeAround.types = @"220000|070700|120000|110000|160000|060000|170000|130000|150900|080304|141200";

        //,事物,会议,大厦,公寓,广场,银行,商场,学校,停车场,酒吧

    }

    return _placeAround;

}

-(void)viewDidLoad {

    [super viewDidLoad];

    [AMapServices sharedServices].enableHTTPS = YES;

    [self createSubviews];

}

  4、地图位置解析,设置地图上的当前经纬度信息,然后关闭定位,搜索周边热点位置

  

-(void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode{

    if (location) {

        CLGeocoder *geocoder = [[CLGeocoder alloc] init];

        WS(weakSelf)

        [geocoder reverseGeocodeLocation:[[CLLocation alloc] initWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude] completionHandler:^(NSArray *placemarks, NSError *error){

            if (error) {

                weakSelf.errorLabel.hidden = NO;

                [CCErrorView showErrorWithText:K_CC_LOCAL_STR(@"location.error")];

            }else{

                if (placemarks.count>0) {

                    if (weakSelf.curAnnotation) {

                        [weakSelf.mapView removeAnnotation:weakSelf.curAnnotation];

                        weakSelf.curAnnotation = nil;

                    }

                    weakSelf.errorLabel.hidden = YES;

                    weakSelf.curAnnotation = [[MAPointAnnotation alloc]init];

                    weakSelf.curAnnotation.coordinate = location.coordinate;

                    CLPlacemark *placemark = [placemarks objectAtIndex:0];

                    NSDictionary *addressDic = placemark.addressDictionary;

                    NSString *address = [[addressDic objectForKey:@"FormattedAddressLines"] firstObject];

                    

                    if (K_CC_EMPTY_STR(address)) {

                        address = @"";

                    }

                    if (!K_CC_EMPTY_STR(addressDic[@"Country"])) {

                        address = [address stringByReplacingOccurrencesOfString:[addressDic objectForKey:@"Country"]  withString:@""];

                    }

                    

                    weakSelf.curAnnotation.title = address;

                    weakSelf.curStreet = [addressDic objectForKey:@"Name"];

                    weakSelf.curProvince = [addressDic objectForKey:@"State"];

                    weakSelf.curCity = [addressDic objectForKey:@"City"];

                    weakSelf.curArea = [addressDic objectForKey:@"SubLocality"];

                    

                    [weakSelf.datalist removeAllObjects];

                    CCSignInModel *model = [[CCSignInModel alloc]init];

                    model.name = [addressDic objectForKey:@"Name"];

                    model.address = address;

                    model.location =location.coordinate;

                    model.curCity = [addressDic objectForKey:@"City"];

                    model.curArea = [addressDic objectForKey:@"SubLocality"];

                    model.curStreet = [addressDic objectForKey:@"Name"];

                    [weakSelf.datalist addObject:model];

                    weakSelf.curModel = model;

                    

                    [weakSelf.listTableView reloadData];

                }else{

                    weakSelf.errorLabel.hidden = NO;

                    [CCErrorView showErrorWithText:K_CC_LOCAL_STR(@"location.error")];

                }

                

                [weakSelf.mapView setCenterCoordinate:location.coordinate animated:NO];

                [weakSelf.mapView addAnnotation:weakSelf.curAnnotation];

                [weakSelf.mapView selectAnnotation:weakSelf.curAnnotation animated:YES];

                [weakSelf.locService stopUpdatingLocation];

                

                AMapGeoPoint *centerPoint = [AMapGeoPoint locationWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];

                

                [weakSelf.placeAround setLocation:centerPoint];

                

                [weakSelf.poiSearch AMapPOIAroundSearch:weakSelf.placeAround];

            }

        }];

        

    }else{

        self.errorLabel.hidden = NO;

    }

}

#pragma mark - AMapSearchDelegate

-(void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error

{

    NSLog(@"Error: %@ ", error);

    if (self.datalist.count>0 && self.placeAround.page!=1) {

        [self.listTableView.mj_footer endRefreshingWithNoMoreData];

    }

 

    [self.listTableView reloadData];

}

 

-(void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response

{

    [self.listTableView.mj_footer endRefreshing];

    if (response.pois.count>0) {

        for (AMapCloudPOI *info in response.pois) {

            

            CCSignInModel *model = [[CCSignInModel alloc]init];

            model.name     = info.name;

            model.address  = info.address;

            model.curCity = self.curCity;

            model.curArea = self.curArea;

            model.curStreet = self.curStreet;

            model.location = CLLocationCoordinate2DMake(info.location.latitude,info.location.longitude);

            [self.datalist addObject:model];

        }

        if (response.pois.count == 10 && self.placeAround.page == 1) {

            @K_CC_WEAK(self)

            self.listTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{

                @K_CC_STRONG(self)

                self.placeAround.page++;

                [self.poiSearch AMapPOIAroundSearch:self.placeAround];

            }];

        }else if(response.pois.count < 10 && self.placeAround.page != 1){

            [self.listTableView.mj_footer endRefreshingWithNoMoreData];

        }

    }else{

        if (self.placeAround.page == 1 && self.datalist.count == 0) {

            [CCNoDataView nodataViewShowWithTableView:self.listTableView isShow:YES];

        }

    }

 

    [self.listTableView reloadData];

}

iOS关于地图定位和热点搜索使用小结

上一篇:Vue3.0高阶实战:开发高质量音乐Web app


下一篇:React create-react-app创建项目时,控制台爆出这个错误