当前位置: 首页 > news >正文

uni-app使用瓦片实现离线地图的两种方案

🧑‍💻 写在开头

点赞 + 收藏 === 学会🤣🤣🤣

最近接到一个安卓App的活儿,虽然功能上不算复杂,但因为原本没怎么做过安卓端,所以也是"摸着石头过河"。简单写一下踩过的坑和淌的水吧~

uni-app实现离线地图主要用 leafletjs 实现,但是因为在安卓端运行,存在渲染问题,所以还要用上 renderjs

实现方案一:web-view

因为uni-app引入第三方可以采用传统的 NPM 安装的方式,也可以采用引入打包完的js文件的方式。

这里采用 leafletjs 打包完的文件,将 leafletjs 放入 static 文件夹内。

在网上下载了公开的瓦片地图图片,以 {z}/{x}/{y} 的目录结构放入 tiles 文件夹中,将 tiles 放入 static 文件夹内。

在static文件夹下新建一个 offline-map.html 文件

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>离线地图</title><link rel="stylesheet" href="./leaflet/leaflet.css" /><style>html,body {margin: 0;padding: 0;}#map {height: 100vh;width: 100vw;margin: 0;padding: 0;}</style></head><body><div id="map"></div><script src="./leaflet/leaflet.js"></script><script>const baseUrl = './tiles/{z}/{x}/{y}.jpg';const map = L.map('map').setView([23.56, 113.23], 15);L.tileLayer(baseUrl, {minZoom: 15,maxZoom: 18,tms: true,attribution: 'Offline Tiles',errorTileUrl: ''}).addTo(map);</script></body>
</html>

找到 pages/index/index.vue 文件,采用 web-view 引用的方式引入上述 html 文件。

// pages/index/index.vue
<template><view class="content"><web-view src="/static/offline-map.html"></web-view></view>
</template><style>.content {width: 100%;height: 100%;display: flex;flex-direction: column;align-items: center;justify-content: center;}
</style>

实现方案二:renderjs

仍然将 leafletjs 和 瓦片图片文件夹tiles 放入 static 文件夹中。

// pages/index/index.vue
<view class="content"><view id="map" class="map-container"></view>
</view><script module="leaflet" lang="renderjs">import '@/static/leaflet/leaflet.css';import * as L from "@/static/leaflet/leaflet.js";export default {mounted() {this.initMap();},methods: {initMap() {const baseUrl = 'static/tiles/{z}/{x}/{y}.jpg'map = L.map('map').setView([23.56, 113.23], 15);L.tileLayer(baseUrl, {minZoom: 15,maxZoom: 18,tms: true,attribution: 'Offline Tiles',errorTileUrl: ''}).addTo(map);},}}
</script>

这里需要注意的是一定要在 renderjs 中实现上述代码,如果在常规 script 中实现,在 H5端 没有任何问题,但是运行到真机上会白屏。(这个问题我反复试了好几次都不行,结果还是上传到 Trae 上解决了这个问题)。

导致这种情况的原因是在常规 sctipt 中的代码,在真机上是运行在 逻辑层 的代码,无法干扰到 视图层 的结构,这一点和Web是不同的。

而 renderjs 是运行在 视图层 的js,具备操作 DOM 的能力。

其次是引用 static 文件的路径,import static 中的文件可以使用 @/static 的方式,但是在代码中引用 static 文件需要采用 static/ 的形式。

总结

最后我做完以后让 Trae 给了一下评价,Trae 表示不建议采用这种方式实现离线地图,首先瓦片地图文件一般非常大,我用的仅仅是其中的一小部分,也超过了 60MB,打包出来的 App 包太大了。

其次无论是 web-view 还是 renderjs 本质上是一样的。在app-vue环境下,视图层由webview渲染,而renderjs就是运行在视图层的。

所以无论是渲染效率还是开发上基本没差。

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

http://www.jsqmd.com/news/443575/

相关文章:

  • 箱式变电站怎么选?核心要素解析+Top5厂家推荐+场景适配指南 - 深度智识库
  • 在 AI 洪流的冲击下,我们该如何提升 AI 和技术能力,才能在市场里获得更强的竞争力?
  • 升亿滤油机价格多少钱,性能和售后服务能否匹配其费用 - 工业设备
  • python接口自动化-run_tests.py文件
  • 2026最新企业微信申请注册电话,企业快速认证开通服务热线 - 品牌2026
  • 2026年,无人机环境检测仪国产替代领域,哪些品牌供应商公司值得选? - 品牌推荐大师
  • 2026年美容医疗设备厂家实力推荐:佛山佳美电子科技,护肤设备/数字美容仪/美容仪器全系供应,适配家用/专业多场景 - 品牌推荐官
  • 大模型推理进入“微调”时代:GPUStack 携手 SOAR 聚焦算子级优化
  • 大润发购物卡回收平台推荐:轻松实现礼品卡使用与购买 - 团团收购物卡回收
  • 喷砂厂家哪家强?综合性能、服务、性价比三维度最新专业测评 - 深度智识库
  • 2026最新艺考大师姐推荐!东四省省统考/考研/校考优质机构权威榜单 - 十大品牌榜
  • el-tree的 过滤 filterNode 中包含父节点
  • 光影尽在掌握:猎翼智能成像,2026军用正射成图无人机集群软硬一体化供应商推荐 - 品牌2026
  • 2026成都等地最新家装品牌推荐:环保家装领跑者,实力铸就品质居所 - 十大品牌榜
  • 2026石化设备供货商大盘点,品质之选揭晓,蒸汽锅炉/导热油锅炉/锅炉,石化设备加工厂排行 - 品牌推荐师
  • 青岛装修公司 排名 口碑 2026 实测32家正规装企 高适配选择指南 - GEO排行榜
  • mindie推理框架
  • 深入解析:Android音频系列(09)-AudioPolicyManager代码解析
  • CMake 接入第三方库的三种方式:add_subdirectory、FetchContent 与 find_package(C++ 工程入门第六课)
  • 变压器怎么选?聚焦能效、安全与场景适配的实战指南 - 深度智识库
  • 2026最新音乐艺考推荐!辽宁省统考/考研/校考优质音乐艺考机构权威榜单发布 - 十大品牌榜
  • 【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化 - 指南
  • 2026年济南室内LED显示屏哪家好,高口碑供应商与品牌推荐 - 工业设备
  • 低空慧眼:2026军用2D成像无人机蜂群系统供应商深度解析 - 品牌2026
  • 盒马鲜生卡回收、使用全流程解析 - 团团收购物卡回收
  • 2026深度横评10款护颈枕:从人体工学到材质解码,帮你找回满分深睡体验! - 博客万
  • 279_尚硅谷_管道的注意事项和细节(1)
  • SSH 登录/退出实时监控脚本
  • 揭秘无人机通信链路两大攻击手段:姿态欺骗与电量伪造
  • 2026年投融资纠纷律师价格大揭秘,北京哪家收费合理? - 工业品网