在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!";
}
}];
}
本文详细介绍iOS7中如何使用定位服务,包括引入CoreLocation框架、实现CLLocationManagerDelegate协议、获取当前位置信息、地理信息反编码及编码查询等核心功能。

被折叠的 条评论
为什么被折叠?



