作为一名GIS开发者,你工作中一定遇到过这种问题,根据业务设计,需要在地图上添加1万+条数据,数据或是点、或是线、或是面。但不管哪种,当你添加到5000条时,地图操作就会出现明显的卡顿。当你添加超过1万条时,数据加载就会卡顿,浏览器出现卡死的状态,地图加载后,每挪动一下地图,都要耐心的等待上几秒钟。

这种交互体验,用户是肯定接受不了的,解决方法通常分两种,一种是去做深入的用户需求分析,看用户想一次性加载这么多数据是为了看什么,想看的这个东西,通过其它技术方式能不能实现。另一种就是死磕技术,研究如何提升地图性能。我们今天只讨论第二种情况。

canvas渲染方式

leaflet支持两种渲染方式,svg 和 canvas,默认是svg渲染,这样可以兼容低版本的IE浏览器。canvas渲染需要IE9+,或谷歌、火狐的高版本浏览器。canvas比svg性能好,我自己做了简单的测试,svg模式加载5000个图片标记时出现的卡顿情况,用canvas模式,加载10万条数据时才会出现。

下面讲如何完全切换到canvas模式,共两步:

一,在初始化地图时,设置map的 preferCanvas 属性为 true,代码如下:

var map = L.map('map', {center: [39.905963, 116.390813],zoom: 13,    preferCanvas: true
});

这个设置只针对继承了Path类的矢量图层有效,包括圆点(CircleMarker)、线(Polyline)、面(Polygon)、圆(Circle)、矩形(Rectangle)。针对图片标记(Marker)没有作用。

二、借助插件 Leaflet.Canvas-Markers,提升Marker的显示性能。插件git地址:https://github.com/eJuke/Leaflet.Canvas-Markers

Leaflet.Canvas-Markers 插件

Leaflet.Canvas-Markers 插件提供了一个 L.canvasIconLayer 类,这个类是一个图层,将 Marker 添加到这个图层中时,这个图层会以 canvas 方式渲染 Marker 中的图片。

如何使用

在html中引入插件

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

创建canvasIconLayer图层,把图层添加到地图,给图层添加图片标记。

// 创建图层,添加到 map
var ciLayer = L.canvasIconLayer({}).addTo(map);// 定义 Marker
var marker =  L.marker([58.5578, 29.0087], {icon: icon});// 把 Marker 添加到图层
ciLayer.addMarker(marker);

注意

这个插件有个问题,就是地图缩放时,添加的数据不跟着同步缩放,而是等到缩放完成后,再去缩放。这样感觉缩放时,数据在飘着。

不过已经有人对这个问题提出了解决方案,并且解决了(链接),只是代码一直没有被合并。不过这都没有关系,我们可以去用那份儿已经解决的代码(链接)

解决以后的效果:

完整代码

在线示例

完整代码

总结

  1. leaflet支持两种渲染方式,svg 和 canvas,canvas的显示性能要明显优于svg。
  2. IE9之前版本浏览器不支持canvas方式渲染。
  3. 默认是svg方式渲染,要手动切换成canvas方式。
  4. 渲染方式设置成canvas后,加载矢量图形性能会提升,加载图片标记的效率仍然低。
  5. 通过Leaflet.Canvas-Markers插件来提升图片标记的显示效率。
  6. Leaflet.Canvas-Markers插件在缩放地图时有bug,需要在github上找已经解决此bug的版本。

本文会经常更新,请阅读原文:http://gisarmory.xyz/blog/index.html?blog=leaflet100ThousandData,以避免被陈旧、错误的知识误导。

关注《GIS兵器库》的公众号, 可以第一时间获得更多GIS文章

http://weixin.qq.com/r/JS62rsjEspXNrYzN93s3 (二维码自动识别)

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接: http://gisarmory.xyz/blog/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

