问题说明

在地图开发中,当地图中绘制大量的标记点后,无论是拖动或者缩放,都会感觉到明显的卡顿现象。(一般超过800个点后就比较明显了).在平时的工作业务中,由于公司的实时监控页面需要展现5000-20000车辆的实时定位跟踪,特别是切换到车辆密集的港口码头卡顿现象非常严重(如下图),看起来非常难看,用户体验也非常差。在此写下一些开发优化中的心得体会(本文中使用的是高德地图为参考)。


解决思路

  1. 首先我们应该将地图上的所有覆盖物(包括Marker,Icon,Text,Polygon)分组添加到多个OverlayGroup中对每一类统一管理。部分覆盖物默认隐藏,需要时才展现。

  2. 不要将大量的覆盖物信息都直接挂载在地图对象上,可以按需加载,减少地图在移动后重新渲染的工作量

  3. 合理的使用覆盖物聚合(聚合虽然会减少卡顿,但是覆盖物数量太多依旧会比较卡)

解决方法

首先,添加一个地图设置勾选面板,将除车辆点标记以外的所有覆盖物按类型分类,添加到一个个单独的OverlayGroup中默认不挂载在地图上,在勾选时才调用OverlayGroup.setMap(map)方法添加到地图上。去掉了这些不必要覆盖物,首次进入时立马清爽了许多。


尽管去掉了各类网点,文字,等覆盖物,但是我们需要渲染的车辆标记点依旧是非常多的。在此基础上,我们采用按屏幕加载,筛选出屏幕内的点,屏幕外的标记点不渲染,监控每次地图的moveend,zoomend,resize,每次的改变后重新计算屏幕内的标记点,当屏幕内标记点较少,比如200以下(这个随个人需要定),直接绘制在地图上。当屏幕内标记点比较多,大于200,调用聚合方法,将标记点聚合后绘制在地图上。

