百度地图海量点方案趟坑记录(百度地图GL版 + MapVGL + vue3 + ts)

news2025/1/10 17:22:16

核心需求描述

  1. 不同层级有不同的海量图标展示
  2. 底层海量图标需要展示文字
  3. 拖动、放大缩小都需要重新请求数据并展示
  4. 固定地图中心点(拖动、放大缩小,中心点始终在地图中心)
    示例图片:(某些图片涉及公司数据,就未展示了!2024-02-20 删除)
    在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff309375caf542f3a8c177ea6c1acece.png在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c03b7756e0f14f48b2c74709b242f9a6.png在这里插入图片描述

技术方案

  • vue3 + ts
  • 百度地图GL版(第一版为2d版,后因性能、用户体验等废弃)
  • MapVGL

遇到的问题

  1. 百度地图文档不全,某些方法需要打印实例查看
  2. MapVGL 文档不全,需要的某个功能在示例中存在,而文档中没有
  3. 缩放时中心点会偏移
  4. mapvgl 图标,在地图中消失,但点击所在位置还能响应相关事件
  5. 重复绘制次数太多,且图片会闪动,(也是内存溢出的原因之一)
  6. 内存溢出(原因之一:热力图层)

解决方案

前两点无解,官方不作为,只能大家辛苦点,自己多方面去搜寻想要的东西。

3 缩放时中心点会偏移

百度地图缩放时,是按照当前鼠标位置为缩放的基点,在移动端则为两指之间的中心点,所以在我们当前的场景下缩放时,就会产生中心点偏移的情况,解决方案逻辑:
*仅针对移动端
监听百度地图容器的 touchmove 事件替换地图自身的双指缩放,通过两点之间的距离判断放大/缩小,去设置百度地图的层级
部分逻辑代码如下:

  <XCMap ref="xcMapRef"  @touchend="ontouchend" @touchmove="ontouchMove" @touchstart="ontouchstart" ... />

const { start, move, end } = useCalcDistance(); // 将相关触摸事件及计算距离等,提取成了 useHooks 

const ontouchstart = (e: TouchEvent) => {
    start(e.touches); // 开始事件中会计算存储一个基础值
};

const ontouchMove = (e: TouchEvent) => {
    move(e.touches, (k) => { // move 事件中会通过基础值计算出是放大还是缩小
        let zoom = centerAndZoom.value.zoom; // 这里是当前地图的 zoom 值
        if (k === 'zoomIn') {  // 放大
            zoom += 0.1;// 层级加 0.1 (数值可以根据具体情况变更)
            if (zoom >= MAX_LAYER) { // 如果层级大于等于我们预设的最大值时,就设为最大值
                zoom = MAX_LAYER;
            }
        } else if (k === 'zoomOut') { // 缩小
            zoom -= 0.1; // 层级减 0.1 (数值可以根据具体情况变更)
            if (zoom <= MIN_LAYER) { // 如果层级小于等于我们预设的最小值时,就设为最小值
                zoom = MIN_LAYER;
            }
        }
        centerAndZoom.value.zoom = zoom;  // 计算结束去设置当前地图的 zoom 值
    });
};

const ontouchend = () => {
    end(); // end 事件中会去重置一些基础数据
};

4 mapvgl 图标,在地图中消失,但点击所在位置还能响应相关事件

当前地图页面(做了keep alive)绘制 icon 图标后,去往其它页面再返回,地图上图标丢失,但点击 之前 icon的位置,还是能响应点击事件。
这个问题的原因,没有过多的去排查,应该是 keep alive 造成的,所以解决方案就是取消当前页面的缓存机制,采用 vuex 去存储当前页面数据,每次都是重新进入页面渲染,就可以解决此问题。

5 重复绘制次数太多,且图片会闪动,(也是内存溢出的原因之一)

