一:基本地图功能实现
1.申请密钥流程
2.配置环境(重点)
高德地图提供了两种配置方式:
2.1手动配置
2.1.1引入地图库
MAMapKit.framework 文件添加到工程中。
2.1.2引入AMap.bundle资源文件
AMap.bundle资源文件中存储了定位、默认大头针标注视图等图片,可利用这些资源图片进行开发。
左侧目录中选中工程名,在右键菜单中选择Add Files to “工程名”…,从MAMapKit.framework->Resources文件中选择AMap.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。
资源文件不是必须的,可以自定义资源图片。
2.1.3引入系统库
1. UIKit.framework 2D、3D、Search
2. Foundation.framework 2D、3D、Search
3. CoreGraphics.framework 2D、3D、Search
4. QuartzCore.framework 2D、3D
5. OpenGLES.framework 3D
6. CoreLocation.framework 2D、3D
7. CoreTelephony.framework 2D、3D、Search
8. SystemConfiguration.framework 2D、3D、Search
9. libz.dylib 2D、3D、Search
10. libstdc++6.09.dylib 2D、3D、Search
11. Security.framework 2D、3D
2.1.4环境配置
在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。
V2.3.0(含)之前版本不支持arm64,需在 TARGETS->Build Settings->Architectures 点出选择框,选择 “Other”,将默认值修改为 $(ARCHS_STANDARD_32_BIT)。
2.2自动配置,(使用 CocoaPods 安装 SDK)
为 高德 iOS 地图 SDK 创建一个 Podfile,并使用它来安装 SDK。
2.2.1创建Podfile文件
在您当前工程文件(.xcodeproj)所在文件夹下创建一个名为 Podfile 的文件。如果您尚未创建 Xcode 项目,请立即创建一个并将其保存到您的本地计算机。 (如果您第一次接触 iOS 开发,请创建一个Single View Application。)
$ touch Podfile
2.2.2编辑 Podfile 文件
Podfile文件内容如下:
platform :ios, '7.0' #手机的系统 target 'YourProjectTarget' do pod 'AMap3DMap' #3D地图SDK #pod 'AMap2DMap' #2D地图SDK (2D和3D不能同时使用) pod 'AMapSearch' #搜索功能 end
2.2.3运行 pod install 命令安装SDK
$pod install --repo-update
1.1.0版本的pod,运行pod install 不会自动更新repo,如果下载的不是最新版,可使用pod install —repo-update 更新 或 先运行 pod repo update.
2.2.4更新 SDK
如果您安装的SDK不是最新版,请执行下面的代码进行更新。
pod repo update
2.2.5重启 Xcode
关闭Xcode,然后打开(双击)您项目的 .xcworkspace 文件以启动 Xcode。 从此刻开始,您必须使用 .xcworkspace 文件打开项目。
3.地图的使用
3.1配置Info.plist 文件
iOS9为了增强数据访问安全,将所有的http请求都改为了https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true></true>
</dict>
3.2配置高德Key至AppDelegate.m文件
#import <AMapFoundationKit/AMapFoundationKit.h>
//需要引入AMapFoundationKit.h头文件
……
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[AMapServices sharedServices].apiKey = @"您的Key";
……
}
3.3加载地图
在ViewController.m文件相应的方法中进行地图初始化,初始化的步骤:
1.import MAMapKit.h 头文件;
2.构造MAMapView对象;
3.将MAMapView添加到Subview中。
对于3D矢量地图,在 viewDidLoad 方法中添加代码:
#import <MAMapKit/MAMapKit.h>
-(void) viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
///初始化地图
MAMapView *_mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
///把地图添加至view
[self.view addSubview:_mapView];
}
到此地图的基本功能就完成了
Demo地址 如果有所帮助记得关注,点Star
demo中添加了查看路况功能,如果不需要,可以删除。
二:自定义地图功能
在上面功能的基础上我们可以针对需求,自定义地图功能,下面我就列举出常用功能设置方法:
1.地图Logo
默认的Logo为蓝色字样的“高德地图”,显示在地图的左下方。地图Logo不能移除,但可通过MAMapView.logoCenter属性来调整Logo的显示位置。在ViewController.m的viewDidLoad方法添加如下如下:
_mapView.logoCenter = CGPointMake(CGRectGetWidth(self.view.bounds)-55, 450);
2.指南针
指南针默认是开启状态,显示在地图的右上角。
通过MAMapView的showsCompass属性用来控制指南针的可见性。compassOrigin属性可改变指南针的显示位置。在ViewController.m的viewDidLoad方法添加如下如下:
_mapView.showsCompass= YES; // 设置成NO表示关闭指南针;YES表示显示指南针
_mapView.compassOrigin= CGPointMake(_mapView.compassOrigin.x, 22); //设置指南针位置
3.比例尺
比例尺表示地图上两点间距离与实际与之对应的两点距离的比,在不同的缩放级别下,比例尺代表的长度也是不同的。
在iOS SDK中,比例尺默认显示在地图的左上角。MAMapView的showScale属性用来控制比例尺的可见性,scaleOrigin属性用来改变比例尺的显示位置。在ViewController.m的viewDidLoad方法添加如下代码:
_mapView.showScale= YES; //设置成NO表示不显示比例尺;YES表示显示比例尺
_mapView.scaleOrigin= CGPointMake(_mapView.scaleOrigin.x, 22); //设置比例尺位置
4.手势控制
//缩放手势
_mapView.zoomEnabled = NO; //NO表示禁用缩放手势,YES表示开启
//平移(滑动)手势
_mapView.scrollEnabled = NO; //NO表示禁用滑动手势,YES表示开启
//旋转手势(3D)
_mapView.rotateEnabled= NO; //NO表示禁用旋转手势,YES表示开启
//倾斜手势(3D)
_mapView.rotateCameraEnabled= NO; //NO表示禁用倾斜手势,YES表示开启
5.地图操作
地图缩放
地图的缩放级别的范围是[3-19],调用MAMapView的setZoomLevel方法设置地图的缩放级别,用来缩放地图。示例代码如下:
[_mapView setZoomLevel:17.5 animated:YES];
地图平移
[_mapView setCenterCoordinate:center animated:YES];
地图旋转(3D)
旋转角度的范围是[0.f 360.f],以逆时针为正向。示例代码如下:
[_mapView setRotationDegree:60.f animated:YES duration:0.5];
地图倾斜(3D)
倾斜角度范围为[0.f, 45.f],示例代码如下:
[_mapView setCameraDegree:30.f animated:YES duration:0.5];
6.地图截屏
CGRect inRect = CGRectMake(80,142,160,284);
UIImage *screenshotImage = [_mapView takeSnapshotInRect:inRect] ;
7.卫星图
//显示卫星地图
_mapView.mapType = MAMapTypeSatellite;
说明:地图类型切换只需将地图类型设置成相应的类型
8. 实时交通图
显示实时交通路况的代码如下:
_mapView.showTraffic= YES;
9.定位功能
9.1开启定位
_mapView.showsUserLocation = YES; //YES 为打开定位,NO为关闭定位
当位置更新时,会进定位回调,通过回调函数,能获取到定位点的经纬度坐标:
-(void)mapView:(MAMapView*)mapView didUpdateUserLocation: (MAUserLocation*)userLocation updatingLocation:(BOOL)updatingLocation
9.2后台定位
app退到后台,且位置不变动时,也不会被系统挂起,可持久记录位置信息。
1.添加代码
_mapView.pausesLocationUpdatesAutomatically = NO;
2.工程配置
1)左侧目录中选中工程名,开启 TARGETS->Capabilities->Background Modes
2)在 Background Modes中勾选 Location updates
10.大头针标注
地图标注在开发中经常使用,并且地图标注样式灵活,需要着重注意。
在地图的基础,添加地图标注,需要两步
- 创建地图标注MAPointAnnotation,添加地图标注[_mapView addAnnotation:annotation];
- mapView:viewForAnnotation:回调函数,设置标注样式。
这里添加标注的代理方法,也可以把当前位置当做标注一样去显示出来,比较灵活。
11.自定义标注
自定义标注图标(基于大头针标注,可以自定义样式)
(1) 添加标注数据对象,可参考大头针标注的步骤(1)。
(2) 导入标记图片文件到工程中。这里我们导入一个名为restauant.png的图片文件。
(3) 在 协议的回调函数mapView:viewForAnnotation:中修改MAAnnotationView对应的标注图片。
关键代码:
annotationView.image = [UIImage imageNamed:@"restaurant"];
//设置中⼼心点偏移,使得标注底部中间点成为经纬度对应点
annotationView.centerOffset = CGPointMake(0, -18);