【问题标题】:Large dataset of markers or dots in Leaflet [closed]Leaflet中标记或点的大型数据集[关闭]
【发布时间】:2017-08-18 08:34:23
【问题描述】:

我想在传单地图上渲染大约 10.000 个标记或点。我已经按照常规方式进行了操作,并且发现它与 Google Maps 相比要慢得多。我正在寻找一种方法来呈现多个元素而不会出现性能问题。

有没有办法用 Leaflet 做到这一点?

更新:我不想用无法处理事件的亮点进行绘图。我真的想用不同的颜色和事件绘制标记。

【问题讨论】:

  • 我其实是想画不同特征的点或标记。颜色、形状……等等。不仅仅是创建一个叠加层。
  • 您可以在Canvas上尝试使用圆形标记(您可以调整它们的颜色)
  • 圆形标记比普通标记快吗?是否可以更改 140K 点的颜色?我在询问之前实现了它,但我无法更改点的颜色。
  • 如果你使用画布,是的,它更快。对于颜色,只是实例化时的选择问题。

标签: leaflet markers


【解决方案1】:

性能问题是由于每个标记都是一个单独的 DOM 元素。浏览器在渲染数以千计的文件时遇到了困难。

在您的情况下,一个简单的解决方法是使用Circle Markers 并将它们呈现在画布上(例如使用地图preferCanvas 选项,或使用您作为renderer 选项传递的特定canvas renderer您的每个圆圈标记)。这就是谷歌地图默认的工作方式:它的标记实际上是在画布上绘制的。

var map = L.map('map', {
    preferCanvas: true
});
var circleMarker = L.circleMarker(latLng, {
    color: '#3388ff'
}).addTo(map);

var map = L.map('map');
var myRenderer = L.canvas({ padding: 0.5 });
var circleMarker = L.circleMarker(latLng, {
    renderer: myRenderer,
    color: '#3388ff'
}).addTo(map);

使用此解决方案,每个 Circle Marker 不再是一个单独的 DOM 元素,而是由 Leaflet 绘制到一个 单个 Canvas 上,这对于浏览器来说更容易处理。

此外,Leaflet 仍会跟踪鼠标位置和相关事件,并在您的 Circle Markers 上触发相应事件,以便您仍然可以监听此类事件(如鼠标单击等)。

100k 积分的演示:https://jsfiddle.net/sgu5dc0k/

【讨论】:

  • 是否可以在圆形标记上添加锚点或在画布中显示任何自定义 svg?
  • @LASkuma 我不确定我是否完全理解您的问题,尤其是关于锚点的问题。至于drawing SVG on a canvas,就是totally up to you。应该有一些Leaflet plugins 提供使用精美图标的方法,例如Leaflet.Canvas-Markers。请随时提出一个新问题,并详细描述您的问题。
  • 稍微解决了这个问题,但在放大和缩小时它挂了。有什么解决办法吗?
  • @GauravPaliwal 请随时提出您自己的问题,并详细说明您的具体问题和复制代码。
【解决方案2】:

您应该检查https://github.com/robertleeplummerjr/Leaflet.glify。它提供了使用 web gl 渲染传单点和多边形的方法,允许更轻松地进行缩放。

它也适用于使用 R 制作传单的人: https://github.com/tim-salabim/leaflet.glify

R 版本超级简单。

【讨论】:

    【解决方案3】:

    我使用官方 Leaflet 插件 PixiOverlay 获得了不错的效果。 https://github.com/manubb/Leaflet.PixiOverlay

    【讨论】:

      【解决方案4】:

      [2019]

      也许有点太晚了,但 Pedro Vicente 的回答似乎是最好的选择。 Leaflet.glify (https://github.com/robertleeplummerjr/Leaflet.glify.) 很好,但除了在地图上创建点、形状和线条外,您别无选择。 (还没有自定义。) PixiOverlay 使用原生/自定义标记。它还具有很好的可视化效果(动画、缩放等)。它也适用于 IE 11。对我来说,如果你要处理大量的标记,这是必须的。去试试吧https://github.com/manubb/Leaflet.PixiOverlay

      P.S Glify 和 PixiOverlay 都在使用 WebGL,因此性能会因用户的计算机而异。

      【讨论】:

      • 我不确定,因为 L.glify 有完全不同的 API 而不是 Leaflet。所以,切换到另一个生产就绪的基于 webGl 的地图更合乎逻辑
      • 在我看来,不同的 API 是一件的事情,因为您不必为每个点都创建一个新对象;您可以在数组中添加一堆点。
      【解决方案5】:

      您可以查看标记集群,它可以集群您的地图,直到您放大以获取详细信息。我目前正在加载房地产信息,它似乎解决了在地图上放置超过 300000 个地点的问题。

      https://github.com/Leaflet/Leaflet.markercluster

      【讨论】:

        猜你喜欢
        • 2019-05-27
        • 2016-11-24
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 2015-03-11
        相关资源
        最近更新 更多