Общая структура выражений фильтрации в Mapbox GL JS основана на декларативной системе выражений, где фильтр описывается как JSON-подобный массив. Такой подход исключает использование функций в классическом JavaScript-стиле и заменяет их композиционной схемой операторов.
Фильтр слоя задаётся в свойстве filter и всегда
представляет собой выражение, начинающееся с логического оператора или
оператора сравнения. Все элементы выражения строго типизированы и
интерпретируются движком рендеринга карты.
Фильтр слоя имеет следующий общий вид:
filter: ["operator", argument1, argument2, ...]
Первый элемент массива — строка-оператор, определяющая тип логики. Последующие элементы — операнды, которые могут быть:
["get", "property"];["geometry-type"],
["id"]).Центральный элемент фильтрации — доступ к атрибутам объекта:
["get", "property_name"]
Пример:
["get", "type"]
Это выражение возвращает значение свойства type текущего
объекта слоя.
Также используются встроенные источники данных:
["id"]
Возвращает идентификатор фичи.
["geometry-type"]
Возвращает тип геометрии: Point,
LineString, Polygon.
Операторы сравнения позволяют сопоставлять значения свойств с константами.
["==", ["get", "class"], "primary"]
Фильтрует объекты, у которых свойство class строго равно
"primary".
["!=", ["get", "class"], "secondary"]
Оставляет все объекты, кроме тех, у которых class равен
"secondary".
[">", ["get", "rank"], 5]
Поддерживаются также:
[">=", ...]
["<", ...]
["<=", ...]
Пример диапазона:
["all",
[">=", ["get", "rank"], 1],
["<=", ["get", "rank"], 10]
]
Логические операторы позволяют комбинировать условия.
["all",
["==", ["get", "type"], "road"],
[">", ["get", "width"], 5]
]
Фильтр пропускает только те объекты, которые удовлетворяют всем условиям.
["any",
["==", ["get", "class"], "primary"],
["==", ["get", "class"], "secondary"]
]
Фильтр пропускает объекты, соответствующие хотя бы одному условию.
["none",
["==", ["get", "status"], "inactive"],
["==", ["get", "status"], "deprecated"]
]
Проходит только те объекты, которые не удовлетворяют ни одному из условий.
Операторы has и !has проверяют
существование атрибута в объекте.
["has", "population"]
Фильтрует объекты, у которых существует поле
population.
["!has", "population"]
Фильтрует объекты без этого поля.
Это особенно полезно при работе с неоднородными наборами данных, где структура свойств может отличаться.
Оператор in проверяет, содержится ли значение в
списке.
["in", ["get", "category"], "road", "highway", "street"]
Логика: значение category должно совпадать с одним из
перечисленных.
Отрицательная форма:
["!in", ["get", "category"], "water", "forest"]
Фильтры часто строятся как вложенные выражения, где логические операторы объединяют более простые сравнения.
Пример сложной логики:
["all",
["==", ["geometry-type"], "LineString"],
["any",
["==", ["get", "class"], "primary"],
["==", ["get", "class"], "secondary"]
],
[">", ["get", "width"], 2]
]
Такая конструкция означает:
primary, либо
secondary;Часто используется явная фильтрация по геометрии:
["==", ["geometry-type"], "Polygon"]
Комбинации:
["in", ["geometry-type"], "Polygon", "MultiPolygon"]
Хотя фильтры не предназначены для сложной текстовой обработки, базовые проверки строк возможны.
["==", ["get", "name"], "Central Park"]
["in", ["get", "name"], "Park A", "Park B", "Park C"]
Все значения в выражениях интерпретируются движком Mapbox GL JS. Числа и строки не всегда автоматически приводятся к совместимому виду. Это означает, что:
["==", ["get", "rank"], "5"]
может не совпадать с числовым значением 5, если поле
хранится как число.
Явная типизация данных в источнике снижает вероятность ошибок фильтрации.
["==", ["id"], 12345]
Полезно для выделения конкретных объектов или отладки источников данных.
Система выражений допускает неограниченную вложенность, что позволяет строить сложные фильтры без перехода к внешней логике JavaScript.
Пример комбинированного фильтра:
["any",
["all",
["==", ["geometry-type"], "Point"],
["has", "icon"]
],
["all",
["==", ["geometry-type"], "Polygon"],
[">", ["get", "area"], 1000]
]
]
Такая структура разделяет логику обработки точек и полигонов внутри одного фильтра.
В Mapbox GL JS нет отдельного оператора not в
классическом виде, но отрицание реализуется через:
!in!hasnoneПример:
["none",
["==", ["get", "status"], "deleted"]
]
Эквивалент логического отрицания одного условия.
При построении фильтров ключевым принципом является композиционность. Каждый элемент выражения должен быть самодостаточным и легко комбинируемым.
Характерная структура:
==, >,
has);all и any;Пример структурированного фильтра для транспортных данных:
["all",
["in", ["get", "type"], "bus", "tram"],
[">=", ["get", "frequency"], 10],
["has", "route"]
]
Система выражений Mapbox GL JS намеренно ограничена:
feature-state.Фильтр выполняется на стороне рендерера и должен оставаться детерминированным и быстрым.
Важно различать:
filter — отвечает за включение/исключение
объектов;paint и layout — отвечают за
визуальное представление.Одинаковые операторы используются в обеих системах, но цель фильтра — бинарное решение: отображать объект или нет.
["==", ["get", "category"], "residential"]
["all",
[">=", ["get", "value"], 10],
["<", ["get", "value"], 100]
]
["in", ["get", "type"], "road", "path", "cycleway"]
["any",
["all",
["==", ["geometry-type"], "Point"],
["has", "icon"]
],
["all",
["==", ["geometry-type"], "LineString"],
[">", ["get", "importance"], 3]
]
]