/baiduMapMoreMarker

百度地图大批量marker展示

Primary LanguageJavaScript

百度地图大批量marker覆盖物地图展示:

一开始想使用地图的聚合功能实现,使用的过程中发现,遇到两个问题,1.首次加载卡顿,2.只能支持同时约4000个点(具体与电脑环境,浏览器有关系,仅供参考)在可视范围内,性能瓶颈主要在两个方面:1.改变可视区域范围重新计算聚合覆盖物,2.每个覆盖物都是一个dom元素,可想而知会渲染会占多长的时间。所以在这个过程中会把所有的点重头遍历到尾,与首次加载需要画相同的时间。


实际情况分析:

  • 首次加载卡顿:分批量加载覆盖物,加上loading可以解决,以下是一些实践的数据;
  1. 一次性加载: ​ Marker覆盖物数:20000 总时间: 15195.4970703125ms ​ Marker覆盖物数:30000 总时间: 25328.45703125ms ​ Marker覆盖物数:40000 总时间: 37894.23291015625ms ​ Marker覆盖物数:50000 总时间: 49191.421875ms ​ Marker覆盖物数60000 总时间: 64609.864990234375ms

打开地图未加载聚合点时界面空白(计算点同步,占资源)

  1. 按1000个分批加载: Marker覆盖物数60000 总时间: 83188.876953125ms 首次加载不白屏,动态看到聚合点个数增加加载过程中可操作其他的dom,不阻塞,例如点击别的按钮,比其他首次加载时间更长

  2. 首次1000个之后全部加载: Marker覆盖物数:60000 总时间: 55358.702880859375ms 首次加载不白屏,但加载剩下的点过程中页面卡顿,其他的dom元素无法操作,加载所需时间最短。

  • 拖动重绘问题

    **思路:**针对当前需要操作的数据问题,我们可以划分原始数据,按需要展示的内容给数据,从源头减少数据量,从而减低卡顿。

    1.先整理数据并按某个维度(此demo按行政区)划分,并统计总数(如省份),如果数据颗粒大继续往小的范围划分比如按市级逐一向下,颗粒度越小越好,但你可能需要多花一些时间。

    2.通过获取可视范围所包含的行政区给予数据,如何判断当前的范围需要给的数据,如:当前地图level 为1,包含了全世界,以下是碰到的问题与解决方案。

    1. 目前涉及的数据还在国内的范围,而我们的数据最大区域单位为省,按照实际的情况,等级1-6(百度地图)可以覆盖全国,7-9可完整的包涵省份.具体按需要调整,

      • 包涵全部marker点时也就是地图在1-6时,再这种情况下,点的密集程度无法看清的,在物理距离一厘米内可能有成百上千个覆盖物,即便是展示出来也没太大的意义,所以我把它们按省份统计出来的,仅展示统计好的总数,在7-9的范围里,处理与前面相似,划分数据行政等级改成了市,相对会清楚一点,这样减少了大量的覆盖物,再结合聚合基本上可以满足。
    2. 判定省份的边界,也就是可视区域中包涵哪些省份,我们需要一份地图的行政区边界值数据,以及当前行政区下级行政区的数据,接下来就是判断了

可视区域与行政区分别有以上图片的四种情况是我们需要计算的,因为行政区的边界是个不规则的多边形,所以数据量大,从顶级行政区开始,使用当前可视区域进行判断是否包涵省份,再从这些省份中筛选包涵的市级行政区,减少计算量,本例子中简略使用简略的实现,使用矩形设置边界值(左上,右下)

3.需要解决这个覆盖物的问题,对聚合应该不陌生吧,那就聚合上面的结果。

首次加载所有,通过自定义覆盖物显示区域总数,每次改变可视范围都进行判断可视区域中包含哪些行政区,这种情况,无论是否使用聚合,应该能够解决大批量覆盖物的情况,

以下是目前百度官方没有api获取的数据,以及需要解决的问题:

1.划分区域的中心点(用于放置区域里总数) ;

2.划分区域的边界值 (已获取省份);

3.可视范围中判断包含哪些行政区规则;

4.需要原始数据中带划分区域的标识;

examples例子查看;cd examples live-server

思路二:

通过canvas画布,把所有的覆盖物都画在画布上,减少浏览器渲染dom,从根本上解决,但是需要知道经纬度在canvas换算的算法,搁浅...

更新: https://mapv.baidu.com/ 如果对覆盖物的样式没有需求,或者修改源码自己定义这个还不错