javascript – 如何提高使用leaflet.js将大量功能插入到地图中的性能

通过下面的原型代码,我在步骤中添加了许多功能到osm中.
我正在加载大约8500个多字形功能.它们中的一些具有很多坐标,因此总共约150MB的文本数据.
逐个加载它们会导致浏览器崩溃.以块的形式加载,但它也不快.特别是如果要在加载完成后滚动或缩放.
我有点害羞一次性加载它就像150MB的数据一样.

我有什么选择来改善体验?要明确:我不是在谈论装载本身.我在谈论使用这些功能渲染地图.

这是代码存根:

addToMap = function (id, totalCount) {
    var idTo = id+99;
    jQuery.get('getData.php', {id: id, idTo: idTo}, function (result) {
        var geojson;

        function onEachFeature(feature, layer) {
            layer.on({
                mouseover: highlightFeature,
                mouseout: resetHighlight,
                click: zoomToFeature
            });
        }

        function resetHighlight(e) {
            geojson.resetStyle(e.target);
            info.update();
        }

        geojson = L.geoJson(result, {
            style: getStyle,
            onEachFeature: onEachFeature
        }).addTo(map);

        if (id < totalCount) {
            jQuery('#count').html(idTo+' of '+totalCount);
            addToMap(idTo+1, totalCount);
        } else {
            jQuery('#loader').remove();
        }
    }, 'json');
}

解决方法:

很快渲染很多东西的秘诀就是……不能渲染很多东西.

这可能看似矛盾,但实际上它很简单.您不需要渲染所有内容,只需渲染:

>屏幕内的东西(加上一点屏幕外边距)
>测量小于一个像素的东西(因为没有人会注意到亚像素伪像)

默认情况下,Leaflet实际上简化了矢量几何以节省一些时间(道格拉斯 – 多达几个像素),但它简化了所有几何(计算成本很高)并且仅基于几何的边界框渲染(它渲染了不可见的大几何图形,并渲染了几乎只有一点点可见的大几何图形的所有点.

幸运的是,最近的一些开发有助于此:矢量tile和geojson-vt.请阅读https://www.mapbox.com/blog/introducing-geojson-vt/

一般的想法是数据集受制于预计算步骤(这需要非常重要的时间但可以在线程外完成),将数据切割成瓦片.在瓷砖中切片意味着只显示大几何形状的可见部分,从而节省了大量时间.它还将运行一些线条简化,具体取决于瓦片金字塔的级别.

这些地图图块遵循与栅格图块相同的标准,因此可以围绕共享可见性算法.

据我所知,geojson-vt和Leaflet只有一个工作实现:Leaflet.VectorGrid(或者你可以查看plugins list,将来可能包含更多相关的插件).我建议你看一下.

上一篇:javascript – 在传单中与Lat Long坐标


下一篇:javascript – leaflet.js设置fitBounds动画的持续时间