Синтаксис фильтров

Фильтры в MapLibre GL JS представляют собой выражения, определяющие набор правил отбора объектов из векторных источников данных перед их отображением на карте. Они являются частью спецификации стилей Mapbox Style Specification, на которой основан MapLibre, и применяются к слоям (layer) через свойство filter.

Фильтр всегда представляет собой массив выражений, где первый элемент задаёт оператор, а последующие — аргументы оператора. Такая структура обеспечивает строгое и предсказуемое поведение при обработке геоданных.


Общая структура фильтра

Базовый синтаксис фильтра выглядит следующим образом:

"filter": ["operator", arg1, arg2, ...]

Каждый фильтр — это выражение в префиксной нотации (prefix notation), где оператор идёт первым.

Пример:

"filter": ["==", "type", "park"]

В данном случае отображаются только те объекты, у которых свойство type равно "park".


Логические операторы

Логические операторы позволяют комбинировать условия.

AND

["all", expr1, expr2, ...]

Означает, что все условия должны быть истинны.

Пример:

"filter": ["all",
  ["==", "type", "park"],
  [">", "area", 1000]
]

Используется для строгой фильтрации объектов по нескольким параметрам.


OR

["any", expr1, expr2, ...]

Достаточно выполнения хотя бы одного условия.

Пример:

"filter": ["any",
  ["==", "type", "forest"],
  ["==", "type", "park"]
]

NOT

["!", 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"]

Возможные значения:

  • Point
  • LineString
  • Polygon

Проверка ID объекта

$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"
  }
}

Фильтрация выполняется до рендеринга, что снижает нагрузку на отрисовку и оптимизирует производительность.


Приоритет и порядок вычисления

Выражения внутри фильтра вычисляются слева направо, но логические операторы определяют структуру дерева вычислений.

Приоритет:

  1. Вложенные выражения
  2. Операторы сравнения
  3. Логические операторы (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]
]