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

核心需求描述

  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 codelet 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.rhkb.cn/news/262177.html

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

相关文章

苍穹外卖Day02——总结2

前期文章 文章标题地址苍穹外卖Day01——总结1https://blog.csdn.net/qq_43751200/article/details/135466359?spm1001.2014.3001.5501苍穹外卖Day01——解决总结1中存在的问题https://lushimeng.blog.csdn.net/article/details/135473412 总结2 前期文章1. 新增员工模块1.1 …

初阶数据结构之---顺序表和链表(C语言)

引言-线性表 线性表&#xff1a; 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构&#xff0c;也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上…

Django学习笔记-创建第一个django项目

1.创建一个虚拟环境的python项目 2.点击解释器设置 3.安装django包 4.终端选择Command Prompt 5.创建django项目运行django-admin startproject demo01(自命名) 6.修改连接数据库为mysql 7.修改语言(中国汉语)和时区(亚洲上海)USE_TZ改为False,否则时区不生效 8.修改TEMPLA…

并发List、Set、ConcurrentHashMap底层原理

并发List、Set、ConcurrentHashMap底层原理 ArrayList: List特点&#xff1a;元素有放入顺序&#xff0c;元素可重复 存储结构&#xff1a;底层采用数组来实现 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Clon…

C 语言基本语法及实用案例分享

一、什么是 C 语言&#xff1f; C语言是一种较早的程序设计语言&#xff0c;诞生于1972年的贝尔实验室。1972 年&#xff0c;Dennis Ritchie 设计了C语言&#xff0c;它继承了B语言的许多思想&#xff0c;并加入了数据类型的概念及其他特性。C语言是一门面向过程的计算机编程语…

Unity NavMesh 清除不可行走区域

通常场景中物体设置为static或Navigation Static后&#xff0c;打开Navigation使用默认设置烘焙NavMesh&#xff0c;模型顶部和底部会出现蓝色网格&#xff0c;但其中有部分属于不可能到达区域&#xff0c;如下图 本文介绍两种可去掉NavMesh中不需要网格的方法&#xff1a; 方…

OpenCV运行gstreamer管道获取相机数据,处理以后,再交给gstreamer显示(QT实现)

效果: 前言 无意中发现,OpenCV也可以运行gstreamer的命令管道,然后使用appsink来与OpenCV连接起来进行处理,在不断测试之下,先后实现了以下功能: 1. OpenCV运行gstreamer命令,通过appsink传递给OpenCV显示 2. OpenCV运行gstreamer命令,然后再把Mat图像数据通过appsrc传…

(3)(3.6) 用于OpenTX的Yaapu遥测脚本

文章目录 前言 1 安装和操作 2 参数说明 前言 这是一个开源 LUA 脚本&#xff0c;用于在使用 OpenTX 2.2.3 的 Horus X10、X12、Jumper T16、T18、Radiomaster TX16S、Taranis X9D、X9E、QX7 和 Jumper T12 无线电设备上显示 FrSky 的直通遥测数据(FrSky passthrough telem…

解决IntelliJ IDEA 2023版本创建Spring项目时Java只能选择17或21的问题

问题描述&#xff1a; 当使用IntelliJ IDEA2023版本中Spring Initializr新建Spring项目时&#xff0c;即使JDK配置项为1.8&#xff0c;Java配置项仍然只能选17或21. 在JDK为1.8版本情况下&#xff0c;Java选择17或21&#xff0c;点击NEXT按钮&#xff0c;则会弹窗提示SDK不支持…

航空航天5G智能工厂数字孪生可视化平台,推进航空航天数字化转型

航空航天5G智能工厂数字孪生可视化平台&#xff0c;推进航空航天数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业关注的焦点。航空航天业作为高端制造业的代表&#xff0c;也在积极探索数字化转型之路。为了更好地推进航空航天数字化转型&#xff0c;一…

安卓游戏开发之音频技术优劣分析

一、引言 在安卓游戏开发中&#xff0c;音频处理技术扮演着至关重要的角色&#xff0c;它不仅能够增强游戏的沉浸感和玩家体验&#xff0c;还能通过声音效果传达关键的游戏信息。以下将对几种常见的安卓游戏音频处理技术进行优劣分析&#xff0c;并结合应用场景来阐述其特点。 …

十九、图像的放缩和插值

项目功能实现&#xff1a;对一张图像进行放大和缩小操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 resizing.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class RESIZING { public:void resizing(Mat& image); };#pragma…

【Linux】进程状态

进程状态 进程状态的简要介绍运行状态进程排队 阻塞状态挂起状态Linux中的进程状态 进程状态的简要介绍 进程状态指的是一个操作系统中正在运行的进程当前所处的状态。根据不同的操作系统&#xff0c;进程状态可能会有一些细微的差别&#xff0c;但最主要的是以下三种状态 运行…

电路设计(26)——速度表的multisim仿真

1.设计要求 设计一款电路&#xff0c;能够实时显示当前速度。 用输入信号模拟行驶的汽车&#xff0c;信号频率的1hz代表汽车速度的1m/s。最后速度显示&#xff0c;以km/h为单位。 2.电路设计 当输入信号频率为40HZ时&#xff0c;显示的速度应该为144KM/h&#xff0c;仿真结果为…

IP地址证书详解

IP地址证书是一种特殊的SSL/TLS证书&#xff0c;它直接绑定到服务器的公网IP地址而不是域名&#xff0c;这种类型的证书特别适合于那些没有域名只有公网IP或者不方便使用域名的企业或个人。证书允许通过特定的IP地址访问的Web服务提供HTTPS加密连接&#xff0c;确保在没有使用域…

深入理解flinksql执行流程,calcite与catalog相关概念,扩展解析器实现语法的扩展

深入理解Flink Sql执行流程 1 Flink SQL 解析引擎1.1SQL解析器1.2Calcite处理流程1.2.1 SQL 解析阶段&#xff08;SQL–>SqlNode&#xff09;1.2.2 SqlNode 验证&#xff08;SqlNode–>SqlNode&#xff09;1.2.3 语义分析&#xff08;SqlNode–>RelNode/RexNode&#…

EfficientNet环境搭建网络修改

引子 在深度学习CV领域&#xff0c;最初2012年突破的就是图像分类&#xff0c;发展这么多年&#xff0c;基本上已经没有什么进展了。此篇作为之前EfficientNet挽留过的总结&#xff0c;现在整理下&#xff0c;OK&#xff0c;让我们开始吧。 一、EfficientNet安装 1、pytorch…

Window部署Exceptionless

Exceptionless Elasticsearch 版本&#xff1a; Exceptionless&#xff1a;8.1.0 Elasticsearch&#xff1a;7.17.5 JDK&#xff1a;11.0.10 目录 一、Elasticsearch运行 二、 Exceptionless 一、Elasticsearch运行 bin目录下elasticsearch.bat 直接运行 访问 http://lo…

线性代数:向量空间

目录 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2

JAVA工程师面试专题-并发编程篇

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系&#xff1f; 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…