Mapbox GL: получение идентификаторов слоев

У меня есть карта с несколькими десятками слоев, каждый с уникальным идентификатором. У меня есть флажки для включения и выключения слоев, для чего мне нужен единый массив всех идентификаторов слоев. Я не могу понять, как пройти через все слои карты, чтобы получить идентификаторы слоев. Я пробовал использовать map.getLayer(), но это возвращает слой как объект, а не идентификатор слоя как строку. Я хочу перебрать все слои карты и переместить строки идентификатора слоя в новый массив. Как мне это сделать?

mapboxgl.accessToken = "myaccesstoken";

var map = new mapboxgl.Map({
container: "map", 
style: "mapbox://styles/mymapboxstyle",  
center: [-71.0664, 42.358],  
minZoom: 14 //  
}); 

map.on("style.load", function () {

map.addSource("contours", {
    type: "vector",
    url: "mapbox://mapbox.mapbox-terrain-v2"
    });

map.addSource("hDistricts-2017", {
    "type": "vector",
    "url": "mapbox://mysource"
    });

map.addLayer({
    "id": "contours",
    "type": "line",
    "source": "contours",
    "source-layer": "contour",
    "layout": {
        "visibility": "none",
        "line-join": "round",
        "line-cap": "round"
        },
    "paint": {
        "line-color": "#877b59",
        "line-width": 1
        }
     });  

map.addLayer({
    "id": "Back Bay Architectural District",
    "source": "hDistricts-2017",
    "source-layer": "Boston_Landmarks_Commission_B-7q48wq",
    "type": "fill",
    "layout": {
        "visibility": "none"
        },
    "filter": ["==", "OBJECTID", 13], 
    "paint": {
        "fill-color": "#192E39",
        "fill-outline-color": "#000000",
        "fill-opacity": 0.5
        }
    }); 

});

var layerIds = [];

function getIds() {

  //here I need to iterate through map layers to get id strings.
  //how do I do this???

 layerIds.push(    ); //then push those ids to new array.

 console.log(layerIds); //["contours", "Back Bay Architectural District"]

} 

person jcephas    schedule 13.11.2017    source источник


Ответы (2)


Когда вы добавляете слой, у вас есть идентификаторы слоя; тогда вы можете сохранить их:

function addLayer(map, options, layerIds) {
    map.addLayer(options);
    layerIds.push(options.id);
}

addLayer(map, {
    "id": "Back Bay Architectural District",
    "source": "hDistricts-2017",
    "source-layer": "Boston_Landmarks_Commission_B-7q48wq",
    "type": "fill",
    "layout": {
        "visibility": "none"
        },
    "filter": ["==", "OBJECTID", 13], 
    "paint": {
        "fill-color": "#192E39",
        "fill-outline-color": "#000000",
        "fill-opacity": 0.5
        }
    },
    layerIds);
person kielni    schedule 13.11.2017

Если ответ kielni неудобен по неизвестной причине, используйте map.getStyle().layers, чтобы получить массив слоев объектов, затем сопоставьте его, чтобы получить массив идентификаторов строк.

var layers = map.getStyle().layers;

var layerIds = layers.map(function (layer) {
    return layer.id;
});
person Luis Estevez    schedule 18.11.2017
comment
Есть ли способ получить идентификатор слоя из выбранной функции? - person walkmn; 14.06.2021