zoukankan      html  css  js  c++  java
  • 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];

    }

  • 相关阅读:
    JS判断对象是否为空
    让我感动的一首歌
    获取字符串字节长度跟截取字符串字节长度
    centos7安装mysql
    python 基础
    python + 爬虫 + fiddler + 夜神模拟器 爬取app(1)
    selenium
    adb自动化农药金币
    python 引流
    Python 并行分布式框架 Celery
  • 原文地址:https://www.cnblogs.com/bigant9527/p/14626652.html
Copyright © 2011-2022 走看看