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阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容