参考代码

    /**监听地图拖拽,放大事件,根据屏幕范围动态渲染点位 */reloadMarks(){AMap.event.addListener(this.map,'moveend',()=> {this.computeMarkers();})AMap.event.addListener(this.map,'zoomend',()=> {this.computeMarkers();})AMap.event.addListener(this.map,'resize',()=> {this.computeMarkers();})},/** 根据当前屏幕范围帅选marker */computeMarkers(){this.newViewData={};//获取当前视图范围let now_bounds = this.map.getBounds();//遍历车辆数据,为了减少后台传入的重复数据,我的车辆信息列表一直使用对象保存for(let sel_deviceNo in this.carDataObj0){let item=this.carDataObj0[sel_deviceNo];//判断当前点的坐标是否存在于视图内if(now_bounds.contains(item.gcj02_coords.split(','))){//将当前屏幕内的视图点保存this.newViewData[sel_deviceNo] = item;}}this.renderMarker();now_bounds=null;},/** 创建聚合**/createCluser(markerArr) {AMap.plugin(['AMap.MarkerClusterer'], () => {this.cluster = new AMap.MarkerClusterer(this.map, markerArr, {gridSize: 80,renderCluserMarker,minClusterSize: 1,maxZoom: 18});})},/** 将markers渲染到map上 */renderMarker(){//判断目前是否有当前覆盖物组!this.overLayGroup && this.overLayGroup = new AMap.OverlayGroup([]);let MarkerAddArr = [];for(let sel_deviceNo in this.newViewData){/**我的所有创建的Marker点对象都是长期存在于this.markerObj中,并不销毁,每次数据更新后调用marker对象的setPosition(),setAngle(),setIcon()等方法改变状态,再筛选出需要挂载上的一起加到地图上 **/if(this.markerObj[sel_deviceNo]){MarkerAddArr.push(this.markerObj[sel_deviceNo]);}}this.overLayGroup.clearOverlays();//超过200个点则开启聚合模式  且在聚合模式下不渲染面板展示点if(MarkerAddArr.length>=200){if(this.cluster){this.cluster.clearMarkers();this.cluster.setMarkers(MarkerAddArr);}else{this.createCluser(MarkerAddArr);}}else{if(this.cluster){this.cluster.clearMarkers();}this.overLayGroup.addOverlays(MarkerAddArr);this.overLayGroup.setMap(this.map);}MarkerAddArr=null;},

代码直接从业务中复制的,耦合度比较高,还请见谅。 做完了标记点按屏幕分组加载之后,我们在添加一个简单的防抖方法,防止连续的拖动或者缩放导致computeMarkers方法被触发,减少方法调用次数

const debounce = (fn, wait=500) =>{return function() {clearTimeout(fn.timer)fn.timer = setTimeout(fn.bind(this, ...arguments), wait)}
}

完成后效果如下:减少了地图的计算与渲染,每次只计算视野内的点数,因此总数的大小不会影响地图性能,当视野内超过200个点都会聚合,200以下时显示。


平时写文章比较少,文笔很差,还请多多见谅,谢谢。

关于VUE项目地图开发中大量点标记绘制一些总结相关推荐

  1. Vue项目构建开发入门

    Vue项目构建开发入门 开篇:Vue CLI 3 项目构建基础 大家好,当你点进这个标题,开始阅读本章的时候,说明你对 Vue.js 是充满好奇心和求知欲的.我之前写过一篇文章,这样评价 Vue.js ...

  2. [vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢?

    [vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢? 1.检查nginx配置,是否正确设置了资源映射条件: 2.检查vue.config.js中是否配置了publicPath ...

  3. 加快Vue项目的开发速度

    加快Vue项目的开发速度 现如今的开发,比如是内部使用的管理平台这种项目大都时间比较仓仓促.实际上来说在使用了webpack + vue 这一套来开发的话已经大大了提高了效率.但是对于我们的开发层面. ...

  4. 用Docker搭建Laravel和Vue项目的开发环境

    在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速.轻量级.不依赖本地电脑所安装的任何开发套件的可复制的Laravel和Vue项目的开发环境(开发环境的所有依赖都安装在Docker构建容器 ...

  5. Vue CLI 3开发中试用UIkit 3组件库

    一.UIkit组件库与vuikit简介 在选择好意中的前端开发基本框架后,接下来一个重要任务就是选择一款好的UI组件库.其中,UIkit组件库是一款基于Less+JS的一款轻量级.模块化.响应式的前端 ...

  6. Vue项目在标签中如何书写多个内敛style样式

    Vue项目在标签中如何书写多个内敛style样式 例如:对一个数组进行循环,我想给偶数项的添加红色背景,奇数项的添加蓝色背景,这时候就可以用v-bind:style="[]",详细 ...

  7. vue项目在vscode中编译eslint报错没显示红色波浪线提示

    vue项目在vscode中编译eslint报错没显示红色波浪线提示. 如下图所示: 下图是预期效果: 不符合Eslint校验规则的代码位置都能展示出来,这样一目了然.能帮助我们迅速找到报错的位置. 然 ...

  8. Vue CLI 3开发中屏蔽烦人的EsLint错误

    问题 Vue开发中,特别是当你阅读分析别人的其中早期版本的Vue代码时往往会遭遇到满屏幕的烦人的EsLint错误.有关EsLint这个工具的作用不再赘述.查阅网上参考文档,大多是针对早起版本Vue C ...

  9. VUE学习和开发中的注意点总结(一),便于回顾(不断完善补充。)

    1.export 和export default 的区别? 在JavaScript ES6中,export与export default均可用于导出常量.函数.文件.模块等,你可以在其它文件或模块中通 ...

最新文章

  1. Python 技术篇-使用opencv库读取中文路径图片报错解决办法
  2. 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据
  3. lucky前面加a还是an_“不可数”名词前何时加a/an,何时不加?来自本站教师群的两道典型题问答,揭示了规律 白话英语201931...
  4. sorted_一个函数秒杀冒泡排序算法和选择排序
  5. ICE学习之C# Java之间通讯
  6. python开发面试笔试题_python集合面试笔试题
  7. 使用jdk提示Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper
  8. 2021年中国物流科技行业投融资现状及未来发展前景分析[图]
  9. mapgis注释文字文件完整转换成arcgis格式注记shp 2019视频教程
  10. 【JS基础】JavaScript轮播图代码详解
  11. 获取农历时间(几月初几)
  12. 朱志坤计算机学院,厦门工学院第七届田径运动会竞赛规程.doc
  13. Selenium自动化测试框架基础操作
  14. ios微信双开,iOS微信分身免越狱方法来了!
  15. 在Fedora 12 下安装Intel X4500 显卡驱动
  16. java 黄金分割率_黄金分割率使您的网页设计更有效
  17. 机器学习入门编程环境配置
  18. ubuntu 16.04L解压zip文件出现乱码
  19. 怎样绘制英语学习思维导图?简单的方法介绍
  20. 【资料合集】2017云栖大会•苏州峰会回顾合集:PDF下载

热门文章

  1. yandexbot ip列表整理做俄罗斯市场的站长可以关注一下
  2. 微服务之数据同步Porter 1
  3. Spring Boot 学习笔记(三)Spring boot 中的SSM
  4. 基于django rest framework的mock server实践
  5. Centos7 开启端口
  6. 欧拉函数 euler
  7. __construct()和__initialize()
  8. SPFILE 、PFILE 的全面解读
  9. 敏捷开发绩效管理之四:为团队设立外部绩效目标(目标管理,外向型绩效)...
  10. 如何取得好的软件设计