Добавьте маскирующее наложение, чтобы выделить определенные области на интерактивной карте mapboxgl

#performance #webgl #overlay #mask #mapbox-gl-js

#Производительность #webgl #наложение #маска #mapbox-gl-js

Вопрос:

Я создаю веб-сайт, на котором пользователи могут искать определенные места или области на карте с помощью некоторых фильтров, таких как «парк», «супермаркет», «кафе» и т.д. Например, пользователь должен иметь возможность находить все подходящие районы в городе, которые находятся рядом с парком, но также находятся на расстоянии не менее 1 км от шоссе (по какой-либо причине). Для этого, после того как пользователь задал некоторые фильтры, я хочу добавить наложение, которое маскирует все области, которые не удовлетворяют этим фильтрам, при этом позволяя пользователю свободно масштабировать и перемещать. Я использую MapboxGL для построения карты.

Моей первой попыткой было использовать Turf для моих данных geojson для выполнения необходимых операций, т. Е. Преобразования текущего окна просмотра в многоугольник с ограничивающей рамкой, объединения всех необходимых объектов geojson в один полигон и маскировки разницы между ними, а затем просто добавить результат в виде слоя заливки на карте mapbox, как показано на рисункеизображение ниже.

У меня еще недостаточно репутации, чтобы встроить это изображение напрямую

Хотя этот подход работает для простых наложений, он не масштабируется и требует много времени для выполнения необходимых операций с данными при использовании с большим количеством данных geojson и большим количеством фильтров.

Вместо того, чтобы работать с geojson напрямую, я подумал, что было бы лучше использовать наложение canvas и визуализировать слой маски с помощью webgl для повышения производительности. Я нашел пример mapbox для наложения слоя пользовательского стиля на карту, но, к сожалению, я никогда раньше не использовал webgl, и я не совсем уверен, как я буду отображать такое наложение с помощью этого пользовательского слоя.

Является ли использование пользовательского наложения с webgl правильным подходом для решения моей проблемы? Или есть очевидный вариант (или другая библиотека) для этой задачи, которую я еще не рассматривал?

Комментарии:

1. Я не уверен. Ваш метод turf — это тот, который я использовал раньше, но, похоже, ваши данные довольно сложны. Может быть, вам следует выполнять эту операцию на сервере? Иногда различные комбинации операций с аналогичными именами имеют очень разные характеристики производительности.

2. @SteveBennett Хм, я протестировал несколько альтернатив, и, похоже, turf.mask() в целом быстрее, чем turf.difference(), но, к сожалению, я не смог значительно улучшить производительность. Честно говоря, я не думаю, что использование только Turf может решить мою проблему. Может быть, какие-либо другие идеи или мысли о подходе к пользовательскому слою с помощью webgl?

3. Это вне моей компетенции.