引入头文件
// 引入base相关所有的头文件 #import
// 在桥接文件中引入头文件 #import
初始化bmkmapmanager
在您的appdelegate.m文件中添加对bmkmapmanager的初始化,并填入您申请的授权ak(请确保此处ak与当前工程bundle identifier匹配,否则会出现地图数据无法加载,只有方格的情况),示例如下:
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions { // 要使用百度地图,请先启动baidumapmanager bmkmapmanager *mapmanager = [[bmkmapmanager alloc] init]; // 如果要关注网络及授权验证事件,请设定generaldelegate参数 bool ret = [_mapmanager start:@"在此处输入您的授权ak" generaldelegate:nil]; if (!ret) { nslog(@"启动引擎失败"); } return yes; }
class appdelegate: uiresponder, uiapplicationdelegate, bmkgeneraldelegate { func application(_ application: uiapplication, didfinishlaunchingwithoptions launchoptions: [uiapplication.launchoptionskey: any]?) -> bool { // 要使用百度地图,请先启动bmkmapmanager let mapmanager = bmkmapmanager() // 启动引擎并设置ak并设置delegate if !(mapmanager.start("在此处输入您的授权ak", generaldelegate: self)) { nslog("启动引擎失败") } return true } }
设置全局坐标系
全局设置地图sdk与开发者交互时的坐标类型。地图sdk默认使用bd09ll(bmk_coordtype_bd09ll)坐标。如需使用gcj02坐标,传入参数值为bmk_coordtype_common即可。本方法不支持传入wgs84(bmk_coordtype_gps)坐标。
开发者通过调用设置全局坐标方法(setcoordinatetypeusedinbaidumapsdk)设置的全局坐标类型后,意味着开发者和地图sdk约定传入和返回的坐标类型均为设置的类型;比如:定位传入的坐标,检索返回的坐标。
设置方法如下:
/** 百度地图sdk所有api均支持百度坐标(bd09)和国测局坐标(gcj02),用此方法设置您使用的坐标类型. 默认是bd09(bmk_coordtype_bd09ll)坐标. 如果需要使用gcj02坐标,需要设置coordinatetype为:bmk_coordtype_common. */ if ([bmkmapmanager setcoordinatetypeusedinbaidumapsdk: bmk_coordtype_common]) { nslog("经纬度类型设置成功"); } else { nslog("经纬度类型设置失败") }
/** 百度地图sdk所有api均支持百度坐标(bd09)和国测局坐标(gcj02),用此方法设置您使用的坐标类型. 默认是bd09(bmk_coordtype_bd09ll)坐标. 如果需要使用gcj02坐标,需要设置coordinatetype为:bmk_coordtype_common. */ if bmkmapmanager.setcoordinatetypeusedinbaidumapsdk(bmk_coord_type.coordtype_common) { nslog("经纬度类型设置成功") } else { nslog("经纬度类型设置失败") }
注意:设置后请严格遵守约定,否则会出现经纬度与地图上展示的不一致的问题。为设置此项请确保传入坐标均为bd09ll(百度经纬度坐标)
创建bmkmapview
在您的viewcontroller.m文件中添加bmkmapview的创建代码,示例如下:
#import//引入base相关所有的头文件 #import //引入地图功能所有的头文件 @interface viewcontroller () @property (nonatomic, strong) bmkmapview *mapview; @end @implementation viewcontroller - (void)viewdidload { [super viewdidload]; _mapview = [[bmkmapview alloc]initwithframe:self.view.bounds]; _mapview.delegate = self; [self.view addsubview:_mapview]; } @end
class viewcontroller: uiviewcontroller, bmkmapviewdelegate { var mapview: bmkmapview? override func viewdidload() { super.viewdidload() mapview = bmkmapview(frame: self.view.frame) mapview?.delegate = self self.view.addsubview(mapview!); } }
注意:bmkmapview使用viewwillappear、viewwilldisappear方法来控制bmkmapview的生命周期,并且在一个时刻只能有一个bmkmapview接受回调消息,因此在使用bmkmapview的viewcontroller中必须需要在viewwillappear、viewwilldisappear方法中调用bmkmapview的对应的方法。
示例代码如下:
-(void)viewwillappear:(bool)animated { [super viewwillappear:animated]; [_mapview viewwillappear]; } -(void)viewwilldisappear:(bool)animated { [super viewwilldisappear:animated]; [_mapview viewwilldisappear]; }
override func viewwillappear(_ animated: bool) { super.viewwillappear(animated) mapview?.viewwillappear() } override func viewwilldisappear(_ animated: bool) { super.viewwilldisappear(animated) mapview?.viewwilldisappear() }
编译运行
效果如下图所示:
地图类型及显示层级
百度地图sdk支持21级的地图显示,卫星图、热力图只支持显示到20级,放大至21级时将不再显示;交通路况图只支持显示到21级,放大至22级时将不再显示。各地图类型和图层支持层级说明如下表:
地图类型或图层类型 |
显示层级 |
---|---|
2d地图 | 4-21级 |
3d地图 | 19-21级 |
卫星图 | 4-20级 |
路况交通图 | 7-21级 |
百度城市热力图 | 11-20级 |
室内图 | 17-22级 |
注:地图sdk自v4.0.0版本起,地图缩放等级由3-21变更为4-21,优化南北极地区展示效果。
1.设置缩放级别 bmkmapview设置级别示例代码如下:
// 将当前地图显示缩放等级设置为17级 [_mapview setzoomlevel:17];
// 将当前地图显示缩放等级设置为17级 mapview?.zoomlevel = 17
地图显示比例尺
百度地图sdk显示层级与比例尺对照表如下:
显示层级 |
比例尺/米 |
---|---|
4 | 1000000 |
5 | 500000 |
6 | 200000 |
7 | 100000 |
8 | 50000 |
9 | 25000 |
10 | 20000 |
11 | 10000 |
12 | 5000 |
13 | 2000 |
14 | 1000 |
15 | 500 |
16 | 200 |
17 | 100 |
18 | 50 |
19 | 20 |
20 | 10 |
21 | 5 |
1.设置比例尺显示 设置比例尺是否显示,默人为不显示,代码如下:
//显示比例尺 _mapview.showmapscalebar = yes; //隐藏比例尺 _mapview.showmapscalebar = no;
//显示比例尺 mapview?.showmapscalebar = true //隐藏比例尺 mapview?.showmapscalebar = false
支持多实例显示地图,即开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰。
创建两个bmkmapview
在当前控制器中展示两个bmkmapview,示例代码如下:
#import//引入base相关所有的头文件 #import //引入地图功能所有的头文件 @property (nonatomic, strong) bmkmapview *upsidemapview; //当前界面上方的mapview @property (nonatomic, strong) bmkmapview *undersidemapview; //当前界面下方的mapview _upsidemapview = [[bmkmapview alloc] initwithframe:cgrectmake(0, 0, self.view.frame.size.width, (self.view.frame.size.height) / 2.0)]; _undersidemapview = [[bmkmapview alloc] initwithframe:cgrectmake(0, (self.view.frame.size.height) / 2.0 10, self.view.frame.size.width, (self.view.frame.size.height) / 2.0 - 10)];
var upsidemapview: bmkmapview? var undersidemapview: bmkmapview? upsidemapview = bmkmapview(frame: cgrect.init(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height / 2.0)) undersidemapview = bmkmapview(frame: cgrect.init(x: 0, y: self.view.frame.height / 2.0 10 , width: self.view.frame.width, height: self.view.frame.height / 2.0 - 10))
添加到当前的view上
//将upsidemapview添加到当前视图中 [self.view addsubview:_upsidemapview]; //将undersidemapview添加到当前视图中 [self.view addsubview:_undersidemapview];
self.view.addsubview(upsidemapview!); self.view.addsubview(undersidemapview!);
分别设置delegate
//设置upsidemapview的代理 _upsidemapview.delegate = self; //设置undersidemapview的代理 _undersidemapview.delegate = self;
upsidemapview?.delegate = self undersidemapview?.delegate = self
分别管理mapview的生命周期
- (void)viewwillappear:(bool)animated { [super viewwillappear:animated]; //当upsidemapview即将被显示的时候调用,恢复之前存储的upsidemapview状态 [_upsidemapview viewwillappear]; //当undersidemapview即将被显示的时候调用,恢复之前存储的undersidemapview状态 [_undersidemapview viewwillappear]; } - (void)viewwilldisappear:(bool)animated { [super viewwilldisappear:animated]; //当upsidemapview即将被隐藏的时候调用,存储当前upsidemapview的状态 [_upsidemapview viewwilldisappear]; //当undersidemapview即将被隐藏的时候调用,存储当前undersidemapview的状态 [_undersidemapview viewwilldisappear]; }
override func viewwillappear(_ animated: bool) { super.viewwillappear(animated) upsidemapview?.viewwillappear() undersidemapview?.viewwillappear() } override func viewwilldisappear(_ animated: bool) { super.viewwilldisappear(animated) upsidemapview?.viewwilldisappear() undersidemapview?.viewwillappear() }
分别设置显示缩放级别
//设置upsidemapview的缩放等级 [_upsidemapview setzoomlevel:17]; //设置undersidemapview的缩放等级 [_undersidemapview setzoomlevel:20];
//设置upsidemapview的缩放等级 upsidemapview?.zoomlevel = 17 //设置undersidemapview的缩放等级 undersidemapview?.zoomlevel = 20
编译运行
效果如下图所示: