Android 高德地图 添加 天地图 卫星瓦片图片 离线缓存

由于天地图的地图接口请求有次数限制,我们做了本地缓存机制

原理是先查找本地目录是否有保存的瓦片图片,有的话直接返回路径,没有的话去请求天地图加载并保存到本地。

话不多说,直接上代码

我们加载在线瓦片代码是下面这样的,不知道的可以看我上片文章

                    String real_url = String.format(url, zoom, y, x);
                    LatLng mLatLng = mAMap.getProjection().fromScreenLocation(new Point(x,y));
                    Log.e("getTileUrl",x+","+y+""+" "+mLatLng+" "+real_url);
                    return new URL(real_url);
 

我们需要对这部分代码进行修改,修改后如下

加载影像底图部分

String ALBUM_PATH= getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath()+"/Cache/";
Bitmap mBitmap;
String mFileDirName = String.format("L%02d/", zoom + 1)+"img/";
String  mFileName = String.format("%s", TileXYToQuadKey(x, y, zoom));//为了不在手机的图片中显示,取消jpg后缀,文件名自己定义,写入和读取一致即可,由于有自己的bingmap图源服务,所以此处我用的bingmap的文件名String LJ = ALBUM_PATH +mFileDirName+ mFileName;
Log.e("getTileUrl是图片否存在: ", "getTileUrl: "+(MapImageCache.getInstance().isBitmapExit( mFileName,ALBUM_PATH +mFileDirName))+"");
if (MapImageCache.getInstance().isBitmapExit( mFileName,ALBUM_PATH +mFileDirName)) {//判断本地是否有图片文件,如果有返回本地url,如果没有,缓存到本地并返回googleurlLog.e("存在: ","file://" + LJ);return new URL("file://" + LJ);
}else{String real_url = String.format(url, zoom, y, x);mBitmap = getImageBitmap(getImageStream(real_url));try {saveFile(mBitmap, mFileName, mFileDirName);} catch (IOException e) {e.printStackTrace();}Log.e("不存在: ",real_url);return new URL(real_url);

加载标注部分

Bitmap mBitmap;
String mFileDirName = String.format("L%02d/", zoom + 1)+"title/";
String  mFileName = String.format("%s", TileXYToQuadKey(x, y, zoom));//为了不在手机的图片中显示,取消jpg后缀,文件名自己定义,写入和读取一致即可,由于有自己的bingmap图源服务,所以此处我用的bingmap的文件名String LJ = ALBUM_PATH +mFileDirName+ mFileName;
Log.e("名称是否存在: ", mFileName+"getTileUrl: "+(MapImageCache.getInstance().isBitmapExit( mFileName,ALBUM_PATH +mFileDirName))+"");
if (MapImageCache.getInstance().isBitmapExit( mFileName,ALBUM_PATH +mFileDirName)) {//判断本地是否有图片文件,如果有返回本地url,如果没有,缓存到本地并返回googleurlreturn new URL("file://" + LJ);
}else{String real_url = String.format(url2, zoom, y, x);mBitmap = getImageBitmap(getImageStream(real_url));try {saveFile(mBitmap, mFileName, mFileDirName);} catch (IOException e) {e.printStackTrace();}return new URL(real_url);
}

下面是缓存过程用到的一些方法

/*** 瓦片数据坐标转换*/
private String TileXYToQuadKey(int tileX, int tileY, int levelOfDetail) {StringBuilder quadKey = new StringBuilder();for (int i = levelOfDetail; i > 0; i--){char digit = '0';int mask = 1 << (i - 1);if ((tileX & mask) != 0){digit++;}if ((tileY & mask) != 0){digit++;digit++;}quadKey.append(digit);}return quadKey.toString();
}
/*** 保存文件*/
public void saveFile(final Bitmap bm, final String fileName, final String fileDirName)  throws IOException {new Thread(new Runnable() {@Overridepublic void run() {try {if(bm != null) {File dirFile = new File(ALBUM_PATH + fileDirName);if(!dirFile.exists()){dirFile.mkdirs();Log.e("创建文件夹",(dirFile.exists())+"");}File myCaptureFile = new File(ALBUM_PATH + fileDirName + fileName);//   Log.e("保存路径",myCaptureFile.getPath());BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));bm.compress(Bitmap.CompressFormat.PNG, 80, bos);bos.flush();bos.close();}} catch (IOException e) {e.printStackTrace();}}}).start();
}
public Bitmap getImageBitmap(InputStream imputStream){// 将所有InputStream写到byte数组当中byte[] targetData = null;if(imputStream != null){byte[] bytePart = new byte[4096];while (true) {try {int readLength = imputStream.read(bytePart);if (readLength == -1) {break;} else {byte[] temp = new byte[readLength + (targetData == null ? 0 : targetData.length)];if (targetData != null) {System.arraycopy(targetData, 0, temp, 0, targetData.length);System.arraycopy(bytePart, 0, temp, targetData.length, readLength);} else {System.arraycopy(bytePart, 0, temp, 0, readLength);}targetData = temp;}} catch (Exception e) {e.printStackTrace();}}}// 指使Bitmap通过byte数组获取数据Bitmap bitmap = BitmapFactory.decodeByteArray(targetData, 0, targetData.length);return bitmap;
}public InputStream getImageStream(String path) throws Exception{URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5 * 1000);conn.setRequestMethod("GET");if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){return conn.getInputStream();}return null;
}

MapImageCache类 ,这个类就是判断了一下本地路径是否存在图片缓存
import java.io.File;public class MapImageCache {private static MapImageCache mNetImageViewCache = new MapImageCache();private MapImageCache() {}public static MapImageCache getInstance() {return mNetImageViewCache;}/*** 判断图片是否存在首先判断内存中是否存在然后判断本地是否存在** @param url* @return*/public boolean isBitmapExit(String url,String path) {//boolean isExit = containsKey(url);boolean isExit = false;if (false == isExit) {isExit = isLocalHasBmp(url,path);}return isExit;}/** 判断本地有没有*/private boolean isLocalHasBmp(String name,String path) {boolean isExit = true;// String name = name;String filePath = path;File file = new File(filePath, name);if (file.exists()) {} else {isExit = false;}return isExit;}
}

在加载离线实现的过程中参考了一个大佬博客Android的关于高德地图加载谷歌瓦片,并缓存本地的功能._android h5缓存地图瓦片-CSDN博客

使用大佬的方法,每次加载离线瓦片数据地图就是黑色的只有标注,后来发现是加载缓存标注图片时,标注图片的背景变成了黑色,原因就是保存的时候图片格式是JPEG,只需要把JPEG改成PNG即可解决了

bm.compress(Bitmap.CompressFormat.PNG, 80, bos);

就这一行代码,不对的地方,欢迎大家指正交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超详细的前后端实战项目(Spring系列加上vue3)前端篇+后端篇(三)(一步步实现+源码)

好了&#xff0c;兄弟们&#xff0c;继昨天的项目之后&#xff0c;开始继续敲前端代码&#xff0c;完成前端部分&#xff08;今天应该能把前端大概完成开启后端部分了&#xff09; 昨天补充了一下登录界面加上了文章管理界面和用户个人中心界面 完善用户个人中心界面 修改一…

新手做抖音小店应该注意哪些问题?怎么正确的做抖音小店?

大家好&#xff0c;我是电商花花。 我们想做好一家抖音小店&#xff0c;想长期持久的做好一家抖店&#xff0c;一定要注意下面这些问题&#xff0c;只有避开这些做店的坑&#xff0c;我们才能稳稳的出单&#xff0c;稳稳的赚钱。 做抖音小店不能无脑铺货&#xff0c;要做精细…

【正点原子Linux连载】 第四十七章 音频驱动实验摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

HLS入门

文章目录 vivado下载有点麻烦还没完成&#xff0c;先占坑 (;_&#x1f609;

qt5core.dll怎么下载,qt5core.dll下载安装详细教程

不知道大家有没有遇到过qt5core.dll丢失这个问题&#xff1f;目前这个问题还是比较常见的&#xff0c;一般使用电脑比较多的的人&#xff0c;有很大几率遇到这种qt5core.dll丢失的问题。今天主要针对这个问题&#xff0c;来给大家讲解一下一键修复qt5core.dll的方法。 Qt5Core.…

清理安卓手机广告

保存脚本另存为 Fuck_AD.sh&#xff0c;在手机执行后体验效果。 echo ""echo " " echo " - 开始执行清理广告库文件" sleep 3files(/data/app/*/*/lib/arm64/libpangleflipped.so/data/app/*/*/lib/arm64/libzeus_direct_dex.so/data/app/*/*/l…

Nodejs历史版本安装地址

nodejs 历史版本地址&#xff1a; https://nodejs.org/dist/ node 阿里镜像源&#xff1a; https://registry.npmmirror.com/ npm 配置阿里镜像 npm config set registry https://registry.npmmirror.com

面试总结之:原生和flutter混合开发,是 使用多个flutter_engine还是单个flutter_engine

在原生和Flutter混合开发的过程中&#xff0c;关于使用多个FlutterEngine还是单个FlutterEngine&#xff0c;这实际上取决于你的具体需求和应用场景。 **使用单个FlutterEngine**&#xff1a;在某些情况下&#xff0c;使用单个FlutterEngine来管理多个入口可能是有利的。这种方…

Django 安装步骤

步骤如下 打开cmd输入命令行 pip install django上图代表已经安装好了。但是里面的warning必须得将路径弄好&#xff0c;不然是运行不了 创建django项目 去到VS Code里&#xff0c;进入Terminal 页面&#xff0c;运行下面的命令 django-admin startproject [自己项目名称]就…

Python 小游戏——贪吃蛇

Python 小游戏——贪吃蛇 文章目录 Python 小游戏——贪吃蛇项目介绍环境配置代码设计思路1. 初始化和变量定义2. 创建游戏窗口和FPS控制器3. 初始化贪吃蛇和食物的位置4. 控制贪吃蛇的方向和分数5. 主游戏循环 难点分析源代码呈现代码结果 项目介绍 贪吃蛇游戏是一款通过上下…

Rust:WIndows 环境下交叉编译 Linux 平台程序

在Windows下交叉编译Rust程序以在x86_64位的CentOS操作系统上运行&#xff0c;你需要遵循几个步骤来设置交叉编译环境并编译你的程序。以下是一个大致的指南&#xff1a; 1. 安装Rust和Cargo 首先&#xff0c;确保你已经在Windows上安装了Rust和Cargo。你可以从Rust官方网站下…

第7周 接口重试机制设计与消息队列

这里写目录标题 1. 第三方SDK超时分析与异步解耦场景解析2. 如何掌握Spring异步任务?3. 如何做消息中间件技术选型?4. RabbitMQ 的工作流程与模型解析5. 如何在Docker中快速构建配置RabbitMQ?6. Consume、Producer 模型详解7. 如何基于SpringBoot整合MQ实现生产者与消费者?…

智研未来,直击 AI DevOps,阿里云用户交流日杭州站来啦!

在这个技术日新月异的时代&#xff0c;云上智能化 DevOps 正以前所未有的速度推动企业创新边界&#xff0c;重塑软件开发的效率与品质。 为深入探索这一变革之路&#xff0c;诚邀您参与我们的专属闭门技术沙龙&#xff0c;携手开启一场关于云上智能化 DevOps 的挑战、实践与未…

小小字符串竟然如此嚣张 —— 聊聊 Java 的 String

大家好&#xff0c;我是徒手敲代码。 今天来分享几个 String 在面试当中&#xff0c;比较常见的问题。这个东西用得最多&#xff0c;而且底层的原理&#xff0c;面试也经常问。 两种创建方式&#xff0c;有什么区别&#xff1f; 比如&#xff0c;要创建一个 “Gary” 的字符…

深度学习设计模式之桥接模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 桥接模式是将抽象部分与实现部分分离&#xff0c;使它们都可以独立的变化。 一、介绍 桥接模式是结构型设计模式&#xff0c;主要是将抽象部分与实现部分分离&#x…

PostgreSQL基础(二):PostgreSQL的安装与配置

文章目录 PostgreSQL的安装与配置 一、PostgreSQL的安装 二、PostgreSQL的配置 1、远程连接配置

日用百货元宇宙 解锁 “潮”范儿牛奶生活

5月24日&#xff0c;荷兰皇家菲仕兰携手中国乳制品工业协会、中国医疗保健国际交流促进会共同发布了《2024中国奶商指数报告》。报告显示&#xff0c;今年中国奶商指数得分66.8分&#xff0c;同比上一年增长2.7分&#xff0c;为历年来最大增幅。公众在喝奶意识、知识和行为三大…

【老王最佳实践-6】Spring 如何给静态变量注入值

有些时候&#xff0c;我们可能需要给静态变量注入 spring bean&#xff0c;尝试过使用 Autowired 给静态变量做注入的同学应该都能发现注入是失败的。 Autowired 给静态变量注入bean 失败的原因 spring 底层已经限制了&#xff0c;不能给静态属性注入值&#xff1a; 如果我…

从零开始C++服务器开发

配置说明 代码编辑&#xff1a;visual studio code 操作系统&#xff1a;Windows10专业版的&#xff1b;Ubuntu20.04LTS&#xff08;使用VM 创建虚拟机&#xff09;&#xff1b; 目录结构说明 alan&#xff1a;项目的源代码目录&#xff0c;其中包含实际的C源代码文件。 bi…