在iOS7中,使用定位服务需手动引入Core Location框架;
需引用<CoreLocation/CoreLocation.h>、<CoreLocation/CLLocationManager.h>两个头文件;
并遵循 CLLocationMangerDelegate 协议。
1、获取当前位置信息(经纬度,海拔)
a.首先在接口中声明两个变量
@interface LLViewController () { CLLocationManager *locationManger; // 位置管理器 CLLocation *location; // 位置信息 }
* CLLocation 该类封装了位置和高度信息
b.初始化CLLocationManger对象
- (void)viewDidLoad { [super viewDidLoad]; locationManger = [[CLLocationManager alloc] init]; locationManger.delegate = self; locationManger.desiredAccuracy = kCLLocationAccuracyBest; // 定位精度 locationManger.distanceFilter = 1000.0f; // 距离过滤器(位置移动了足够距离才会通知委托程序) }
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); }
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"; } }]; }
仍然使用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!"; } }]; }