vue中高德地图使用 Marker 标点 - 标点数据快到 1000 时页面卡顿问题解决(已解决 - 多方面原因)+ 海量点功能实现解决

news/2024/9/24 10:47:38/

目录

  • 1.业务需求
  • 2.最初实现及出现的问题
  • 3.解决 - `1000` 个标点时页面就出现 `卡顿` 问题
  • 4.使用海量点、聚合标点后还有卡顿,排查其他原因
  • 5.最终解决
    • 5.1页面中list数据渲染问题解决
    • 5.2地图相关实例不要放在 vue 的可响应数据中
  • 页面展示

1.业务需求

需要在 高德地图 中标点,标点数量可能 上万个

2.最初实现及出现的问题

  • 【最初实现】使用高德地图的 Marker 标点
    • Marker 实现标点代码
      // 遍历list数据一个一个标点
      let warnning = new AMap.Marker({zIndex: type === 'alarm' ? 14 : 12,icon: icon,position: [item.longitude, item.latitude],anchor: 'bottom-center',extData: {tabType: type,...item}
      })
      this.markerList.push(warnning) // 用于
      warnning.on('click', this.markerClick)
      // warnning.emit('click', { target: warnning });//
      map.add(warnning)
      
  • 【问题】1000 个标点时页面就出现 卡顿

3.解决 - 1000 个标点时页面就出现 卡顿 问题

想尽各种办法:

  1. 【海量点第一种方法】:海量点 MassMarks 官方示例 (代码示例如下)
  2. 【海量点第二种方法】:标注和标注图层-海量点 官方示例
  3. 【点聚合】:MarkerCluster 官方示例

【海量点第一种方法】代码

