芒果iOS开发之定位、地理编码

主要内容:

一、CLLocationManager定位

二、CLGeocoder地理编码


一、CLLocationManager

定位功能几乎是现在所有应用程序都包含的一个功能,在iOS中通过Core Location框架进行定位操作。Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图开发要配合定位框架使用。在Core Location中主要包含了定位、地理编码(包括反编码)功能。

使用步骤:

1、定义一个CLLocationManager的对象:

//定位
    CLLocationManager *_locationManager;

2、初始化CLLocationManager对象:

    _locationManager = [[CLLocationManager alloc] init];

3.判断定位服务是否可用:

if (![CLLocationManager locationServicesEnabled]) {
        ZMYLog(@"定位服务当前可能尚未打开,请设置打开!");
    }

4.如果用户没有授权则请求用户授权定位服务,如果用户已经授权则设置定位相关操作:

4.1设置代理

4.2设置定位精度

4.3设置定位频率

4.4启动定位服务

//如果没有授权则请求用户授权
    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
        [_locationManager requestWhenInUseAuthorization];
    } else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) {
        //设置代理
        _locationManager.delegate = self;
        //设置定位精度,精度越高越耗电
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        //定位频率,每隔多少米定位一次
        CLLocationDistance distance = 10.0;
        _locationManager.distanceFilter = distance;
        //启动跟踪定位
        [_locationManager startUpdatingLocation];
    }

5、遵循CLLocationManager代理协议:

@interface AppDelegate ()<CLLocationManagerDelegate>

6、实现CLLocationManager代理里边方法:

- (void)locationManager:(CLLocationManager *)manager
	 didUpdateLocations:(NSArray<CLLocation *> *)locations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);

7、在代理方法中获取用户位置:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    //取出第一个位置
    CLLocation *location = [locations firstObject];
    //获取坐标
    CLLocationCoordinate2D coordinate = location.coordinate;
    //汉字多了之后就不提示
    ZMYLog(@"经度:%f  维度:%f 海拔:%f 航向:%f行走速度:%f", coordinate.longitude, coordinate.latitude, location.altitude,location.course,location.speed);
    
    //如果不需要实时定位,使用完即使关闭定位服务
    [_locationManager stopUpdatingLocation];
}

特别注意:

iOS8之后如果设置对定位操作进行了修改,如果想要获取用户授权需要在工程的info.plist中添加字段NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription

NSLocationAlwaysUsageDescription 这个是希望在任何时候使用用户位置

NSLocationWhenInUseUsageDescription这个是在应用程序使用期间使用用户位置。

修改如图:

芒果iOS开发之定位、地理编码_第1张图片

如果不添加这个操作,打开软件后不会弹出那个alert窗口


二、CLGeocoder地理编码

除了提供位置跟踪功能之外,在定位服务中还包含CLGeocoder类用于处理地理编码和逆地理编码(又叫反地理编码)功能。

地理编码:根据给定的位置(通常是地名)确定地理坐标(经、纬度)。

逆地理编码:可以根据地理坐标(经、纬度)确定位置信息(街道、门牌等)。

使用步骤:

1、创建一个CLGeocoder对象:

//地理编码
    CLGeocoder *_geocoder;

2、初始化CLGeocoder对象:

    _geocoder = [[CLGeocoder alloc] init];

3、在获取到用户位置(经纬度)后,通过逆地理编码将经纬度转化为实际的地名、街道等信息:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    //取出第一个位置
    CLLocation *location = [locations firstObject];
    //获取坐标
    CLLocationCoordinate2D coordinate = location.coordinate;
    //汉字多了之后就不提示
    ZMYLog(@"经度:%f  维度:%f 海拔:%f 航向:%f行走速度:%f", coordinate.longitude, coordinate.latitude, location.altitude,location.course,location.speed);
    
    [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        CLPlacemark *placeMark = [placemarks firstObject];
        ZMYLog(@"%@", placeMark.addressDictionary);
    }];
    
    //如果不需要实时定位,使用完即使关闭定位服务
    [_locationManager stopUpdatingLocation];
}

4、上一步的addressDictionary中包含了所有的信息,我将他转化为一个plist表更容易看明白,如图:







































































你可能感兴趣的:(地图开发,CLGeocoder,地理编码,芒果iOS之定位)