iOS:高德地圖的使用

本人花了點時間集成了高德地圖的幾乎全部的功能,包含:地圖的顯示、地圖的繪製、地圖的定位、地圖的POI數據檢索、地圖的線路規劃、地圖導航等下載地址以下https://github.com/xiayuanquan/AliMapKit.git,以爲有用就點個star吧!!!

1、介紹

地圖定位技術愈來愈成熟,包括定位(地理編碼和反編碼)、跟蹤(圍欄和區域)、POI檢索、導航、路線規劃(出行)等等,極大的方便了人們的衣食住行。固然,作地圖SDK的公司不在少數。其中最出名的當屬百度的百度地圖、阿里的高德地圖,他們的SDK都作的很不錯,封裝性高,集成簡單。作過百度地圖,如今來搞搞高德地圖,聽說更靈敏性。ios

 

2、準備

(1)去高德地圖開發網站註冊帳號並登錄:http://lbs.amap.comgit

(2)去控制檯建立應用,獲取AppKey,在代碼中須要使用它激活SDKgithub

(3)去開發文檔中,找到iOS這塊的地圖相關技術,點進行按照文檔步驟一步步集成便可(包含各類功能,絕對夠你用)api

 

3、在plist配置字段

 定位權限

NSLocationAlwaysUsageDescription:一直定位
NSLocationWhenInUseUsageDescription:須要時定位

 ATS設置:Https協議

 

4、下載SDK,開始集成

建議使用pod集成,安全快速,它會自動幫你添加各類依賴庫安全

Podfileapp

platform :ios, '8.0' #手機的系統
target 'YourProjectTarget' do #工程名字
pod 'AMapLocation'  #定位 SDK
end

teminal終端安裝ide

$pod install  //安裝

 

5、開始使用(文檔寫的至關具體,使用過程都差很少,手賤隨便寫了一個過程,看文檔看文檔。。。。。。。)

<1>單次定位(app啓動後只會定位一次)測試

引入頭文件

//引入AMapFoundationKit.h和AMapLocationKit.h這兩個頭文件:
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>

配置Key

//在調用定位時,須要添加Key,須要注意的是請在 SDK 任何類的初始化以及方法調用以前設置正確的 Key。
//若是您使用的是定位SDK v2.x版本須要引入基礎 SDK AMapLocationKit.framework ,設置apiKey的方式以下:
 //iOS 定位SDK v2.x版本設置 Key:
[AMapServices sharedServices].apiKey =@"您的key";
//若是您使用的是定位SDK v1.x版本,請您儘快更新。

//iOS 定位SDK v1.x版本設置 Key:
[AMapLocationServices sharedServices].apiKey =@"您的key";

設置指望定位精度

//因爲蘋果系統的首次定位結果爲粗定位,其可能沒法知足須要高精度定位的場景//因此,高德提供了 kCLLocationAccuracyBest 參數,設置該參數能夠獲取到精度在10m左右的定位結果,可是相應的須要付出比較長的時間(10s左右),越高的精度須要持續定位時間越長。
//推薦:kCLLocationAccuracyHundredMeters,一次還不錯的定位,誤差在百米左右,超時時間設置在2s-3s左右便可。

//高精度:kCLLocationAccuracyBest,能夠獲取精度很高的一次定位,誤差在十米左右,超時時間請設置到10s,若是到達10s時沒有獲取到足夠精度的定位結果,會回調當前精度最高的結果。
//帶逆地理信息的一次定位(返回座標和地址信息)
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
//定位超時時間,最低2s,此處設置爲2s self.locationManager.locationTimeout =2;
//逆地理請求超時時間,最低2s,此處設置爲2s self.locationManager.reGeocodeTimeout = 2;
//帶逆地理信息的一次定位(返回座標和地址信息) [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
//定位超時時間,最低2s,此處設置爲10s self.locationManager.locationTimeout =10;
//逆地理請求超時時間,最低2s,此處設置爲10s self.locationManager.reGeocodeTimeout = 10;

請求定位並拿到結果

//調用 AMapLocationManager 的 requestLocationWithReGeocode:completionBlock: 方法,請求一次定位。
//您能夠選擇在一次定位時是否返回地址信息(須要聯網)。如下是請求帶逆地理信息的一次定位,代碼以下:
//帶逆地理(返回座標和地址信息)。將下面代碼中的 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);
        }
    }];

<2>後臺定位(app在後臺進行定位)

文檔連接:http://lbs.amap.com/api/ios-location-sdk/guide/get-location/backgroundlocation/#header-file網站

<3>持續定位(app啓動後會一直定位)

文檔連接:http://lbs.amap.com/api/ios-location-sdk/guide/get-location/seriallocation/ui

<4>地理圍欄(當設備進入、離開該區域時,能夠接收到消息通知)

文檔連接:http://lbs.amap.com/api/ios-location-sdk/guide/additional-func/local-geofence/

<5>位置區域判斷(判斷是否在大陸或之外區域)

文檔連接:http://lbs.amap.com/api/ios-location-sdk/guide/additional-func/amap-calculate-tool/

 ...........

 ...........

 ...........等等

 

6、SDK中幾個重要的頭文件介紹

