Leaflet图层控件中的图层排序顺序

时间:2018-07-05 14:57:07

标签: javascript leaflet gis geojson

我创建了一个传单地图,以在单独的垂直层中显示一些geoJSON数据。

它工作正常,除了层控件将不按顺序列出选项,即“层0,层2,层1”而不是“层0,层1,层2”。数据是通过AJAX调用加载的,因此这些图层会按照调用完成的顺序添加到控件中,即基本上是随机的。

根据图层控件[https://leafletjs.com/reference-1.3.0.html#control-layers的文档,如果sortLayers设置为true,则默认设置是按名称对图层进行排序,但这似乎没有发生。

因此,我尝试显式传递排序函数,但该文档并未给出应显示什么样的示例。

当我的代码如下:

var layerControlOptions = {
    hideSingleBase : true,
    autoZIndex : true,
    sortLayers: true}
var layerControl = L.control.layers(null, null, layerControlOptions).addTo(map);

该控件如下所示:

layer control with sortLayers: true and no sortFunction being defined

我最好的猜测是编写自己的排序功能:

var layerControlOptions = {
    hideSingleBase : true,
autoZIndex : true,
sortLayers: true,
sortFunction: function(layerA, layerB, nameA, nameB){return 
[nameA,nameB].sort();}}
var layerControl = L.control.layers(null, null, 
layerControlOptions).addTo(map);

由此,图层名称的显示顺序与未指定功能时的顺序相同。不知道我是写错了它,还是只是等同于默认值,由于某种原因它返回了错误的顺序。

这里似乎是同一问题:Leaflet Layer Control: Ordering

,没有可接受的答案,也没有提及层控制选项。我确实尝试了此处提出的解决方案,但也没有解决问题。

在此方面的任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

您可能会看着this solution对控件中的图层进行排序(它不会对图层进行排序)。我主要是从Leaflet specs code借来的代码;

如果您在排序控件中的内容时没有问题,但是在以特定顺序加载JSON / GeoJSON(因此也有图层)方面遇到问题,则可能需要将fetchPromise.all结合使用但这不再是关于Leaflet的知识,而是关于JavaScript知识的知识(请查看this page来尝试掌握fetch + Promise.all

答案 1 :(得分:0)

您可以像往常一样添加图层,然后使用删除标签的功能对它们进行排序,然后按排序的方式重新添加它们。

function sortLabels() {
    var controlLayers = {}
    layerControl._layers.forEach(function(x) {
        if (x.overlay) {
            controlLayers[x.name] = x.layer
        }
    });
    names = Object.keys(controlLayers).sort()
    //remove and add sorted layernames
    names.forEach(x => layerControl.removeLayer(controlLayers[x]))
    names.forEach(x => layerControl.addOverlay(controlLayers[x], x))
}

var baseMaps = { "OpenStreetMap": tile_layer_osm, "ESRI World Imagery" : esri_satelite };

var overlayMaps = {nameC: layerC, nameA: layerA, nameB: layerB}

var layerControl = L.control.layers(baseMaps, overlayMaps, null, {collapsed: false}).addTo(map);
sortLabels()