百度地图开发-实现离线地图功能 05

上一篇我们根据研究学习,实现了实时定位显示功能,可以在地图上显示出自己所处的位置,并实时进行自动更新。那么接下来就让我们实现离线地图功能。

在日常的业务开发过程中,很多时候都会使用离线地图。那么我们需要在有网的时候加载并下载所处地区的地图,当没有运营商网络或WIFI的时候,就可以无感切换到离线地图,不会过大影响用户的使用。

实现离线地图功能

关于离线地图,这块的内容百度教程说明的不是很详细,具体的还是需要你下载他们提供的demo,自己去研究,否则很难实现离线地图的功能。

离线地图的实现主要有两种方式:

一、将自己提前下载好的离线地图文件存放到app软件的特定位置处。

这个方法目前官方是没有说明的,根据网上说法是之前版本有特殊说明,可以导入离线地图,最新版已经将此接口弃用掉了。但是经过我的研究发现,其实还是可以巧用的。

百度地图的下载文件是以.dat格式结尾的,根据对百度地图官方APP的研究,发现它会将下载的离线地图缓存到 Android/data/app包名/files/vmp 中,大家可以看下自己android手机缓存的百度地图离线地图地址。

其实我当时也在猜想,既然它官方缓存的地址是这里,那是不是就证明它在SDK中,是优先从这个地址中检索离线地图进行展示的。如果是这样子的话,是不是就可以把我提前下载好的地图文件放在这里。

事实证明确实是这样子的,将需要缓存目的地的离线地图放到这个目录下,在手机没有网络的情况下,可以加载显示出地图。

如果你的业务需求主动下载很困难的话,可以使用这种方式,远程给客户更新离线地图,方便其在现场使用。

具体地址见下图:顶部红框部分是地址,下部红圈部分是下载的天津市离线地图,在没有网络的情况下,SDK会默认加载离线地图进行显示。

二、通过MKofflineMap来主动下载地图。

咱们先按照官网给的教程走一篇,看到底会不会遇到难题。

如果是新手看离线地图这块的教程,会满脸懵逼的。官方只是给你罗列出几个具体的关键点,一些细节性的操作没有说明。

  • 初始化离线地图
MKOfflineMap mOffline = new MKOfflineMap();
// 传入MKOfflineMapListener,离线地图状态发生改变时会触发该回调
mOffline.init(listener);
  • 开始下载
//获取城市ID
ArrayList<MKOLSearchRecord> records = mOffline.searchCity(cityName);
if (records != null && records.size() == 1) {
    cityId = records.get(0).cityID;
}

// 开始下载离线地图
// cityID 城市的数字标识
mOffline.start(cityid);
  • 暂停下载
//暂停下载
mOffline.pause(cityid);
  • 停止下载
//停止下载
mOffline.pause(cityid);
  • 删除下载
//删除下载
mOffline.remove(cityid);
  • 更新下载
//更新下载
mOffline.update(cityid);

关于更新下载,在更新过程中会通过onGetOfflineMapState来回调信息,可查看更新进度、新离线地图安装、版本更新提示等功能。

上面的内容是官方给的教程,按照它进行操作确实可以下载到地图,但是没有提示,不友好,而且开发者根本不知道地图下载到哪里去了,需要自己去根据给的DEMO,再去研究才可以。

下面是结合官方教程和官方API,DEMO等,摸索出来的。目前只是简单实现地图的下载,下载进度值的显示。后面你可以根据自己的业务需求来进行定制操作。

1、初始化离线地图

2、通过城市ID下载对应地图

3、在回调函数中显示地图下载进度(0-100)

下来就让我们实际操作一遍

点击事件进行地图的下载和暂停

在监听事件mKOfflineMapListener中,利用回调函数来实时获取下载地图的进度。

运行后,点击开始下载,就可以实现天津市地图的离线操作,会在回调函数中获取到下载进度,实时打印显示在软件界面上。

当进度走完,你就会在红框地址的文件夹下面看到已经下载的天津的离线地图文件。

哈哈哈,是不是感觉很nice。

上面我只是简单的介绍下载离线地图,这里面关于围绕离线地图有很多玩法,具体根据自己的业务进行结合,可以实现。

好了今天的分享就在这里,感谢你的阅读。

对了提醒大家一句,多看DEMO,它比官方文档教程强太多了。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。