Mapbox GL JS: построение выражения соответствия на основе многомерного массива - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующий массив:

var SplitUpLevels = [
 [ zoomLevel: 6, locationIDs: [1, 2, 3]],
 [ zoomLevel: 10, locationIDs: [4, 5, 6]],
];

Я хочу скрыть некоторые значки на карте, основываясь на отдельном уровне масштабирования и только если идентификатор местоположения находится в массиве.Я получаю значения динамически из источника JSON.

Я уже пробовал простой цикл forEach без какого-либо успеха:

"icon-opacity" : [
   "interpolate",
   ["linear"],
   ["zoom"],
   0,
   1,

   SplitUpLevels.forEach(function(SplitUpLevel) {

     SplitUpLevel.zoomlevel,
     [ "match", ["get", "Id"], SplitUpLevel.locationIDs, 0, 0 ] 

   }),

 … ]

Я либо получаю ответ

"icon-opacity: ожидается четное число аргументов."

или

"icon-opacity [5]: пары ввода / вывода для выражений" interpolate "должныбыть определены с использованием буквенных числовых значений (не вычисляемых выражений) для входных значений. "

Каков наилучший способ построения такого выражения на основе динамического источника.

1 Ответ

0 голосов
/ 21 марта 2019

Если кто-то еще ищет решение: создайте массив выражений и используйте его для добавления слоя:

var iconopacity = ["interpolate",
                   "linear",
                   "zoom"]

Затем вставьте выражение для каждого массива в файл json

SplitUpLevels.forEach(function(SplitUpLevel) {
  iconopacity.push(SplitUpLevel.zoomlevel, [ "match", ["get", "Id"], SplitUpLevel.locationIDs, 0, 0 ]);
}

Затем добавьте новый слой

  map.addLayer({
   […]
   "paint" : {
    "icon-opacity" : iconopacity
   }
  });

После долгого поиска я все же решил заранее адаптировать данные, используя скрипт PHP, вместо создания сложных правил фильтрации.

...