【问题标题】:Mapbox toggle all layers off except oneMapbox 关闭所有图层,除了一个
【发布时间】:2017-12-04 20:29:16
【问题描述】:

我是 Mapbox 和 javascript 的新手。我正在尝试稍微修改一个 Mapbox GL 代码示例,发现 here,它允许打开/关闭多个图层。

我有四个图层,我希望用户打开和关闭这些图层,但是当地图最初显示时,我只想打开一个图层。我可以在页面加载时关闭其中的三层(这里以一层为例):

 map.addSource("gnat-4zdrvs", {
     type: 'vector',
       url: 'mapbox://jesselangdon.bbtex1ps'
 });
 map.addLayer({
     "id": "gnat",
     "type": "line",
     "source": "gnat-4zdrvs",
     "source-layer": "gnat-4zdrvs",
     "minzoom": 8,
         "filter": [
             "==",
             "$type",
             "LineString"
        ],
        "layout": {
            "visibility": "none",
            "line-cap": "round",
            "line-join": "round"
        },
        "paint": {
            "line-width": 2,
            "line-color": {
                "base": 1,
                "type": "interval",
                "property": "C_Sin",
                "stops": [
                    [1,"hsl(189, 81%, 79%)"],
                    [1.02,"hsl(189, 91%, 65%)"],
                    [1.04, "hsl(189, 81%, 53%)"],
                    [1.06,"hsl(189, 83%, 43%)"],
                    [1.08,"hsl(189, 89%, 34%)"],
                    [1.1,"hsl(189, 90%, 28%)"],
                    [1.3,"hsl(189, 96%, 21%)"]
                ],
                "default": "hsl(0, 0%, 50%)"
            }
        }
   })

但是,我对 Javascript 的了解有限,无法弄清楚如何设置可点击链接的菜单,以便只有 "visible" 层处于切换的“开启”状态。

这里是控制切换菜单的代码 sn-p:

var toggleableLayerIds = [ 'conductivity', 'confinement', 'gnat', 'solar' ];

for (var i = 0; i < toggleableLayerIds.length; i++) {
    var id = toggleableLayerIds[i];

    var link = document.createElement('a');
    link.href = '#';
    link.className = 'active';
    link.textContent = id;

    link.onclick = function (e) {
        var clickedLayer = this.textContent;
        e.preventDefault();
        e.stopPropagation();

        var visibility = map.getLayoutProperty(clickedLayer, 'visibility');

        if (visibility === 'visible') {
            map.setLayoutProperty(clickedLayer, 'visibility', 'none');
            this.className = '';
        } else {
            this.className = 'active';
            map.setLayoutProperty(clickedLayer, 'visibility', 'visible');
        }
    };

    var layers = document.getElementById('menu');
    layers.appendChild(link);
}

地图是可见的here。请注意,切换菜单中的所有四个图层都是蓝色的(意味着它们处于“打开”位置,而实际上唯一“打开”的图层是太阳能)。欢迎任何帮助、建议或批评...谢谢!

【问题讨论】:

    标签: javascript mapbox mapbox-gl-js


    【解决方案1】:

    您正在将类设置为在创建时无条件激活,即使图层不可见,链接也会始终变为蓝色。尝试这样的事情。

        if(map.getLayoutProperty(id, 'visibility') === 'visible')
        {
         link.className = 'active';
        }
    

    虽然这需要在 onload 函数中完成,否则该属性将是未定义的。

    【讨论】:

    • 它仅在 onclick 事件期间执行此操作,但在任何单击事件之前,您在创建链接类时将其初始化为活动状态,而不管其关联层的可见性如何。
    • 抱歉,删除了我格式错误的评论。那么我可以改变 link.className = 'active';到 link.className = '';
    • 无论图层的可见性如何,它们都会变成白色(关闭)。应根据图层是否可见来设置类。
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多