更新时间:2020-06-23
简介
使用离线地图,可满足在无网络环境下查看地图信息的需求,在有离线地图的情况下,地图SDK会优先加载离线地图。
开始使用
初始化离线地图
Objective-C
Swift
//引入头文件 #import <BaiduMapAPI_Base/BMKBaseComponent.h> #import <BaiduMapAPI_Map/BMKMapComponent.h> //离线地图类的实例 @property (nonatomic, strong) BMKOfflineMap *offlineMap; //实例化离线地图类BMKOfflineMap对象 _offlineMap = [[BMKOfflineMap alloc] init]; //设置离线地图类的代理 _offlineMap.delegate = self;
//var offlineMap: BMKOfflineMap = BMKOfflineMap() //离线地图类的实例 //实例化离线地图类BMKOfflineMap对象 offlineMap = BMKOfflineMap.init() //设置离线地图类的代理 offlineMap.delegate = self
获取批量城市列表
首先,要先了解BMKOLSearchRecord为离线地图搜索城市记录信息类,属性如下表:
cityName |
城市名 |
---|---|
size | 数据包总大小 |
cityID | 城市ID |
cityType | 城市类型 0:全国;1:省份;2:城市;如果是省份,可以通过childCities得到子城市列表 |
childCities | 子城市列表 |
百度地图提供了两种快速批量获取城市离线地图的接口:热门城市列表,所有城市列表; 1.获取热门城市列表,代码如下:
Objective-C
Swift
//数组元素为BMKOLSearchRecord NSArray *hotCitys = [_offlineMap getHotCityList];
let hotCitys: [BMKOLSearchRecord] = offlineMap.getHotCityList() as! [BMKOLSearchRecord]
2.获取所有支持离线地图的城市列表,代码如下:
Objective-C
Swift
//数组元素为BMKOLSearchRecord NSArray *offlineCitys = [_offlineMap getOfflineCityList];
let offlineCitys: [BMKOLSearchRecord] = offlineMap.getOfflineCityList() as! [BMKOLSearchRecord]
开始下载 调用离线地图下载接口start,根据城市编码下载离线地图,接口参数为cityID,cityID表示每个城市的唯一标识
Objective-C
Swift
NSArray *records = [_offlineMap searchCity:@"北京"]; BMKOLSearchRecord *oneRecord = [records objectAtIndex:0]; [_offlineMap start:oneRecord.cityID];
let records = offlineMap.searchCity("北京") let oneRecord: BMKOLSearchRecord = records?.first as! BMKOLSearchRecord offlineMap.start(oneRecord.cityID)
下载状态
首先要先了解离线地图更新信息BMKOLUpdateElement,属性如下表:
cityName |
城市名 |
---|---|
cityID | 城市ID |
size | 已下载数据大小,单位:字节 |
serversize | 服务端数据大小,当update为YES时有效,单位:字节 |
ratio | 下载比率,100为下载完成,下载完成后会自动导入,status为4时离线包导入完成 |
status | 下载状态, -1:未定义 1:正在下载 2:等待下载 3:已暂停 4:完成 5:校验失败 6:网络异常 7:读写异常 8:Wifi网络异常 9:离线包数据格式异常,需重新下载离线包 10:离线包导入中 |
update | 更新状态,离线包是否有更新(有更新需重新下载) |
pt | 城市中心点 |
获取离线地图下载事件类型和状态的代码如下:
Objective-C
Swift
///离线地图delegate,用于获取通知 #pragma mark – BMKOfflineMapDelegate /** 返回通知结果 @param type 事件类型 @param state 事件状态 type为TYPE_OFFLINE_UPDATE,表示正在下载或更新城市id为state的离线包, type为TYPE_OFFLINE_ZIPCNT,表示检测到state个离线压缩包, type为TYPE_OFFLINE_ADD,表示新安装的离线地图数目, type为TYPE_OFFLINE_UNZIP,表示正在解压第state个离线包, type为TYPE_OFFLINE_ERRZIP,表示有state个错误包, type为TYPE_VER_NEWVER,表示id为state的城市离线包有新版本, type为TYPE_OFFLINE_UNZIPFINISH时,表示扫瞄完成,成功导入state个离线包 */ - (void)onGetOfflineMapState:(int)type withState:(int)state { switch (type) { case TYPE_OFFLINE_UPDATE: { /** *返回指定城市id离线地图更新信息 *@param cityID 指定的城市id,此时state即为cityID *@return 指定城市id离线地图更新信息 */ BMKOLUpdateElement *updateElement = [_offlineMap getUpdateInfo:state]; break; } case TYPE_OFFLINE_NEWVER: break; case TYPE_OFFLINE_ZIPCNT: break; case TYPE_OFFLINE_ERRZIP: break; case TYPE_OFFLINE_UNZIPFINISH: break; default: NSLog(@"default"); break; } }
/** 返回通知结果 @param type 事件类型 @param state 事件状态 type为TYPE_OFFLINE_UPDATE,表示正在下载或更新城市id为state的离线包, type为TYPE_OFFLINE_ZIPCNT,表示检测到state个离线压缩包, type为TYPE_OFFLINE_ADD,表示新安装的离线地图数目, type为TYPE_OFFLINE_UNZIP,表示正在解压第state个离线包, type为TYPE_OFFLINE_ERRZIP,表示有state个错误包, type为TYPE_VER_NEWVER,表示id为state的城市离线包有新版本, type为TYPE_OFFLINE_UNZIPFINISH时,表示扫瞄完成,成功导入state个离线包 */ func onGetOfflineMapState(_ type: Int32, withState state: Int32) { switch type { case Int32(TYPE_OFFLINE_UPDATE): updateElement = offlineMap.getUpdateInfo(state) var userInfo = Dictionary<String, Any>() userInfo["ratio"] = updateElement?.ratio userInfo["cityID"] = state NotificationCenter.default.post(name: NSNotification.Name(rawValue: kBMKOfflineDownloadNotification), object: nil, userInfo: userInfo) break case Int32(TYPE_OFFLINE_NEWVER): break case Int32(TYPE_OFFLINE_ZIPCNT): break case Int32(TYPE_OFFLINE_ERRZIP): break case Int32(TYPE_OFFLINE_UNZIPFINISH): break default: break } }
暂停下载
Objective-C
Swift
[_offlineMap pause:oneRecord.cityID];
offlineMap.pause(oneRecord.cityID)
删除下载
Objective-C
Swift
[_offlineMap remove:oneRecord.cityID];
offlineMap.remove(oneRecord.cityID)
更新下载
Objective-C
Swift
[_offlineMap update:oneRecord.cityID]
offlineMap.update(oneRecord.cityID)