Mapbox GL JS: фильтрация объектов по вводимому тексту - PullRequest
1 голос
/ 26 апреля 2019

Контекст:

  • Угловой 6
  • Mapbox GL JS - v0.51 (ограничено версией @ types / mapbox-gl-js)

На данный момент я знаю, что Mapbox GL JS не поддерживает фильтр, содержащий / включает выражение для строковых значений (вот краткое изложение этой темы https://github.com/mapbox/mapbox-gl-js/issues/6484)

Есть ли способ эмулировать это поведение?

Раньше у меня был источник GeoJSON:

this._map.addSource('geojson-source', {
      type: 'geojson',
      data: geojson,
    });

GeoJSON исходил из запроса ElasticSearch, и я мог фильтровать «на лету», выполняя другой запрос, и повторно отображать источник и всеслои.

Проблема для больших наборов данных (около 100 тыс. точек). Это слишком медленно.

Так что теперь мы хотим использовать векторный источник MVT

this._map.addSource('vector-source', {
      type: 'vector',
      data: urlVector,
    });

Имы используем это выражение для фильтрации по входному тексту:

filter: ['match', ['get', property], this.filterSearch, true, false]);

Проблема в том, что выражение 'match' слишком ограничительно

Например: 'Platanus' будет соответствовать всем деревьям Platanus, но«Платан» ничего не найдет.

Я вижу, что проблемы Github открыты уже 2 года для этой темы.ct на Mapbox GL JS (в версиях для Android и iOS эти фильтры уже работают).

Как, ребята, вы нашли способ взломать / эмулировать такое поведение?

Вы нашли способ, или вы отказались от фильтра?^^

Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2019

Чтобы уточнить, я думаю, вы спрашиваете о способе создания фильтра на основе частичных совпадений строк: эквивалент регулярного выражения ^Platan.Как вы заметили, для этого не существует встроенного механизма.

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

properties: {
  species: 'Platanus',
  species0: 'P',
  species1, 'l',
...

}

Тогда ваш фильтр будет выглядеть так:

filter: ['==', 'Platan', ['concat',
  ['get', 'species0'],
  ['get', 'species1'],
  ['get', 'species2'],
  ['get', 'species3'],
  ['get', 'species4'],
  ['get', 'species5']
]]

Очевидно, что это некрасиво, но такова природа обходного пути.

...