高德地图API之海量标注
前言
这篇文章主要探讨了使用高德API加载海量标注点的示例,并针对发现的问题,比如标注点文字和图片共同存在的情况下产生的bug问题复现及其解决过程。
在官方的海量点 点示例中,展示了如何增加3万个点,但是这个有一个细节,就是没有底图的label标注。在我自己的项目中,虽然标注点不是很多,只有五百多个,但还是会出现卡顿,我并不觉得是我自己的代码问题,可能这是一个官方的bug。
为了验证我的猜想,我在示例 中添加了标注,导致示例特别特别的卡,当不显示标注的时候,倒是可以拖动地图,一旦显示了标注,结果就会连标注都无法拖动了,无论是火狐还是谷歌浏览器,都会出现这个问题。
1 | // 为了证明数据量的问题,我把生成的数据的量降到了1500 |
2.测试方法
官方老师给出的答案,是 Loca.LabelsLayer 封装了 AMap.LabelsLayer,最多承载5000个label,数量过大,就会出现卡顿。为此,我专门做了测试,当时我的测试效果并没有老师给的答案那么明朗,同样还是非常的卡。
1 | // 生成测试数据 |
我这里测试,同时打开两个页面,一个加了500个label,一个没有加label,非常明显的加了label的会卡,不加label的拖动起来非常的流畅。
后来按照老师的要求,进行了谷歌的性能记录,还打开了无痕模式,我虽然还不是很懂这个性能记录,我是这么理解的,每一个函数调用都要六七十毫秒,已经超过了浏览器渲染最小间隔16ms,自然就会产生卡顿的情况。
老师说管网的环境可能有问题,他本地测试看看。我自己把官网的例子拿到本地,修改了自己key,进行测试的时候,数量在1100左右就开始有了明显的卡顿了,到1500的时候,已经非常的慢了。
最后老师也没有办法了,说是会出一版性能优化,只能通过升级版本来解决了。我用的时候,是loca 2.0和js sdk 2.0
解决方案
根据老师的回答,还有我自己的测试,我总结出来了下面的几种方案。
1.关闭地图配置的 showLabel
后来我在标注和标注图层-海量点 这个示例里面,发现了奇怪的是,在这个示例中,没有卡顿现象的产生,添加如下内容,为30000个点添加标注,也没有卡顿的情况发生。
1 | var curData = { |
直到我修改了地图的配置,将原先的 showLabel: false 改为了 showLabel: true,页面开始卡顿了,说明这个和 LabelsLayer 这个有冲突,目前只能测试到这个程度了。
2.设置 collision 和 allowCollision
还有一个点,就是我在代码中设置 collision: false 和 allowCollision: false, 关闭图标避让。也会导致页面卡,不知道是什么问题,需要改为 collision: true 和 allowCollision: true。这里在配置的时候,需要注意。
3.使用 AMap.LabelsLayer 而不是 Loca.LabelsLayer
还有一个点需要注意的地方,就是在使用 Loca.LabelsLayer 比使用 AMap.LabelsLayer 要卡,这是我的测试结果,不知道官方活着其他人是不是也是这种情况,因为官方说 Loca.Labelslayer是AMap.LabelsLayerd 封装,我觉得可能还是有性能的损失吧。
1.高德地图 web 端 JS API 遇到的坑及性能优化_YYCCMMKK的博客-程序员秘密 LabelMarker 部分点位在地图放大到一定程度后 不再触发click mouseover 等事件,极少量点位会出现这种情况,目测是某些点位附近可能有什么隐藏物吧,总之就是不触发,但是奇怪的是,同样的经纬度有时确是可以正确触发事件,也可能是LabelMarker 有问题。
4.动态创建和销毁label
这个思路的意思就是:
- 通过将 海量标注 延迟加载(懒加载)的方式,加快页面首屏渲染速度
- 检测 海量标注 中的数据项,判断其坐标是否在浏览器视口区域,进行分片渲染
- 监听地图缩放及移动事件,先删除原标注图层,再根据第二步渲染新图层
- 对 海量标注 中的公共部分进行提取,通过 海量点标记 的方式渲染,减少 DOM 节点数
- 针对点击后高亮被选中的标注,单独添加图层进行叠加,减少第三步带来的延迟
主要代码就是:
1 | export class RfLayer{ |
注意:这个方法也是不行的,在我的vue3.0写的项目中,还是会出现卡顿的问题
1.高德地图「海量点标记 + 海量标注」卡顿问题 解决方案