免费开源的iOS开发学习平台

高德地图SDK:5-定位SDK

高德定位SDK提供了不依赖于地图定位的定位功能,开发者可以无地图显示的场景中便捷地为应用程序添加定位功能。定位SDK提供了单次定位、连续定位、逆地理信息、地理围栏等功能。

本节以单次定位为例介绍一下高德定位SDK的使用方法。定位SDK提供的单次定位方法基于苹果定位核心,苹果定位核心会在设备移动时连续返回定位结果,高德在此基础上封装了单次定位。当设备可以正常联网时,还可以返回该定位点的对应的中国境内位置信息(包括:省、市、区/县以及详细地址)。

  • 引入头文件。在调用定位功能的类中引入AMapFoundationKit.h和AMapLocationKit.h这两个头文件。
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
  • 配置Key。在AppDelegate.m文件中,登记提前申请的Key。
[AMapServices sharedServices].apiKey =@"您的key";
  • 设置期望定位精度。由于苹果系统的首次定位结果为粗定位,其可能无法满足需要高精度定位的场景。所以,高德提供了 kCLLocationAccuracyBest 参数,设置该参数可以获取到精度在10m左右的定位结果,但是相应的需要付出比较长的时间(10s左右),越高的精度需要持续定位时间越长。推荐使用kCLLocationAccuracyHundredMeters,偏差在百米左右,基本满足绝大多数应用的精度要求,超时时间设置在2s-3s左右即可。
-(AMapLocationManager *)locationManager{
    if (_locationManager == nil) {
        _locationManager = [[AMapLocationManager alloc] init];
        // 带逆地理信息的一次定位(返回坐标和地址信息)
        [_locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
        //   定位超时时间,最低2s,此处设置为2s
        _locationManager.locationTimeout =2;
        //   逆地理请求超时时间,最低2s,此处设置为2s
        _locationManager.reGeocodeTimeout = 2;
    }
    return _locationManager;
}
  • 请求定位并拿到结果

调用AMapLocationManager类的requestLocationWithReGeocode:completionBlock: 方法,请求一次定位。另外,在联网条件下,还可以选择在一次定位时是否返回地址信息。以下是请求带逆地理信息的一次定位,代码如下:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    // 带逆地理(返回坐标和地址信息)。将下面代码中的 YES 改成 NO ,则不会返回地址信息。
    [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
        if (error)
        {
            NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
            if (error.code == AMapLocationErrorLocateFailed)
            {
                return;
            }
        }
        NSLog(@"location:%@", location);
        
        if (regeocode)
        {
            NSLog(@"reGeocode:%@", regeocode);
        }
    }];
}