В системе стилизации MapLibre GL JS фильтры слоёв представляют собой один из ключевых механизмов управления тем, какие геообъекты будут отображаться на карте. Comparison-фильтры (фильтры сравнения) формируют основу логической фильтрации по свойствам feature-объектов и позволяют строить выражения, основанные на строгих условиях равенства, неравенства и диапазонов значений.
Фильтры применяются как в декларативном описании стиля (style
specification), так и динамически через API метода
setFilter. В обоих случаях используется единый синтаксис
выражений, совместимый с Mapbox Style Specification.
Любой слой в стиле может содержать ключ filter,
определяющий правила отбора геометрий:
{
"id": "cities",
"type": "circle",
"source": "places",
"filter": ["==", ["get", "type"], "city"]
}
Фильтр всегда является выражением в виде массива, где первый элемент — оператор, далее аргументы.
==Оператор == проверяет полное совпадение значений.
["==", value1, value2]
["==", ["get", "class"], "highway"]
Этот фильтр оставляет только объекты, у которых свойство
class равно "highway".
["get", "property"]!=Используется для исключения значений.
["!=", value1, value2]
["!=", ["get", "landuse"], "residential"]
Этот фильтр исключает все объекты с типом землепользования
residential.
>, <, >=,
<=Comparison-фильтры поддерживают числовые операции, что делает возможным построение диапазонных условий.
>[">", ["get", "population"], 100000]
Оставляет только города с населением более 100000.
<["<", ["get", "rank"], 10]
Используется для выборки объектов с высоким рейтингом (например, топ-10).
>=[">=", ["get", "elevation"], 500]
<=["<=", ["get", "speed_limit"], 60]
Comparison-фильтры часто используются внутри логических конструкций
all, any, none.
all — логическое ИВсе условия должны выполняться одновременно.
[
"all",
["==", ["get", "type"], "road"],
[">", ["get", "lanes"], 2]
]
Такой фильтр оставит только дороги с количеством полос больше 2.
any — логическое ИЛИДостаточно выполнения одного условия.
[
"any",
["==", ["get", "class"], "primary"],
["==", ["get", "class"], "secondary"]
]
none — отрицание
набора условий[
"none",
["==", ["get", "tunnel"], true],
["==", ["get", "bridge"], true]
]
Фильтр исключает мосты и туннели.
has и !hashasПроверяет наличие свойства у feature:
["has", "maxspeed"]
Используется для фильтрации объектов, у которых задано ограничение скорости.
!hasОбратная проверка:
["!has", "name"]
Выбирает объекты без названия.
inОператор in позволяет проверить принадлежность значения
к набору.
["in", value, v1, v2, v3]
["in", ["get", "class"], "motorway", "trunk", "primary"]
Фильтр выбирает объекты, принадлежащие одной из перечисленных категорий.
!in["!in", ["get", "class"], "path", "footway"]
Исключает пешеходные дорожки.
Все comparison-операторы работают с учётом регистра:
["==", ["get", "name"], "Moscow"]
Строка "moscow" не будет совпадать.
Для нормализации часто используется выражение
downcase:
["==", ["downcase", ["get", "name"]], "moscow"]
Динамическое изменение фильтров выполняется через API:
map.setFilter("cities-layer", [
">=",
["get", "population"],
500000
]);
Фильтр применяется мгновенно без перезагрузки источника данных.
map.setFilter("cities-layer", null);
Удаляет фильтр и показывает все объекты слоя.
Comparison-фильтры часто становятся частью вложенных выражений.
[
"all",
[">", ["get", "population"], 100000],
["<", ["get", "population"], 1000000],
["==", ["get", "capital"], true]
]
Такой фильтр оставляет только столицы среднего размера.
Выражения можно комбинировать с арифметическими операторами:
[">", ["*", ["get", "traffic"], 2], 100]
Фильтр учитывает удвоенный показатель трафика.
Особое внимание требуется при работе с отсутствующими данными:
[">", ["get", "score"], 0]
Если score отсутствует, выражение может не сработать как
ожидается. Поэтому часто добавляют проверку:
[
"all",
["has", "score"],
[">", ["get", "score"], 0]
]
[
"all",
[">=", ["get", "depth"], 10],
["<=", ["get", "depth"], 50]
]
[
"none",
["in", ["get", "type"], "parking", "service"]
]
[
"any",
["==", ["get", "priority"], "high"],
[">", ["get", "usage"], 80]
]
Comparison-фильтры пересчитываются при каждом изменении данных источника. Это означает, что при обновлении GeoJSON или vector tiles:
any/all снижает
производительность на больших наборах данныхin с большим списком значений менее
эффективны, чем повторные == в некоторых сценарияхhas предпочтительнее, чем сравнение с
nullComparison-фильтры в MapLibre GL JS заменяют классическую фильтрацию на стороне Jav * aScript:
features.filter(f => f.properties.type === "city")
Однако использование встроенных фильтров:
has перед сравнениемin&&, || вместо
all, any)