本人花了點時間集成了高德地圖的幾乎所有的功能,包含:地圖的顯示、地圖的繪制、地圖的定位、地圖的POI數據檢索、地圖的線路規划、地圖導航等下載地址如下:https://github.com/xiayuanquan/AliMapKit.git,覺得有用就點個star吧!!!
一、介紹
地圖定位技術越來越成熟,包括定位(地理編碼和反編碼)、跟蹤(圍欄和區域)、POI檢索、導航、路線規划(出行)等等,極大的方便了人們的衣食住行。當然,做地圖SDK的公司不在少數。其中最出名的當屬百度的百度地圖、阿里的高德地圖,他們的SDK都做的很不錯,封裝性高,集成簡單。做過百度地圖,現在來搞搞高德地圖,據說更靈敏性。
二、准備
(1)去高德地圖開發網站注冊賬號並登陸:http://lbs.amap.com
(2)去控制台創建應用,獲取AppKey,在代碼中需要使用它激活SDK

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

三、在plist配置字段
定位權限
NSLocationAlwaysUsageDescription:一直定位
NSLocationWhenInUseUsageDescription:需要時定位

ATS設置:Https協議

四、下載SDK,開始集成
建議使用pod集成,安全快速,它會自動幫你添加各種依賴庫
Podfile
platform :ios, '8.0' #手機的系統 target 'YourProjectTarget' do #工程名字 pod 'AMapLocation' #定位 SDK end
teminal終端安裝
$pod install //安裝
五、開始使用(文檔寫的相當具體,使用過程都差不多,手賤隨便寫了一個過程,看文檔看文檔。。。。。。。)
<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/
<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/
...........
...........
...........等等
六、SDK中幾個重要的頭文件介紹
注意1:這里面介紹的POI是使用高德地圖App自己的功能,在plist配置后,真機測試時會自動打開該app

注意2:這里面介紹的POI是自定義檢索(一般都是用這個)

注意3:這里面介紹的是導航所用全部類文件

七、我在項目中用到的定位
給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{ //1、注冊高德地圖APPKey [AMapServices sharedServices].apiKey = @"ff223cc0xxxxxxxxxxxx"; //2、設置定位精度 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吧!!!
