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

问题说明

在地图开发中,当地图中绘制大量的标记点后,无论是拖动或者缩放,都会感觉到明显的卡顿现象。(一般超过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以下时显示。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367194.shtml

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

相关文章

如何使用Java 5 Executor框架创建线程池

Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离。 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概念。 对于那些不熟悉Java中的线程池或这里的线程池的概念…

fedora python3-mysql_fedora 安装python mysql

如果你服务器环境允许yum,安装MySQL-python模块就很简单了。如果直接安装不行,先安装MySQL-devel后正常运行yum install mysql-develyum install MySQL-python -y1yum install MySQL–python–y当然也可以源码安装该模块首先安装 setuptools,…

var let 区别

var a 5; var b 10;if (a 5) {let a 4; // if 块级作用域var b 1; // 函数级作用域console.log(a); // 4console.log(b); // 1 } console.log(a); // 5 console.log(b); // 1var声明的变量是函数级的或者是全局的,而let用于声明块级作用域。 在函数或程序顶层…

服务器如何返回429状态,Instagram远程服务器返回一个错误:(429)UNKNOWN STATUS CODE...

我正在使用我自己的instagram api开发一些新程序。 一切都与我工作正常,除了以下的用户脚本 我想按照我的用户ID 的名单,所以我用这个代码Instagram远程服务器返回一个错误:(429)UNKNOWN STATUS CODEforeach (var item in listBox1.Items){We…

使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

在上一篇文章中 ,我写了NetBeans 7.4 beta中提供的提示 ,这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中,我将研究如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更加正确和清晰…

yum 和 rpm安装mysql彻底删除

1、yum方式安装的MySQL $ yum remove mysql mysql-server mysql-libs compat-mysql51 $ rm -rf /var/lib/mysq $ rm /etc/my.cnf 查看是否还有mysql软件: $ rpm -qa|grep mysql 如果存在的话,继续删除即可,删除方式:yum remove 【…

Web 开发中 Blob 与 FileAPI 使用简述

本文节选自 Awesome CheatSheet/DOM CheatSheet,主要是对 DOM 操作中常见的 Blob、File API 相关概念进行简要描述。 Web 开发中 Blob 与 FileAPI 使用简述 Blob 是 JavaScript 中的对象,表示不可变的类文件对象,里面可以存储大量的二进制编…

django1.5 连接mysql_django1.5.5使用mysql

pythn3.3下实现django1.5.5连接mysqldjango1.5.5发布有一段时间了,最大的亮点在于支持python3.在版本上跟进了python3的各种应用。而在数据库方面,django1.5.5的mysqldb却还停止不前。幸在有mysql自发布的connector python连接器对python3的支持。准备工…

Thread部分总结以及小例子

Thread总结:一直以来用thread比较多,一般会在同步以及ui中用到.以下对于经常用作为简单介绍.一 实现方法: 一种直接new thread,另外一种是实现Runnable接口,在创建thread的时候将Runnable直接丢…

服务器e系列和l的区别,i.e.和 e.g.的区别和使用方法

举例说明在很多文章中都有使用过,我想这个对大家应该并不陌生,但是大家知道ie和eg的区别吗,他们两个都是举例子的缩写词,但是他们之间的区别大家知道吗,今天我们就来介绍下这两个举例说明的缩写词到底有什么不一样。一…

django QuerySet对象转换成字典对象

今天做一个添加购物车的模块,在添加商品之前要先验证用户是否处于登录状态,前台用ajax异步发送请求,后台在接收到请求后从session中取出用户登录信息。 根据登录信息从用户表中查询出对应用户,再将状态码和用户信息返回到前台&…

通过基于JDBC的用户存储部署Identity Server

在这篇文章中,我将演示如何使用JDBC用户存储配置WSO2 Identity Server。 为了演示,我使用的是MySQL用户存储,但是相同的过程也适用于任何其他JDBC用户存储。 我的环境是 操作系统– Ubuntu 12.10 Java – 1.6 WSO2是4.5.0 设置MySQL数据库…

前端路由实现原理(history)

前端路由实现(history) 了解: HTML5 history新增了两个API:history.pushState和history.replaceState 两个api都接受三个参数 状态对象(state object):一个JavaScript对象,与用pushState()方法…

mysql中临时表的特点_解析Mysql临时表及特点

临时表是当连接没有断开时存在,一旦断开就不会存在,临时表的数据和结构都在内存中,可以做个测验,你创建一个临时表,但是到响应的数据目录下并不会找到.frm文件mysql> CREATE TEMPORARY TABLE tmp_table (->->…

原生js实现一个连连看小游戏(三)-----------点击列表获取索引

需求&#xff1a;当点击一个列表时&#xff0c;我们要知道它在列表的第几项&#xff0c;即索引&#xff0c;代码实现如下&#xff1a; <!DOCTYPE html> <html> <head><title></title> </head> <body><ul id"myUl">&…

3、数组和集合

数组 ------------------------------------------------------------------ 一维数组 object Demo2 {def main(args: Array[String]): Unit {//定义数组&#xff0c;并指定长度val arr1 new Array[Int](5)arr1(0) 1arr1(2) 4printarr(arr1)//初始化并赋值val arr2 Array[…

unity 删除服务器项目,在吗?有个支持批量构建项目的好东西推荐给你

Unity Build Server是一种全新的项目构建辅助工具&#xff0c;它可以指定硬件设备&#xff0c;专门用于构建项目版本&#xff0c;帮助工作室大规模构建项目&#xff0c;提高团队生产力。很多人在选择Unity时并不会首先考虑到项目构建问题&#xff0c;而随着项目变得更大、更复杂…

使用WSO2 ESB构建制造服务总线(MSB)

在开始讨论本主题之前&#xff0c;我想介绍一些制造业中常用的术语。 术语制造执行系统&#xff08;MES&#xff09;由AMR Research于1990年提出&#xff0c;从先进的制造计算机信息系统的发展&#xff0c;MES概念已经发展了近三十年。 以下是制造执行系统协会&#xff08;MES…

mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法

案例分析&#xff1a;selectc.*fromhotel_info_original cleft joinhotel_info_collection honc.hotel_typeh.hotel_typeandc.hotel_idh.hotel_idwhereh.hotel_idis null这个sql是用来查询出 c 表中有 h 表中无的记录&#xff0c;所以想到了用 left join 的特性(返回左边全部记…

手把手教你写一份优质的前端技术简历

不知不觉一年一度的秋招又来了&#xff0c;你收获了哪些大厂的面试邀约&#xff0c;又拿了多少offer呢&#xff1f;你身边是不是有挺多人技术比你差&#xff0c;但是却拿到了很多大厂的offer呢&#xff1f;其实&#xff0c;要想面试拿offer&#xff0c;首先要过得了简历那一关。…