业务逻辑中,每次拖动地图,都会重新请求数据,并渲染到地图中,造成图片闪动的问题有以下两个方面:
1 获取的数据数量巨大。
2 之前的逻辑是每次都情况地图数据,重新渲染。
3 触发绘制的事件太多,如:拖动、放大、缩小、过滤条件筛选等
解决方案如下:
1 针对图片闪动,采取在获取数据后重新渲染之前,使用缓存数据生成一个层覆盖地图上,当新数据重新渲染后再删除缓存层:

        ...other code
        let layerCache: MapVGL2.LayerCache; // 生命一个缓存层
        layerCache = this[layerType]; // 将旧层数据赋值给缓存层
        this[layerType] = new window.mapvgl[currentConfig.funName](currentConfig.options); // 生成新的层
        this.mapvglView?.addLayer(this[layerType]); // 添加到地图中
        setTimeout(() => {
            !!layerCache && this.mapvglView?.removeLayer(layerCache);
            layerCache?.clear()
            layerCache?.destroy()
            layerCache = null;
        }, 20) // 20 毫秒后删除缓存层
      ...other code

2 对绘制事件做防抖处理,减少绘制事件的触发频次,使用的时 lodash 的方法

import { debounce } from 'lodash';

const draw = debounce(() => {
...
})

6 内存溢出(原因之一:热力图层)

针对内存溢出,排查出是图层清理不干净导致,排查很久发现 MapVgl 的热力图层和其它图层不一样,并不能正常的删除,
所以在渲染绘制的时候,其它图层可以正常使用 api 去清空删除,热力图则只初始化一次,每次热力图数据有变化,只更新此图层数据不做重新初始化处理,其次针对数据量太大,也对某些图层做了数据缓存对比处理,针对存在的数据不做清空处理,减少清空渲染时的一些资源消耗。
其它。。。
(因为是几个月前的事情了,没有及时记录,现在有点忘了,待想起补充!)

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

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

相关文章

2万字带你看懂什么是智能座舱

现在市面上只要在卖的车&#xff0c;在推销出售的时候&#xff0c;如果不说这车有智能座舱&#xff0c;你都不好意思给别人推销&#xff0c;哪怕仅仅只有一个纯液晶显示的中控大屏&#xff0c;到底什么样的座舱才算是智能座舱&#xff1f; 座舱一词由飞机和船舶行业引进而来&am…

初识AXI总线

AXI是一种总线类型&#xff0c;具有高传输速率&#xff0c;高带宽&#xff0c;低时延等特性 AXI具有三种类型&#xff1a; 1.AXI_FULL:满足高性能内存映射&#xff08;memory-mapped&#xff09;需求 2.AXI_lite:不可突发传输 3.AXI_stream:面向数据流的传输 AXI的工作方式&a…

基于Java在线蛋糕店商城系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

【八股文】面向对象基础

【八股文】面向对象基础 面向对象和面向过程的区别 面向过程把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象会先抽象出对象&#xff0c;然后用对象执行方法的方式解决问题。 创建一个对象用什么运算符?对象实体与对象引用有何不同? …

[AIGC] JVM内存结构

JVM内存结构 Java虚拟机&#xff08;JVM&#xff09;内存结构是Java内存管理的基础&#xff0c;并且与JVM的运行机制紧密相关。下面是一个JVM内存结构的示意图&#xff1a; JVM内存主要包括以下几个部分&#xff1a; 方法区&#xff08;Method Area&#xff09; 方法区也被称…

计算机视觉基础知识(十四)--深度学习开源框架

深度学习框架 Caffetensorflow框架是深度学习的库;编程时需要import 应用优势 框架的出现降低了入门的门槛;不需要从复杂的神经网络开始编写代码;根据需要,使用已有的模型;模型的参数经过训练得到;可以在已有的模型基础上增加自己的layer;在顶端选择自己的分类器和优化算法;…

2024最新版Redis安装使用指南

2024最新版Redis安装使用指南 Installation and Usage Guide to the Latest Redis in 2024 By JacksonML 1. 什么是Redis? The open-source, in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, an…

Linux 常用命令100+

Linux 运维/开发/测试 常用命令100 线上查询及帮助命令(2个) 命令功能说明示例man 命令查看普通命令帮助&#xff0c;命令的词典&#xff0c;更复杂的还有info&#xff0c;但不常用。rootbrLinux ~]#man lshelp 命令查看Linux内置命令的帮助&#xff0c;比如cd命令。[rootbrL…

