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

vue3+优化vue-baidu-map中marker点过多导致的页面卡顿问题

场景: 移动端h5中,当我们需要在地图中展示很多marker点坐标的时候,通常会使用 bm-marker ,去循环生成marker点,在数量不多的情况下是没问题的,但是随着数据量的增加,地图就会变得卡顿,以及渲染延迟,体验感极差
解决办法第一个想到的就是海量点 BmPointCollection,但是海量点明显的缺点就是不能自定义marker样式(icon)。但是业务是需要自定义图标 的,那没办法,就只能使用以下两种方式进行优化。

  1. 使用点聚合 BmlMarkerClusterer ,这个没啥好说的,缺点也很明显,不方便查看。
    <baidu-map @click="mapClick" class="bm-view" :zoom="12" :center="center"><bml-marker-clusterer :averageCenter="true" :styles="styles"><bm-marker @click="clickMarker(marker)" v-for="marker of pointList" :key="marker":position="{ lng: marker.lng, lat: marker.lat }" :icon="icon"></bm-marker></bml-marker-clusterer>
    </baidu-map>
    2.根据当前可视区域进行渲染(只渲染当前可视区域内的marker点)
    <!-- 1 正常渲染 添加ready事件  /> -->
    <baidu-map @click="mapClick" class="bm-view" :zoom="12" :center="center" @ready="readyMap"><bm-marker @click="clickMarker(marker)" v-for="marker of pointList" :key="marker":position="{ lng: marker.lng, lat: marker.lat }" :icon="icon"></bm-marker>
    </baidu-map>
    
    let bounds = ref(null) //可视区域
    let map = reactive(null) //地图实例
    let sourceList = [] //接口请求的marker点数据
    let pointList = [] //渲染的marker数据//地图ready事件
    function readyMap({ map:data }) {map = data//获取可视区域bounds.value = map.getBounds()// 地图添加缩放和拖拽事件 动态获取地图可视区域map.addEventListener('dragend', getBounds)map.addEventListener('zoomend', getBounds)
    }
    //获取地图的可视区域
    function getBounds() {if (!map) returnbounds.value = map.getBounds()
    }
    //动态计算区域内的坐标 sourceList.value
    watchEffect(() => {if (!bounds.value || !sourceList.value.length) return []//获取可视区域左下角let SouthWest = bounds.value.getSouthWest()//获取可视区域右上角                                                                                                                                                       				let NorthEast = bounds.value.getNorthEast();let markerList = [] // 筛选 获取区域内的点 sourceList.value.forEach(item => {if (item.lon >= SouthWest.lng &&item.lon <= NorthEast.lng &&item.lat >= SouthWest.lat &&item.lat <= NorthEast.lat) {markerList.push(item)}})//赋值显示pointList.value = markerList
    })
    //最后移除监听事件
    onUnmounted(() => {if (map) {map.removeEventListener("dragend", getBounds)map.removeEventListener("zoomend", getBounds)}
    })//marker icon 样式
    let icon= ref({url: 'https://xxxxxxxxxxxxxxxx.png',size: { width: 18, height: 18 },opts: {imageSize: { width: 18, height: 18 },},
    })

    如果还有其他更好的办法,欢迎补充!

http://www.lryc.cn/news/372812.html

相关文章:

  • PMS助力制造企业高效运营︱PMO大会
  • 认识一些分布-关于极值点分布的一些知识
  • Anaconda环境安装失败的解决方案
  • mac 本地启动rocketmq
  • 数据资产管理的未来趋势:洞察技术前沿,探讨数据资产管理在云计算、大数据、区块链等新技术下的发展趋势
  • lwip中server和client的socket、地址和端口号
  • 代码随想录算法训练营Day38|动态规划理论基础、2.斐波那契数、3.爬楼梯、4.使用最小花费爬楼梯
  • IIC通信总线
  • 2024 年最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
  • git原理解释,windows 10 / ubuntu 24.04 安装使用 github
  • requests post json/data;requests response 接收不同数据
  • 【qt】平面CAD(计算机辅助设计 )项目 上
  • C++中bool类型的使用细节
  • Java 面向对象 -- Java 语言的封装、继承、多态、内部类和 Object 类
  • 【C++】和【预训练模型】实现【机器学习】【图像分类】的终极指南
  • HTML5 Web SQL数据库:浏览器中的轻量级数据库解决方案
  • C++ const关键字有多种用法举例
  • Makefile-快速掌握
  • 定个小目标之刷LeetCode热题(20)
  • 短剧分销小程序:影视产业链中的新兴力量
  • 使用fvm切换flutter版本
  • python通过selenium实现自动登录及轻松过滑块验证、点选验证码(2024-06-14)
  • 【C++】开源项目收集
  • 爬虫相关面试题
  • Spring Cloud Netflix 之 Ribbon
  • C语言怎样记住那么多的颜⾊?
  • LabVIEW软件开发任务的工作量估算方法
  • 【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error
  • Prometheus的四种指标类型
  • FastDFS SpringBoot 客户端 Demo搭建,支持文件上传下载