使用Leaflet可视化大型数据集


35

当使用Leaflet可视化大型数据集(具有10,000个点特征的GeoJSON)时,浏览器崩溃或挂起就不足为奇了。来自同一数据集的1000个要素的子样本可以完美地工作。不幸的是,我无法共享数据集供其他人试用。

有没有人有更好的解决方案来可视化如此大的数据集?(最终目标是将其扩展到200万个功能)我什至愿意考虑离线可视化框架,以防基于浏览器的替代品(例如Polymapsd3.js等)无法使用。

编辑:忘记提及了,用户需要能够按属性过滤数据集。因此,在N个要素中,可能仅需要动态渲染匹配的n <= N个要素。


3
类似的讨论:gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
julien 2012年

Answers:


23

我是传单的作者。有一个很棒的集群插件Leaflet.markercluster。它非常快速高效(请看一下50k标记示例),并且在使用精美动画的情况下外观和工作也非常流畅,并且有很多选项可以满足您的需求。


3
PruneCluster看起来很有希望。
TLama 2015年

1
我想扩大最初的问题。我需要执行以下操作:matall.in/posts/deep-insights-visualizing-1m-flight-routes 如何将标记中间的路径聚类?
guilhermecgs

16

您可以使用TileMill并将点渲染为栅格图像,并与UTFGrid快速交互。像本人口普查图一样,它可以缩放到数百万个点和多边形,因为它可以智能地仅在需要时才发送特定区域所需的数据。

据我所知,除了拥有非常快速的WFS服务器之外,没有其他快速的方法可以做到这一点,对于许多观众而言,这是相当困难的。

披露:为MapBox工作,编写了很多代码。但是TileMill是免费/开源等。


1
我忘了提到用户应该能够按属性过滤数据集并仅显示匹配的记录。因此,假设在10,000条记录中,对于给定的案例,实际上可能只需要呈现500条记录。我可以(或如何)用TileMill做到这一点?
Imad 2012年

3
不。您可能想尝试CartoDB,但是您应该知道使事物动态化和使事物性能化是相反的目标。
tmcw 2012年

1
人口普查地图链接已消失!
drho

所有链接都是父亲。
LeeGee

9

您是否看过传单集群器?作者的博客文章在进行了描述

值得一看的另一种选择是将传单与GIS Cloud结合使用。看一下这个演示,看看它能非常快速地处理很多几何。非常令人印象深刻。我绝不隶属于GISCloud。


7

您绝对不应在地图上显示数百万个点。不仅由于主要的性能问题,而且从用户的角度出发,因为对于他们来说,无疑将很难解释该数据。使用一些汇总数据的方法(聚类,汇总到多边形区域等),并在不同的缩放级别上结合不同的显示类型(例如,仅在非常高的缩放级别上显示“原始”点数据,并在其他任何地方使用汇总的数据)。一个示例就是房地产网站,例如zillow.com


8
你永远都不要说“你永远不要”。“本地人和游客”就是一个很好的例子,可以直观地显示数百万(在这种情况下为数十亿)点。
约瑟夫·希迪

1
同意@velotron,例如精美且快速地渲染600万个点:mapbox.com/blog/supercluster
Max von Hippel

1
是的,但是在这种情况下,这些点也会聚类(取决于缩放级别),这使得解释和理解数据非常容易。
chriserik '16

2
@chriserik对,所以正确的答案是“如果您有那么多点,就应该使用聚类或热图,这是如何做的……”
Max von Hippel

3
我的观点是,数百万个点的非聚集图可以提供洞察力。
Joseph Sheedy

0

我建议您减少点要素的渲染量:人眼将看不到10,000点,更不用说2,000,000。

您可以尝试从自定义服务器动态地请求数据集(必须设置),例如

    map = ...
    map.on('moveend', function(e) {
        getGeoJson(e);
    });
    map.on('zoomend', function(e) {
        getGeoJson(e);
    });
    map.setView([2,3], 2);

    function getGeoJson(event) {
        // todo determine current viewport
        $http.get('someGeoJsonDataProvider.someLanguage?currentView=[lat0,lon0,lat1,lon1]').then(function (resp) {
            // todo clear layers
            // new layer
            map.addLayer(
                L.geoJson(resp.data)
            );
        });
    }

然后,服务器将根据用户现在要查看的内容来计算返回的点。根据缩放系数和裁剪,您只需要返回很小比例的点,而不会恶化用户体验。

缺点:设置服务器(您应该找到用于过滤地理位置的库)且渲染速度较慢(每次缩放或拖动之后,都需要发出服务器请求)


-5

我有解决方案可以映射50到1亿条记录,您需要使用服务器端解决方案来进行基于网格和动态的处理。您无法在网络地图API(Google或其他)上进行答复以进行客户端呈现。...

[http://96.231.36.9:8080/rbgis/google_map.html][1]试试上面的链接,看看如何


2
请扩大您的答案,这样即使您的服务器无法访问也将有所帮助。
lynxlynxlynx

是的,具有讽刺意味。由于您的服务器端链接无效。
Max von Hippel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.