【C++】初始化列表、static成员、友元、匿名对象、附练习题

文章目录 前言一、构造函数【初始化列表】1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 友元函数3.2 内部类 四、匿名对象4.1 拷贝对象时的一些编译器优化 五、再次理解类和对象六、练习题6.1 求123...n&#xff0c;要求不…

面试:正确率能很好的评估分类算法吗

正确率&#xff08;accuracy&#xff09; 正确率是我们最常见的评价指标&#xff0c;accuracy (TPTN)/(PN)&#xff0c;正确率是被分对的样本数在所有样本数中的占比&#xff0c;通常来说&#xff0c;正确率越高&#xff0c;分类器越好。 不同算法有不同特点&#xff0c;在不同…

算法项目(1)—— LSTM+CNN+四种注意力对比的股票预测

本文包含什么? 项目运行的方式(包教会)项目代码(在线运行免环境配置)不通注意力的模型指标对比一些效果图运行有问题? csdn上后台随时售后.项目说明 本项目实现了基于CNN+LSTM构建模型,然后对比不同的注意力机制预测股票走势的效果。首先看一下模型结果的对比: 模型MS…

十、计算机视觉-腐蚀操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、什么是腐蚀二、如何实现腐蚀三、腐蚀的原理 一、什么是腐蚀 在我们生活中常会见到腐蚀&#xff0c;比如金属表面受到氧化或其他化学物质的侵蚀&#xff0c;导致…

uniapp不同平台获取文件内容以及base64编码特征

前言 文件图片上传&#xff0c;客户端预览是很正常的需求&#xff0c;获取文件的md5特征码也是很正常的&#xff0c;那么&#xff0c;在uniapp中三种环境&#xff0c;h5, 小程序以及 app环境下&#xff0c;如何实现的&#xff1f; 参考&#xff1a; 如何在uniapp中读取文件Arr…

电动汽车充电负荷时空分布预测(matlab)

目录 1 主要内容 交通网-配电网交互模型 动态交通路网模型 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考《基于动态交通信息的电动汽车充电负荷时空分布预测》和《基于动态交通信息的电动汽车充电需求预测模型及其对配网的影响分析》文献模型&#xff0c;考虑…

Py之ydata-profilin:ydata-profiling的简介、安装、使用方法之详细攻略

Py之ydata-profilin&#xff1a;ydata-profiling的简介、安装、使用方法之详细攻略 目录 ydata-profiling的简介 1、主要特点 2、案例应用 (1)、比较数据集、对时序数据集进行分析、对大型数据集进行分析、处理敏感数据、数据集元数据和数据字典、自定义报告的外观、不同类型…

yolov5-tracking-xxxsort yolov5融合六种跟踪算法(一)--环境配置CPU版本

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接&#xff1a;https://github.com/zzhmx/yolov5-tracking-xxxsort.git 如果需要配置GPU版本环境可以查看我的这篇博客&#xff1a;yolov5-tracking-xxxsort yolov5融合六种跟踪算法&#xff08;一&am…

动态表格 点击单元格查看完整内容

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>分享收藏</title><script src"https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><style…

Java零基础 - 逻辑运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

[word] word带圈数字20以上 #笔记#笔记

word带圈数字20以上 办公中有时候需要用到带圈数字&#xff0c;超过20的数字就不能直接编辑了&#xff0c;那么20以上带圈数字要怎么输入呢&#xff1f;其实通过小技巧就能完成的&#xff0c;接下来就给大家介绍下呢&#xff0c;一起看看吧&#xff01; 20以上带圈数字输入技巧…

LaunchPad 市场的复苏,Penpad 成新兴生力军

以 Fair Launch 为主要启动方式的铭文市场的爆发&#xff0c;推动了 LaunchPad 市场的复苏&#xff0c;绝多数所铭文项目都能通过 Fairr Launch 的方式筹集资金实现启动&#xff0c;该赛道的爆发不仅推动了数百亿美元的热钱开始在链上不断涌动&#xff0c;同时也进一步形成了新…