本文主要是介绍vue3+优化vue-baidu-map中marker点过多导致的页面卡顿问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
场景: 移动端h5中,当我们需要在地图中展示很多marker点坐标的时候,通常会使用 bm-marker ,去循环生成marker点,在数量不多的情况下是没问题的,但是随着数据量的增加,地图就会变得卡顿,以及渲染延迟,体验感极差
解决办法第一个想到的就是海量点 BmPointCollection,但是海量点明显的缺点就是不能自定义marker样式(icon)。但是业务是需要自定义图标 的,那没办法,就只能使用以下两种方式进行优化。
-
使用点聚合 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 },}, })
如果还有其他更好的办法,欢迎补充!
这篇关于vue3+优化vue-baidu-map中marker点过多导致的页面卡顿问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!