博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS:高德地图的使用
阅读量:5946 次
发布时间:2019-06-19

本文共 6487 字,大约阅读时间需要 21 分钟。

本人花了点时间集成了高德地图的几乎所有的功能,包含:地图的显示、地图的绘制、地图的定位、地图的POI数据检索、地图的线路规划、地图导航等下载地址如下:,觉得有用就点个star吧!!!

一、介绍

地图定位技术越来越成熟,包括定位(地理编码和反编码)、跟踪(围栏和区域)、POI检索、导航、路线规划(出行)等等,极大的方便了人们的衣食住行。当然,做地图SDK的公司不在少数。其中最出名的当属百度的百度地图、阿里的高德地图,他们的SDK都做的很不错,封装性高,集成简单。做过百度地图,现在来搞搞高德地图,据说更灵敏性。

 

二、准备

(1)去高德地图开发网站注册账号并登陆:

(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在后台进行定位)

文档链接:

<3>持续定位(app启动后会一直定位)

文档链接:

<4>地理围栏(当设备进入、离开该区域时,可以接收到消息通知)

文档链接:

<5>位置区域判断(判断是否在大陆或以外区域)

文档链接:

 ...........

 ...........

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

 

六、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:

 

本人花了点时间集成了高德地图的几乎所有的功能,包含:地图的显示、地图的绘制、地图的定位、地图的POI数据检索、地图的线路规划、地图导航等下载地址如下:,觉得有用就点个star吧!!!

 

转载地址:http://wkbxx.baihongyu.com/

你可能感兴趣的文章
超短reads(primer、barcode、UMI、index等)比对方法
查看>>
lua正则表达式如何匹配中文
查看>>
arcgis api for js热力图优化篇-不依赖地图服务
查看>>
php逻辑操作符中&和&&的异同
查看>>
Git 远程仓库(分布式版本控制系统)
查看>>
设计模式原则之里氏替换原则
查看>>
LeetCode: Longest Common Prefix 解题报告
查看>>
Multipart polyline to single part lines
查看>>
zeromq_传说中最快的消息队列
查看>>
ARM的栈指令
查看>>
两个tomcat一起启动
查看>>
javax.imageio.IIOException: Unsupported Image Type
查看>>
Oracle DBA之监听的静态注册与动态注册
查看>>
Oracle Golden Gate 系列十七 -- GG 一对多 real-time data distribution 说明 与 示例
查看>>
大照片背景在网页设计中应用的精美作品范例(下篇)
查看>>
Realtek 8192cu win8 驱动
查看>>
property 中的strong 与weak
查看>>
使用HDFS java api 创建文件出错。
查看>>
支持多个文档类型的文档视结构程序
查看>>
【原创】FIFO的基础和时序分析学习
查看>>