<script>javascript">
/* 注释掉的代码与当前功能无关 */
let map = null
// let infoWindowCon = null
// let contextMenu = null
let makerPeak = nullexport default {name: 'mapManager',data() {return {// ...dangerSucMass: null // 【关键代码】海量点图层}},methods: {// 使用【海量点第一种方法】实现标点completeAddMarker(data) {this.dangerSucMass?.clear()const list = (data || []).map((item, index) => {return {id: item.id,name: item.address,lnglat: [item.longitude, item.latitude],style: 0,extData: {tabType: 'dangerSuceess',...item}}})this.dangerSucMass = new AMap.MassMarks(list, {opacity: 0.8,zIndex: 111,cursor: 'pointer',style: [{url: require('@/assets/image/green.png'),anchor: AMap.Pixel(0, 0),size: new AMap.Size(10, 10),zIndex: 3}]})this.dangerSucMass.setMap(map)this.dangerSucMass.on('click', this.successMarkerClick)},// 展示/隐藏图标isShowSucMass(e) {if (e) {this.dangerSucMass.show()this.markerTip.open(map)} else {this.dangerSucMass.hide()this.markerTip.close()}},//监听successMarkerClick(e) {console.log('e--successMarkerClick--打印', e)// 添加点击marker时的提示if (this.markerTip) {this.markerTip.close() // 关闭提示}const data = e.data.extDataconsole.log('e.data.extData----打印', data)this.infoWindowData = { ...data, type: 'dangerSuceess' }const position = [data.longitude, data.latitude]map.setCenter(new AMap.LngLat(position[0], position[1]), true)this.markerTip = new AMap.InfoWindow({ // 提示插件position: new AMap.LngLat(position[0], position[1]), // 经纬度content: this.$refs['infoW'].$el,offset: new AMap.Pixel(5, 0) // 偏移位置})this.markerTip.open(map)// this.$refs.infoW.open({...e.data.extData, typeTab: 'dangerSuceess'})},}
}
</script>

4.使用海量点、聚合标点后还有卡顿,排查其他原因

以上三种办法 - 页面还是卡顿 - 基于以上三种解决办法排查到以下多方面原因:

  1. 页面中有list数据 列表渲染,数据过多,页面数据渲染过多也会导致页面卡顿
  2. 地图相关的变量data 中声明(此处以【海量点第一种方法】为例)
    • 以上 【海量点第一种方法】代码 中可以看到,海量点实例 dangerSucMassdata 中声明 ↓↓↓
    • 所有 地图相关的实例不要放在 vue 的可响应数据中,响应数据会 劫持属性地图的属性会被修改,另外,劫持的属性可能和渲染有关,那么 会增加很多响应的计算,会很卡; 参考别人遇到的类似的问题-官方解释
      在这里插入图片描述

5.最终解决

5.1页面中list数据渲染问题解决

最初地图标点和list数据使用的是一套数据
【解决】

  • 地图标点数据页面渲染数据 分成两套列表数据
    • 地图标点数据:获取所有标点数据
    • 页面渲染数据列表:改成分页获取数据,单次获取一部分数据

5.2地图相关实例不要放在 vue 的可响应数据中

最终解决办法【海量点第一种方法】代码

<script>javascript">
/* 注释掉的代码与当前功能无关 */
let map = null
// let infoWindowCon = null
// let contextMenu = null
let makerPeak = null
let dangerSucMass = null // 【关键代码】【解决代码】海量点实例 - 不在 data 中export default {name: 'mapManager',data() {return {// ...// dangerSucMass: null // 【关键代码】海量点实例}},methods: {// 使用【海量点第一种方法】实现标点completeAddMarker(data) {dangerSucMass?.clear()const list = (data || []).map((item, index) => {return {id: item.id,name: item.address,lnglat: [item.longitude, item.latitude],style: 0,extData: {tabType: 'dangerSuceess',...item}}})dangerSucMass = new AMap.MassMarks(list, {opacity: 0.8,zIndex: 111,cursor: 'pointer',style: [{url: require('@/assets/image/green.png'),anchor: AMap.Pixel(0, 0),size: new AMap.Size(10, 10),zIndex: 3}]})dangerSucMass.setMap(map)dangerSucMass.on('click', this.successMarkerClick)},// 展示/隐藏图标isShowSucMass(e) {if (e) {dangerSucMass.show()this.markerTip.open(map)} else {dangerSucMass.hide()this.markerTip.close()}},//监听successMarkerClick(e) {console.log('e--successMarkerClick--打印', e)// 添加点击marker时的提示if (this.markerTip) {this.markerTip.close() // 关闭提示}const data = e.data.extDataconsole.log('e.data.extData----打印', data)this.infoWindowData = { ...data, type: 'dangerSuceess' }const position = [data.longitude, data.latitude]map.setCenter(new AMap.LngLat(position[0], position[1]), true)this.markerTip = new AMap.InfoWindow({ // 提示插件position: new AMap.LngLat(position[0], position[1]), // 经纬度content: this.$refs['infoW'].$el,offset: new AMap.Pixel(5, 0) // 偏移位置})this.markerTip.open(map)// this.$refs.infoW.open({...e.data.extData, typeTab: 'dangerSuceess'})},}
}
</script>

页面展示


http://www.ppmy.cn/news/1529779.html

相关文章

nodejs安装

下载安装包 https://nodejs.cn/download/ 配置环境变量&#xff1a; PATH编辑-新建- D:\node-v20.17.0 检测安装是否成功&#xff1a; npm -v 设置缓存与包安装位置 在nodejs安装目录下新建缓存与模块安装位置node_cache 、node_modules 更改全局模块路径&#xff1a; 运…

Parallels Desktop 20 for Mac 推出:完美兼容 macOS Sequoia 与 Win11 24H2

Parallels Desktop 20 for Mac 近日正式发布&#xff0c;这一新版本不仅全面支持 macOS Sequoia 和 Windows 11 24H2&#xff0c;还在企业版中引入了一个全新的管理门户。新版本针对 Windows、macOS 和 Linux 虚拟机进行了多项改进&#xff0c;其中最引人注目的当属 Parallels …

shell linux cut 切割字符串

shell linux 切割字符串 在Shell脚本中&#xff0c;可以使用内置的cut命令来切割字符串。cut命令主要有三个选项 -c、-f和-d&#xff0c;分别表示按字符、按字段和指定分隔符来切割字符串。 按字符切割&#xff1a; echo "Hello World" | cut -c 1-5 # 输出&#…

开源模型应用落地-Qwen2.5-Coder模型小试-码无止境(一)

一、前言 代码专家模型是一种基于人工智能的先进技术&#xff0c;旨在自动分析和理解大量代码库&#xff0c;并从中学习常见的编码模式和最佳实践。这种模型通过深度学习和自然语言处理&#xff0c;能够提供准确而高效的代码建议&#xff0c;帮助开发人员在编写代码时有效地避免…

新版本大疆上云API指令飞行(drc)模式通讯搭建思路

一、大疆上云API mqtt官方通讯指导 1.1drc链路 1.2mqtt交互时序图 二、自行搭建mqtt说明 2.1工具&#xff1a;用emqx搭建mqtt服务器&#xff0c;mqttx作为客户端测试工具 2.2端口说明&#xff1a;1883&#xff0c;普通mqtt消息端口&#xff0c;8083&#xff0c;ws通信协议端…

路由基础--路由引入

路由引入的主要作用是实现路由信息在不同路由协议之间的传递和学习。在大型企业网络中&#xff0c;多种路由协议共存是常态&#xff0c;为了实现全网互通&#xff0c;需要通过路由引入来传递路由信息。此外&#xff0c;执行路由引入时还可以部署路由控制&#xff0c;从而实现对…

Java项目实战II基于Java+Spring Boot+MySQL的读书笔记共享平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在信息爆炸…

浅谈spring 后端项目配置logback日志

日志 Java boy 后端项目日志一般用 logback or Log4j & Log4j2,spring 默认集成logback,本文主要以logback 展开例子说明。 对于日志系统有什么样的需求&#xff1f; 1、本地环境需要打印Console日志。 2、测试环境最好实时打印日志。 3、生产环境打印日志不要阻塞系统&am…