高德SDK简介
高德开放平台将高德最专业的定位、地图、搜索、导航等能力,以API等形式向广大开发者免费开放。高德SDK包括如下几个子模块:
- 地图SDK:高德地图 iOS SDK 是一套基于 iOS 7.0 及以上版本的地图应用程序开发接口,供开发者在自己的iOS应用中加入地图相关的功能,包括:地图显示(含室内、室外地图)、与地图交互、在地图上绘制、兴趣点搜索、地理编码、离线地图等功能。
- 定位SDK:高德 iOS 定位 SDK 提供了不依赖于地图定位的定位功能,开发者可以无地图显示的场景中便捷地为应用程序添加定位功能。iOS定位SDK提供了单次定位、连续定位、逆地理信息、地理围栏等功能。
- 导航SDK:高德iOS 导航 SDK 是一款针对在线导航的产品,产品功能涵盖路径规划、模拟导航、GPS 定位、自定义导航界面、获取导航播报信息等。此外,该产品的导航路径计算与实时交通信息相结合,力求为用户提供更加合理、准确、人性化的导航服务。
- 室内地图SDK:高德 iOS 室内地图SDK 是一套室内地图开发调用接口,供开发者在自己的iOS应用中加入室内地图相关的功能。开发者可以轻松地开发出室内地图显示与操作、兴趣点搜索、室内路线规划等功能。
- 室内定位SDK:高德 iOS 室内定位SDK 是由高德室内地图部和阿里智能生活事业部联合出品的一套室内定位开发调用接口,供开发者在iOS应用中加入室内定位相关的功能。通过基于WIFI、蓝牙以及PDR的室内定位技术,可实现平滑的1-8米的定位效果和精度。
高德地图Key申请
使用高德地图SDK之前,我们首先需要在高德官网申请应用Key。申请应用Key有如下步骤:
登录高德地图官网,注册用户并登录,注册地址:https://id.amap.com/register
创建应用。登录高德地图开发者中心后,点击【创建新应用】,填写应用的基本信息后,应用创建成功。
创建应用Key。点击某个应用右侧的【+添加新Key】,填写信息后,即可生成一个Key。
高德地图SDK的安装
高德地图SDK的安装支持使用CocoaPods安装以及手工安装。由于使用手工方式安装需要额外添加很多的依赖库,所以我们推荐使用CocoaPods进行安装。
1、首先为工程创建一个 Podfile。在项目目录中(.xcodeproj)打开一个终端,创建一个名为 Podfile 文件。如果您尚未创建 Xcode 项目,请立即创建一个并将其保存到您的本地计算机。
touch Podfile
2、编辑 Podfile 文件,并保存。 Podfile文件中导入所需要的高德SDK子框架。注意:使用任何SDK都会自动引入基础 SDK ,涉及到提交AppStore成功与否。
platform :ios, '7.0' #手机的系统
target 'YourProjectTarget' do
pod 'AMap3DMap' #3D地图SDK
#pod 'AMap2DMap' #2D地图SDK (2D和3D不能同时使⽤用)
pod 'AMapSearch' #搜索功能
end
3、运行 pod install 命令安装SDK。
pod install
了解:
$pod install --repo-update
了解:更新 SDK。如果安装的SDK不是最新版,请执行下面的代码进行更新。
pod repo update
5、关闭 Xcode,然后打开项目的 .xcworkspace 文件以启动 Xcode。 从此刻开始,必须使用 .xcworkspace 文件打开项目。
其他配置
由于高德地图SDK在使用过程中需要获取用户的位置,因此需要在info.plist文件中添加请求获取位置的提示信息。
从iOS9开始,苹果为了增强数据访问安全,将所有的http请求都改为了https,为了能够在iOS9以上版本中正常使用地图SDK,还需要在"Info.plist"中添加如下配置,否则影响SDK的使用。
配置高德Key至AppDelegate.m文件。将前面获取的高德Key,配置到代码中,以保证地图功能的正常运行。代码如下:
#import <AMapFoundationKit/AMapFoundationKit.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[AMapServices sharedServices].apiKey = @"682c4d6dbbced34ca800793eda3f5a89"; //替换成你的Key
return YES;
}
地图SDK简介
高德地图所提供的SDK中,地图SDK是用于提供地图展示相关功能的SDK,其可以提供地图显示(含室内、室外地图)、与地图交互、在地图上绘制、兴趣点搜索、地理编码、离线地图等功能。
MAMapView类简介
MAMapView类是高德地图提供的用于展示地图的类,其与MapKit框架中的MKMapView功能是类似的,但其提供的功能更加强大。在MAMapView类中,提供了如下一些比较常用的属性和方法。
地图类型。除了普通地图以及卫星图之外,高德地图还提供夜间视图、导航视图以及公交视图等多种类型的地图
@property (nonatomic) MAMapType mapType;
当前地图的中心点,改变该值时,地图的比例尺级别不会发生变化
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
当前地图的经纬度范围,设定的该范围可能会被调整为适合地图窗口显示的范围
@property (nonatomic) MACoordinateRegion region;
是否显示用户位置
@property (nonatomic) BOOL showsUserLocation;
向地图窗口添加标注,需要实现MAMapViewDelegate的-mapView:viewForAnnotation:函数来生成标注对应的View
- (void)addAnnotation:(id <MAAnnotation>)annotation;
简单使用
#import "ViewController.h"
#import<MAMapKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
@interface ViewController ()<MAMapViewDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//实例化MAMapView对象
MAMapView *mapView=[[MAMapView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds))];
//设置代理
mapView.delegate=self;
//设置地图类型
mapView.mapType=MAMapTypeStandard;
//定位以后改变地图的图层显示
//[mapView setUserTrackingMode:MAUserTrackingModeFollow animated:YES];
//添加到控制器的view上
[self.view addSubview:mapView];
}
绘制地图标注
同MapKit框架类似,使用高德地图SDK也可以在地图上添加标注。标注可以精确表示用户需要展示的位置信息,高德地图SDK提供的标注功能允许用户自定义图标和信息窗,同时提供了标注的点击、拖动事件的回调。高德地图SDK提供的地图标注为MAAnnotation类,不同的标记可以根据图标和改变信息窗的样式和内容加以区分。
举例:默认样式标注点
高德地图SDK提供的大头针标注MAPinAnnotationView,通过它可以设置大头针颜色、是否显示动画、是否支持长按后拖拽大头针改变坐标等。在地图上添加大头针标注的步骤如下:
实现MAMapViewDelegate协议中的 mapView:viewForAnnotation:回调函数,设置标注样式。
-(void)addPin{
//添加大头针
MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];
pointAnnotation.coordinate = CLLocationCoordinate2DMake(32.03522, 118.74237);
pointAnnotation.title = @"侵华日军南京大屠杀遇难同胞纪念馆";
pointAnnotation.subtitle = @"水西门大街418号";
[self.mapView addAnnotation:pointAnnotation];
self.mapView.centerCoordinate = pointAnnotation.coordinate;
}
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id <MAAnnotation>)annotation
{
if ([annotation isKindOfClass:[MAPointAnnotation class]])
{
static NSString *pointReuseIndentifier = @"pointReuseIndentifier";
MAPinAnnotationView*annotationView = (MAPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:pointReuseIndentifier];
if (annotationView == nil)
{
annotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndentifier];
}
annotationView.canShowCallout= YES; //设置气泡可以弹出,默认为NO
annotationView.animatesDrop = YES; //设置标注动画显示,默认为NO
annotationView.draggable = YES; //设置标注可以拖动,默认为NO
annotationView.pinColor = MAPinAnnotationColorPurple;
return annotationView;
}
return nil;
}
定位SDK
需真机调试。
高德定位SDK提供了不依赖于地图定位的定位功能,开发者可以无地图显示的场景中便捷地为应用程序添加定位功能。定位SDK提供了单次定位、连续定位、逆地理信息、地理围栏等功能。
本节以单次定位为例介绍一下高德定位SDK的使用方法。定位SDK提供的单次定位方法基于苹果定位核心,苹果定位核心会在设备移动时连续返回定位结果,高德在此基础上封装了单次定位。当设备可以正常联网时,还可以返回该定位点的对应的中国境内位置信息(包括:省、市、区/县以及详细地址)。
- 引入头文件。在调用定位功能的类中引入AMapFoundationKit.h和AMapLocationKit.h这两个头文件。
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
- 配置Key。在AppDelegate.m文件中,登记提前申请的Key。
[AMapServices sharedServices].apiKey =@"您的key";
- 设置期望定位精度。由于苹果系统的首次定位结果为粗定位,其可能无法满足需要高精度定位的场景。所以,高德提供了 kCLLocationAccuracyBest 参数,设置该参数可以获取到精度在10m左右的定位结果,但是相应的需要付出比较长的时间(10s左右),越高的精度需要持续定位时间越长。推荐使用kCLLocationAccuracyHundredMeters,偏差在百米左右,基本满足绝大多数应用的精度要求,超时时间设置在2s-3s左右即可。
调用AMapLocationManager类的requestLocationWithReGeocode:completionBlock: 方法,请求一次定位。另外,在联网条件下,还可以选择在一次定位时是否返回地址信息。以下是请求带逆地理信息的一次定位,代码如下:
@property(nonatomic,strong)AMapLocationManager *locationManage;
/* 定位 */
- (AMapLocationManager *)locationManage{
if (_locationManage==nil) {
_locationManage=[[AMapLocationManager alloc]init];
//带逆地图信息的一次定位(返回坐标和地址信息)
[_locationManage setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
//定位超时时间,最低2s,此处设置为2s
_locationManage.locationTimeout=2;
//逆地图请求超时时间,最低2s,此处设置为2秒
_locationManage.reGeocodeTimeout=2;
}
return _locationManage;
}
-(void)requestLocation{
//带逆地理(返回坐标和地址信息)。将下面代码中的YES改成NO,则不会返回地址信息
[self.locationManage 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);
}
}];
}
代码
过大,去掉了pod生成的文件,保留了Podfile
https://github.com/ShaeZhuJiu/AMMap_base.git