Leaflet.Canvas-Marker-Layer 图层的诞生
条评论之前写过一个基于 Leaflet 的标注点图层插件,Leaflet.Canvas-Marker-Layer,今天简单的说一下为什么需要用到它。在 Leaflet 中如果你需要渲染 marker,有两种方式:
- 一种是基于 dom 的UI-Marker
- 另一种是基于 canvas 的CircleMarker。
可想而知:
- dom 提供了强大的自定义能力,我们可以通过 css 绘制出各种想要的效果,填充各种想要的数据内容,但问题在于 marker 过多就会导致页面特别的卡顿,当然官方也悉心的给出了许多cluster 解决方案,通过聚类或者碰撞检测,只展示一部分内容,根据缩放等级来调整展示内容的数量。
- canvas 则提供了非常高的渲染性能,但不足的是
CircleMarker
仅仅是在地图上绘制了一个矢量图形,比如圆,矩形等,灵活性比较差,通常是通过点击事件或 popup 来展示具体的内容。
起源
那么如果我想两者兼得呢?实际上 canvas 本身的功能是很强大的,可以绘制各种图案,甚至各种颜色的文字,所以我们要做的其实就是拓展官方CircleMarker
的功能,让它自定义程度更高,有点类似于DivIcon的概念。
在 github 上搜寻类似功能时候,我找到了eJuke 的 Leaflet.Canvas-Markers这个库,和我想要的功能基本类似,采用 canvas 来绘制大量的 maker,但是他只提供了图片类型的 marker,所以我们稍加改动就好。
源码说明
ejuke
的库对于图层创建、事件处理已经比较完善,我们只要修改下_drawMarker
方法就好:
_drawMarker: function (marker, pointPos) { |
使用说明
/** userDrawFunc提供的参数说明 |
通过这样在 canvas 上绘制大量 marker 的效果就大大改善了。