前段时间写了篇《leaflet如何加载10万数据》的文章,有同学反馈其中的Canvas-Markers插件不反对DivIcon。咱们明天就来聊一聊,为什么这个插件不反对DivIcon,以及如何用H5的Canvas个性,做出以前用DivIcon能力实现的 标签文字标注 性能。

老规矩,先上效果图:

标签性能

文字标注性能

为什么不反对DivIcon

Canvas-Markers插件的创作目标是为了解决,大批量数据展现的性能问题,它通过应用H5中Canvas的绘图形式绘制Marker,晋升了展现性能。但该插件目前只反对Icon,不反对DivIcon。

之所以不反对,是因为DivIcon的实现原理是在HTML页面中增加DOM元素,并在地图平移、缩放时一直的批改DOM元素的属性,而大量增加和批改DOM元素会拉低浏览器的显示性能,呈现卡顿等景象。

如果应用Canvas-Markers后还在持续应用DivIcon,就相当于网络降级了千兆带宽当前,还在用之前的百兆路由器。这时的DivIcon就会和那个百兆路由器一样,成为整个通道中最为狭隘的中央,变成瓶颈。

如果不必DivIcon这个老路由器,有没有新路由器呢?

有!但要分状况。

平时工作中,用DivIcon通常是为了实现 标签性能文字标注 性能

标签性能:

文字标注性能:

针对这两种状况,leaflet都有Canvas形式的解决方案。

标签性能

上文提到,Canvas-Markers插件目前只反对Icon类型的图标,翻看它的代码会发现,其实,它用Icon也只是把Icon当成一个Object来用, 只用来传参,并没有去用Icon外部的性能。因为Icon的外部,也是创立了一个img类型的DOM元素,它和DivIcon一样,大量增加会影响浏览器的显示性能。

Canvas-Markers插件通过Icon获取图片的地址和图片的偏移地位等参数,而后用Canvas的形式绘制图片。

标签由两局部组成,背景框和文字,背景框通常是一个图片。Canvas-Markers插件曾经能够加载图片,咱们只有让它再反对文字,并能管制文字的款式和地位,就能够实现标签性能了。

关上Canvas-Markers插件的代码,在下图地位减少一个绘制文字的办法。

再在下图中的三个地位,减少下面新增办法的调用

这样就能够实现标签性能了,看成果

性能方面,最大反对10万条数据左右。

文字标注性能

我在github上搜寻leaflet+text关键字,翻看了后果中的前20个代码库,找到了 LabelTextCollision 这个插件。

LabelTextCollision插件创作的目标,是为了实现的文字标注的主动避让性能,实现形式是Canvas,文字标注性能是它顺带解决的问题。

测试时,发现了它一个问题,1万条数据,在放大地图时,显示很晦涩,但放大地图时,会呈现卡顿的景象,而且地图越放大,卡顿的就越厉害。

通常在加载大数据量时,都是越放大地图越卡顿,越放大地图越晦涩。但这个插件刚好相同,这是为啥呢?

集体揣测,呈现这种问题,多半是因为没有依据屏幕显示范畴对数据做筛选造成的,不做筛选就会把屏幕显示范畴外的数据也加上。

这个插件因为它做了文字显示的避让,越放大地图,数据在屏幕上显示的就越集中,主动避让掉的文字就越多,显示的文字就越少,展现就越晦涩。

越放大地图,数据在屏幕上显示的就越扩散,主动避让的文字就越少,显示的文字就越多,这时如果没有做筛选,展现就会越来越卡顿。

看了下它的代码,证实了我的揣测,的确没有发现,对屏幕区域外显示内容进行限度的代码。

那咱们就来给它加上,在下图中的两个中央增加对屏幕显示范畴的判断,只显示以后能看到的数据。

再试一下,哈哈,搞定

测试了下,优化后,能够加载5万条数据左右。

更多场景

下面列举了DivIcon常见的两种应用场景,以及如何应用Canvas形式进步展现性能的解决方案,如果你那还有DivIcon的其它应用场景,能够在下方留言,咱们一起探讨解决办法。

总结

  1. Canvas-Markers插件的目标是为了解决,大批量数据展现时的性能问题。
  2. DivIcon实现的原理是在HTML页面中增加DOM元素,大量增加和批改DOM元素会拉低浏览器展现性能。
  3. 从进步展现性能的出发点思考,Canvas-Markers插件不应该去反对DivIcon。
  4. 用DivIcon,通常是为了实现标签性能和文字标注性能,这两个性能都有Canvas形式的解决方案。
  5. 对Canvas-Markers插件进行优化,减少文字接口,能够代替DivIcon实现标签性能。
  6. LabelTextCollision插件能够实现文字标注的主动避让性能,它是用Canvas形式实现,能够代替DivIcon实现文字标注性能。
  7. LabelTextCollision插件在地图放大时,最多只能展现1万条数据左右,优化后能够达到5万条数据左右。

在线示例

标签性能 http://gisarmory.xyz/blog/index.html?demo=diviconError-CanvasMarker

文字标注性能 http://gisarmory.xyz/blog/index.html?demo=diviconError-LabelTextCollision

源码

标签性能 http://gisarmory.xyz/blog/index.html?source=diviconError-CanvasMarker

文字标注性能 http://gisarmory.xyz/blog/index.html?source=diviconError-LabelTextCollision


原文地址:http://gisarmory.xyz/blog/index.html?blog=diviconError

关注《GIS兵器库》公众号, 第一工夫取得更多高质量GIS文章。

本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接:  http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。