Code Monkey home page Code Monkey logo

leaflet.canvas-markers's Introduction

中文 | English

Leaflet.Canvas-Markers

一个Leaflet插件,基于Canvas方式绘制Marker,相比于传统的DOM方式,性能可以得到极大提升(下文会有对比测试)。

插件定义了一个L.canvasIconLayer的图层,将marker添加到这个图层后,图层内部会使用Canvas的方式来绘制Marker。

插件还支持添加文字,使用图片和文字组合可以实现标签的功能。

支持leaflet1.0.0及更高版本。

在线示例

加载10万个Marker

加载10万个标签

安装和基本使用

下载此代码库,拷贝 dist 文件夹中的`leaflet.canvas-markers.js到项目中,并添加引用。

<script src="leaflet.canvas-markers.js"></script>

定义一个canvasIconLayer图层并添加到地图,然后向图层添加Marker,图层会自动使用canvas方式绘制marker。

// 添加一个图层
var ciLayer = L.canvasIconLayer({}).addTo(map);

// 定义一个marker 
var marker =  L.marker([58.5578, 29.0087], {icon: icon});

// 把marker添加到图层
ciLayer.addMarker(marker);

使用标签

在定义icon时,增加texttextAnchortextFonttextFillStyle来设置标签里的文字。

// 添加一个图层
var ciLayer = L.canvasIconLayer({}).addTo(map);

 //定义一个icon设置图片和文字
var icon = L.icon({
    iconUrl: './img/bg.png',	//背景图片
    iconSize: [84, 34],			//设置图标大小
    iconAnchor: [40, 20],		//设置图标偏移

    text:i.toString(),			//添加文字
    textAnchor: [5, 0],         //设置文本偏移
    textFont:'14px bold',       //设置字体大小和样式
    textFillStyle:'#FFFFFF'     //设置字体颜色
});

// 定义一个marker 
var marker =  L.marker([58.5578, 29.0087], {icon: icon});

// 把marker添加到图层
ciLayer.addMarker(marker);

对比测试

插件在谷歌浏览器v66和IE11上进行了测试。下面是加载10万个Marker的测试结果:

测试指标 传统方式 该插件
内存使用 高达2.8 Gb 大约 300 M
首次加载时间 160-200 秒 1秒以内
缩放和移动时间 超过3分钟 0.5 秒

效果很明显,传统的DOM方式无论是加载还是操作都很慢。所以,如果你的数据量很大,那就应该优先考虑使用该插件这种的Canvas方式加载数据。

方法

  • addMarker(marker): 向图层添加marker.。
  • addMarkers(markers): 向图层添加多个marker。
  • removeMarker(marker, redraw): 从图层中删除marker,删除后marker不会马上消失,除非调用redraw()方法或缩放和移动地图,marker才会消失。如果想一步到位删除marker,请将redraw设置为“true”,或者直接调用**removeLayer()**方法。
  • redraw(): 重新绘制图层
  • addOnClickListener(eventHandler): 为图层添加鼠标单击的侦听事件
  • addOnHoverListener(eventHandler): 为图层添加鼠标悬停的侦听事件

也可以使用默认的addLayeraddLayersremoveLayer(相当于removeMarker(marker,true) 方法来实现marker的添加和删除。

和原代码库的区别

  1. 解决了地图缩放时会飘的问题
  2. 解决了移动端手指捏合缩放时会飘的问题
  3. 增加了添加文字接口,可以实现标签功能。

参考

https://github.com/corg/Leaflet.Canvas-Markers

https://github.com/eJuke/Leaflet.Canvas-Markers

https://github.com/yakitoritabetai/Leaflet.LabelTextCollision

leaflet.canvas-markers's People

Contributors

corg avatar crzo avatar ejuke avatar spaction avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.