iOS 高德地圖的使用

iOS:高德地圖的使用

本人花了點時間集成了高德地圖的幾乎所有的功能,包含:地圖的顯示、地圖的繪制、地圖的定位、地圖的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'#定位 SDKend

teminal終端安裝

$pod install//安裝

五、開始使用(文檔寫的相當具體,使用過程都差不多,手賤隨便寫了一個過程,看文檔看文檔。。。。。。。)

<1>單次定位(app啟動后只會定位一次)

引入頭文件

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

配置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,此處設置為2sself.locationManager.locationTimeout =2;

//逆地理請求超時時間,最低2s,此處設置為2sself.locationManager.reGeocodeTimeout =2;

//帶逆地理信息的一次定位(返回坐標和地址信息)[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

//定位超時時間,最低2s,此處設置為10sself.locationManager.locationTimeout =10;

//逆地理請求超時時間,最低2s,此處設置為10sself.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,傳遞經緯度、反編碼、定位是否成功、顯示框*/typedefvoid(^LocationPosition)(CLLocation *currentLocation,AMapLocationReGeocode *regeocode,BOOL isLocationSuccess,MBProgressHUD *hud);@interfaceAppDelegate (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"staticconstNSString *locationBlockKey? =@"locationBlockKey";staticconstNSString *locationManagerKey =@"locationManagerKey";@implementationAppDelegate (DDLocation)/**

*? 動態關聯屬性*/-(void)setLocationBlock:(LocationPosition)locationBlock{

objc_setAssociatedObject(self,&locationBlockKey , locationBlock, OBJC_ASSOCIATION_RETAIN);

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

}-(void)setLocationManager:(AMapLocationManager *)locationManager{

objc_setAssociatedObject(self,&locationManagerKey , locationManager, OBJC_ASSOCIATION_RETAIN);

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

}/**

*? 啟動定位服務*/-(void)startLocation{//1、注冊高德地圖APPKey[AMapServices sharedServices].apiKey =@"ff223cc0xxxxxxxxxxxx";//2、設置定位精度self.locationManager =[[AMapLocationManager alloc] init];//帶逆地理信息的一次定位(返回坐標和地址信息)[self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];//定位超時時間,最低2s,此處設置為2sself.locationManager.locationTimeout =2;//逆地理請求超時時間,最低2s,此處設置為2sself.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];

}];

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容