ios学习笔记—— 定位服务

来源:互联网 发布:共享网络下的防监听 编辑:程序博客网 时间:2024/06/09 19:29

         在iOS7中,使用定位服务需手动引入Core Location框架;

         需引用<CoreLocation/CoreLocation.h>、<CoreLocation/CLLocationManager.h>两个头文件;

         并遵循 CLLocationMangerDelegate 协议。


         1、获取当前位置信息(经纬度,海拔)

          a.首先在接口中声明两个变量

@interface LLViewController (){    CLLocationManager *locationManger;              // 位置管理器    CLLocation *location;                           // 位置信息}

               * CLLocationManger 用于定位服务管理类,他能够给我们提供位置信息和高度信息,也可以监控设备进入或离开某个区域,还可获取设备的运行方向

          * CLLocation  该类封装了位置和高度信息

          b.初始化CLLocationManger对象

- (void)viewDidLoad{    [super viewDidLoad];    locationManger = [[CLLocationManager alloc] init];    locationManger.delegate = self;    locationManger.desiredAccuracy = kCLLocationAccuracyBest;           // 定位精度    locationManger.distanceFilter = 1000.0f;                            // 距离过滤器(位置移动了足够距离才会通知委托程序)}

              定位精度有以下6个常量:

                kCLLocationAccuracyNearestTenMeters        精确到10米

                kCLLocationAccuracyHundredMeters             精确到100米

                kCLLocationAccuracyKilometers                     精确到1000米

                kCLLocationAccuracyThreeKilometers            精确到3000米

                kCLLocationAccuracyBest                               设备使用电池供电时的最高精度

                kCLLocationAccuracyBestForNavigation         导航状态下的最高经度,一般有外接电源时才能使用  

        定位精度的含义是,在位置变化了指定距离后,才发出一次通知。

        c.开始定位与结束定位

- (void) viewWillAppear:(BOOL)animated{    // 在试图控制器正常显示时定位    [super viewWillAppear:animated];    [locationManger startUpdatingLocation];}- (void) viewWillDisappear:(BOOL)animated{    // 关闭定位    [super viewWillDisappear:animated];    [locationManger stopUpdatingLocation];}

    

            d.实现协议

        主要使用以下两个方法

- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{    location = [locations lastObject];    _longitude.text = [NSString stringWithFormat:@"%3.5f", location.coordinate.longitude];  <span style="white-space:pre"></span>// 经度    _latitude.text = [NSString stringWithFormat:@"%3.5f", location.coordinate.latitude];<span style="white-space:pre"></span>// 纬度    _hight.text = [NSString stringWithFormat:@"%3.5f", location.altitude];<span style="white-space:pre"></span>// 海拔}- (void) locationManager: (CLLocationManager *)manager didFailWithError:(NSError *)error{    NSLog(@"error: %@", error);}

              其中,coordinate 是一个封装了经度和纬度的结构体,定义如下

          typedef struct{

                   CLLocationDegrees latitude;

                   CLLocationDegress longtitude;

           } CLLocationCoordinate2D;

        2.地理信息反编码(提供经纬度,查询地址信息)

        地理信息反编码使用CLGeocoder类实现,该类能够实现地址坐标与地理蚊子描述信息之间的转换。CLGeocoder类中进行地理信息反编码的方法是:

           - (void) reverseGeocodeLocation:(CLLocation *)location 

                                  completionHander:^(NSArray *placemarks, NSError *error)completionHandler;

        下为代码,此处是按键触发现实地理信息。

- (IBAction)find:(id)sender {    //创建位置    CLGeocoder *geocoder = [[CLGeocoder alloc] init];    [geocoder reverseGeocodeLocation: location completionHandler:^(NSArray *array, NSError *error) {        if (array.count > 0) {            CLPlacemark *placemark = [array objectAtIndex:0];            NSString *pos_str = [NSString stringWithFormat:@" country: %@\n postalCode: %@\n ISOcountryCode: %@\n ocean: %@\n inlandWater: %@\n locality: %@\n subLocality: %@\n administrativeArea: %@\n subAdministrativeArea: %@\n thoroughfare: %@\n subThoroughfare: %@\n name: %@\n ",                       placemark.country,                   // 国家                       placemark.postalCode,                // 邮政编码                       placemark.ISOcountryCode,            // iso国家代号                       placemark.ocean,                     // 海洋                       placemark.inlandWater,               // 内陆水域                       placemark.administrativeArea,        // 行政区域信息                       placemark.subAdministrativeArea,     // 行政区域附加信息                       placemark.locality,                  // 指定城市信息                       placemark.subLocality,               // 指定城市附加信息                       placemark.thoroughfare,              // 指定街道级别信息                       placemark.subThoroughfare,           // 指定街道级别附加信息                       placemark.name];                     // 详细地址            self.pos.text = pos_str;        }        else{            self.pos.text = @"error";        }    }];}

        3.地理信息编码查询

          仍然使用CLGeocoder类,地理信息查询的常用方法有以下三个:

     geocodeAddressString:(NSString *) completionHandler:^(NSArray *placemarks, NSError *error)completionHandler

        // 通过字符串参数进行查询

     geocodeAddressString:(NSString *) inRegion:(CLRegion *) completionHandler:^(NSArray *placemarks, NSError *error)completionHandler

        // 通过指定字符串和查询范围作为参数进行查询

     geocodeAddressDictionary:(NSDictionary *) completionHandler:^(NSArray *placemarks, NSError *error)completionHandler

        // 通过一个地址信息字典对象参数进行查询
   
     下为代码:
- (IBAction)search:(id)sender {    CLGeocoder *geocoder = [[CLGeocoder alloc] init];    [geocoder geocodeAddressString:_seach_str.text completionHandler:^(NSArray *array, NSError *error){        if (array.count > 0) {            CLPlacemark *placemark = [array objectAtIndex:0];            CLLocationCoordinate2D coordinate = placemark.location.coordinate;                        NSString *pos_str = [NSString stringWithFormat:@" longtitude: %f\n latitude: %f\n",                                 coordinate.longitude,                                 coordinate.latitude];            self.pos.text = pos_str;        }        else{            self.pos.text = @"Sorry, Not Found!";        }    }];}











0 0
原创粉丝点击