ios学习笔记—— 定位服务

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

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

         并遵循 CLLocationMangerDelegate 协议。

ios学习笔记—— 定位服务_第1张图片 ios学习笔记—— 定位服务_第2张图片

         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!";
        }
    }];
}











你可能感兴趣的:(ios)