Фильтры в MapLibre GL JS представляют собой выражения, определяющие
набор правил отбора объектов из векторных источников данных перед их
отображением на карте. Они являются частью спецификации стилей Mapbox
Style Specification, на которой основан MapLibre, и применяются к слоям
(layer) через свойство filter.
Фильтр всегда представляет собой массив выражений, где первый элемент задаёт оператор, а последующие — аргументы оператора. Такая структура обеспечивает строгое и предсказуемое поведение при обработке геоданных.
Базовый синтаксис фильтра выглядит следующим образом:
"filter": ["operator", arg1, arg2, ...]
Каждый фильтр — это выражение в префиксной нотации (prefix notation), где оператор идёт первым.
Пример:
"filter": ["==", "type", "park"]
В данном случае отображаются только те объекты, у которых свойство
type равно "park".
Логические операторы позволяют комбинировать условия.
["all", expr1, expr2, ...]
Означает, что все условия должны быть истинны.
Пример:
"filter": ["all",
["==", "type", "park"],
[">", "area", 1000]
]
Используется для строгой фильтрации объектов по нескольким параметрам.
["any", expr1, expr2, ...]
Достаточно выполнения хотя бы одного условия.
Пример:
"filter": ["any",
["==", "type", "forest"],
["==", "type", "park"]
]
["!", expr]
Инвертирует результат выражения.
Пример:
"filter": ["!", ["==", "type", "water"]]
Операторы сравнения являются основой большинства фильтров.
["==", value1, value2]
Пример:
"filter": ["==", "class", "primary"]
["!=", value1, value2]
[">", value1, value2]
[">=", value1, value2]
["<", value1, value2]
["<=", value1, value2]
Пример:
"filter": [">=", "population", 100000]
inОператор in проверяет наличие значения среди списка
допустимых вариантов:
["in", value, v1, v2, v3, ...]
Пример:
"filter": ["in", "type", "school", "university", "college"]
has["has", "property"]
Используется для проверки существования свойства у объекта.
Пример:
"filter": ["has", "name"]
!has["!has", "property"]
Пример:
"filter": ["!has", "population"]
Векторные данные часто содержат разные типы геометрии: точки, линии, полигоны.
["==", "$type", "Point"]
Пример:
"filter": ["==", "$type", "LineString"]
Возможные значения:
PointLineStringPolygon$id["==", "$id", 12345]
Используется для точечного управления конкретными объектами.
Фильтры поддерживают обращение к свойствам объекта напрямую через строковые ключи:
["==", "property_name", value]
Также допускаются вложенные структуры:
["==", ["get", "population"], 50000]
Оператор get позволяет явно извлекать значение
свойства.
Фильтры могут содержать вложенные выражения любой глубины.
Пример:
"filter": ["all",
["==", ["get", "type"], "park"],
["any",
[">", ["get", "area"], 1000],
["==", ["get", "status"], "protected"]
]
]
Такая структура позволяет строить сложную логику отбора данных без необходимости предобработки источника.
Фильтрация по диапазону значений строится через комбинацию операторов:
["all",
[">=", "height", 10],
["<", "height", 50]
]
Альтернативный подход с all часто используется вместо
отсутствующего отдельного оператора between.
Если свойство объекта является массивом, используется оператор
in или any.
Пример:
"filter": ["in", "category", "residential", "commercial"]
Для более сложных случаев применяется any:
"filter": ["any",
["in", "tag", "historic"],
["in", "tag", "tourism"]
]
Комбинирование отрицаний позволяет исключать наборы объектов:
"filter": ["all",
["!=", "type", "road"],
["!=", "type", "rail"]
]
или:
"filter": ["!", ["in", "type", "road", "rail"]]
Фильтры применяются внутри описания слоя:
{
"id": "parks-layer",
"type": "fill",
"source": "landuse",
"filter": ["==", "type", "park"],
"paint": {
"fill-color": "#00ff00"
}
}
Фильтрация выполняется до рендеринга, что снижает нагрузку на отрисовку и оптимизирует производительность.
Выражения внутри фильтра вычисляются слева направо, но логические операторы определяют структуру дерева вычислений.
Приоритет:
all, any,
!)"10" и 10
считаются разными значениями.false в сравнительных
операциях.["==", "category", "transport"]
["all",
[">", "value", 0],
["<=", "value", 100]
]
["!", ["in", "type", "water", "road", "rail"]]
["all",
["any",
["==", "class", "primary"],
["==", "class", "secondary"]
],
[">", "width", 2]
]