Динамическое обновление выражения Mapbox GL для отображения или скрытия геометрии - PullRequest
0 голосов
/ 22 января 2020

Я хотел бы динамически отображать или скрывать отдельные геометрии на карте в зависимости от того, были ли они выбраны пользователем. Я понимаю, что это прямо не поддерживается Mapbox GL js, поэтому я пытаюсь выяснить, какой из них лучший. Я предпочел бы не обновлять исходные данные, а затем вызывать map.getSource('mysource').setData(data);, поскольку это выглядит как перебор.

Можно ли вместо этого динамически обновлять выражение и вызывать setPaintProperty, так что одно подмножество данных установить непрозрачность 0%, скрывая это? Затем я мог бы заново вычислить подмножество и заново установить свойство при необходимости:

  • пользователь нажимает кнопку hide, которая передает уникально идентифицирующее свойство Feature в мою функцию
  • функция получает существующие подмножества hidden и shown, затем перемещает идентификатор Feature от одного к другому, динамически переписывая два выражения.
  • Новое выражение передается в map.setPaintProperty('layer', 'opacity', expression);

Общее количество геометрий довольно мало (<100), и они не особенно сложны, поэтому я не думаю, что это будет слишком неэффективно. </p>

1 Ответ

0 голосов
/ 22 января 2020

Предполагая, что у вас есть какое-либо свойство для каждой функции, например, ID, и массив тех, которые должны быть показаны, обычный способ сделать это просто:

map.setFilter(layer, '==', ['get', 'id'], arrayOfIds);

Это также возможно сделать как вы предложили, сделав некоторые из них прозрачными, что-то вроде:

map.setPaintProperty(layer, 'line-opacity', ['match', ['get', 'id'], 
    arrayOfIds, 1.0,
    0]
);

и различные другие комбинации.

...