leaflet大量marker卡顿_leaflet如何加载10万数据相关推荐

  1. 深信服防火墙web界面卡顿,提示加载页面出错,处理过程。

    事情经过 今天早上业务部门反馈,公网映射访问不能使用了. 防火墙检查 第一反应,是防火墙的问题,内网其他业务都正常.WEB方式登录防火墙,异常的慢,过了一会能登录上去了,页面一直报错,不能正常操作.先 ...

  2. JS 原生自动加载的大数据表格探索

    目录 尝试1.使用table初级实现 动态加载关键代码 效果 尝试2.使用绝对定位优化表格 效果 尝试3.绝对定位+scroll动态加载优化尝试 效果 尝试4. table + 绝对定位 + scro ...

  3. HTML卡片式布局源码,html5自适应卡片式设计动态加载整站源码_

    html5自适应卡片式设计动态加载整站源码 该模板是非常容易存活的,这样的程序很容易吸引访客点击,提升ip流量和pv是非常有利的,随意挂点联盟广告都能养活程序. 本套整站源码采使用现在非常流行的全屏自 ...

  4. 使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)

    <template><div class="sg-page-body"><div class="sg-list"><v ...

  5. R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能

    R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载.划分数据.并分别构建线性回归模型和广义线性加性模型GAMs.并比较线性模型和GAMs模型的性能 目录

  6. bootstraptable 加载完成_bootstrap table onLoadSuccess加载服务端数据成功事件

    bootstrap table onLoadSuccess加载服务端数据成功事件 bootstrap table onLoadSuccess加载服务端数据成功的事件,该事件的作用是什么呢?服务端返回自 ...

  7. Qt Creator加载占位符数据

    Qt Creator加载占位符数据 加载占位符数据 使用虚拟模型 创建虚拟上下文 加载占位符数据 设计模式支持视图,模型和委托,因此,当您添加网格视图,列表视图或路径视图项时,将自动添加ListMod ...

  8. mvvm 耗时加载进度条_ZK的实际应用:MVVM –加载和渲染数据

    mvvm 耗时加载进度条 先前的文章简要介绍了RIA框架ZK,以及其CSS Selector启发的控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担. 然后, ...

  9. ZK的实际应用:MVVM –加载和渲染数据

    先前的文章简要介绍了RIA框架ZK,以及它CSS Selector启发式控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担. 然后,我们在上一篇文章中探讨了Z ...

最新文章

  1. JS原生选项卡 – 幻灯片效果
  2. 微软开发x86模拟器,让Windows for ARM能运行x86应用
  3. WPF 4 开发Windows 7 跳转列表(JumpList)
  4. 【OSGI】4.实战OSGI-翻译助手项目02
  5. python学习类型转换_Python学习总结5:数据类型及转换
  6. Idea运行项目报错:java.lang.OutOfMemoryError: Java heap space/ java.lang.OutOfMemoryError: GC overhead 解决方法
  7. try、catch、finally用法总结
  8. iis php5.4配置_PHP5.4 + IIS + Win2008 R2 配置
  9. 计算机上相同的用户,php会话为不同计算机上的不同用户发出相同的session_id
  10. stn算子_C++学习(七)入门篇——C++算数运算符
  11. tspline工具_Rhino 6 如何使用 T-spline?
  12. Git问题解决方案:不建议在没有为偏离分支指定合并策略时执行pull操作(Pulling without specifying how to reconcile divergent branches)
  13. uni-app开发和常规Vue开发
  14. 导出 excel表格(数据、echarts图片)
  15. 使用selenium爬取百合网
  16. 记录一次zabbix网页端报错Assuming that agent dropped connection because of access permissions
  17. crc16-ccitt算法c语言,CRC-CCITT 标准CRC16(1021) 算法校验类
  18. 赵小楼《天道》《遥远的救世主》深度解析(136)自由不是你为所欲为,而是可以选择你不想干的事
  19. 2023最新自动采集影视CMS程序源码+全开源的/功能也强大
  20. 如何修改游戏服务器ip地址吗,怎么修改游戏服务器ip地址

热门文章

  1. vue2.0 子组件和父组件之间的传值
  2. SQL Server HA - 数据库镜像2 (Mirroring)(1418错误解决)
  3. RIP协议无法适应网络环境
  4. iphone 如何设置在uiImageView上添加按钮,按钮透明并且能响应事件
  5. 研读代码必须掌握的五个Eclipse快捷键
  6. 利用公众号 + WeRoBot开发一款AI应用
  7. harbor-offline-installer-v2.1.0.tgz 分享
  8. reactjs组件通讯:父组件传递数据给子组件
  9. SCALA Linux安装:JAVA.LANG.NUMBERFORMATEXCEPTION: FOR INPUT FOR INPUT STRING: “0X100“
  10. win10 docker desktop无法拉取镜像解决办法