注意1:這裏面介紹的POI是使用高德地圖App本身的功能,在plist配置後,真機測試時會自動打開該app

注意2:這裏面介紹的POI是自定義檢索(通常都是用這個)

 注意3:這裏面介紹的是導航所用所有類文件

7、我在項目中用到的定位

給AppDelete建立了一個分類,運行時綁定屬性。app啓動後能夠在須要的地方啓動定位,而後經過block能夠回傳到任何須要經緯度位置的控制器中

.h文件

//
//  AppDelegate+DDLocation.h
//  BiaoJiePay
//
//  Created by 夏遠全 on 16/11/21.
//  Copyright © 2016年 廣州東德科技. All rights reserved.
//

#import "AppDelegate.h"

/**
 *  聲明block,傳遞經緯度、反編碼、定位是否成功、顯示框
 */
typedef void (^LocationPosition)(CLLocation *currentLocation,AMapLocationReGeocode *regeocode,BOOL isLocationSuccess,MBProgressHUD *hud);

@interface AppDelegate (DDLocation)

@property (copy,nonatomic)LocationPosition locationBlock;          //定位到位置的block
@property (strong,nonatomic)AMapLocationManager *locationManager;  //管理者

//啓動定位服務
-(void)startLocation;

//接收位置block
-(void)receiveLocationBlock:(LocationPosition)block;

@end

.m文件

//
//  AppDelegate+DDLocation.m
//  BiaoJiePay
//
//  Created by 夏遠全 on 16/11/21.
//  Copyright © 2016年 廣州東德科技. All rights reserved.
//

#import "AppDelegate+DDLocation.h"

static const NSString *locationBlockKey   = @"locationBlockKey";
static const NSString *locationManagerKey = @"locationManagerKey";

@implementation AppDelegate (DDLocation)

/**
 *  動態關聯屬性
 */
-(void)setLocationBlock:(LocationPosition)locationBlock{
    
    objc_setAssociatedObject(self, &locationBlockKey , locationBlock, OBJC_ASSOCIATION_RETAIN);
}

-(LocationPosition)locationBlock{
    
    return objc_getAssociatedObject(self, &locationBlockKey);
}

-(void)setLocationManager:(AMapLocationManager *)locationManager{
    
     objc_setAssociatedObject(self, &locationManagerKey , locationManager, OBJC_ASSOCIATION_RETAIN);
}

-(AMapLocationManager *)locationManager{
    
    return objc_getAssociatedObject(self, &locationManagerKey);
}

/**
 *  啓動定位服務
 */
-(void)startLocation{
    
    //一、註冊高德地圖APPKey
    [AMapServices sharedServices].apiKey = @"ff223cc0xxxxxxxxxxxx";
    
    //二、設置定位精度
    self.locationManager = [[AMapLocationManager alloc] init];
    // 帶逆地理信息的一次定位(返回座標和地址信息)
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
    // 定位超時時間,最低2s,此處設置爲2s
    self.locationManager.locationTimeout = 2;
    // 逆地理請求超時時間,最低2s,此處設置爲2s
    self.locationManager.reGeocodeTimeout = 2;
    
    
    //3.建立定位管理者
    //帶逆地理(返回座標和地址信息。將下面代碼中的 YES改爲NO,則不會返回地址信息。
    MBProgressHUD *hud = [MBProgressHUD showMessage:@"正在定位"];
    [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
        
        if (error){
            if (error.code == AMapLocationErrorLocateFailed){
                self.locationBlock(nil, nil, NO, nil); return;
            }
        }
        NSDDLog(@"經度longitude:%f",location.coordinate.longitude); //經度
        NSLog(@"緯度latitude:%f",location.coordinate.latitude);   //緯度
        //逆向編碼、傳值(定位成功)
        NSLog(@"位置:%@",regeocode);
        if(regeocode){ self.locationBlock(location, regeocode, YES, nil); }
    }];
}

//接收block
-(void)receiveLocationBlock:(LocationPosition)block{
    if (block) {
       self.locationBlock = [block copy];
    }
}
@end

 在控制器獲取位置

//獲取當前城市和經緯度
[appdelegate receiveLocationBlock:^(CLLocation *currentLocation, AMapLocationReGeocode *regeocode, BOOL isLocationSuccess, XYQProgressHUD *hud) {
   [hud hide:YES];
   if(isLocationSuccess) {
      [MBProgressHUD showSuccess:@"定位成功"];
      if(regeocode.city){
           [_leftItem setPulicTitle:[regeocode.city substringToIndex:2]];//顯示當前城市
       }
      }else{
           [MBProgressHUD showError:@"定位失敗"];//顯示默認城市
      }
      self.currentLocation = currentLocation;
      self.currentCity = [regeocode.city copy];
 }];

 

註明:本人原創,但願有幫助

歡迎關注github:https://github.com/xiayuanquan

 

本人花了點時間集成了高德地圖的幾乎全部的功能,包含:地圖的顯示、地圖的繪製、地圖的定位、地圖的POI數據檢索、地圖的線路規劃、地圖導航等下載地址以下:https://github.com/xiayuanquan/AliMapKit.git以爲有用就點個star吧!!!

相關文章
相關標籤/搜索