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

В системе выражений MapLibre GL JS логические операторы являются фундаментом для построения фильтров слоёв, условного форматирования стилей и динамического управления отображением геоданных. Выражения в MapLibre представляют собой JSON-подобные массивы, где первый элемент — оператор, а последующие элементы — аргументы.

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


Базовая модель логических выражений

Любое логическое выражение в MapLibre GL JS имеет форму:

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

или для вложенных конструкций:

["operator", condition1, condition2, ...]

Результатом всегда является булево значение (true или false), которое влияет на отображение слоя или свойства стиля.


Оператор равенства и неравенства

Строгое равенство ==

Проверяет полное совпадение значений.

["==", ["get", "type"], "park"]

Применение: отображать только объекты типа “park”.


Неравенство !=

Возвращает true, если значения не совпадают.

["!=", ["get", "status"], "inactive"]

Используется для исключения объектов с определённым статусом.


Операторы сравнения

Больше >

[">", ["get", "population"], 100000]

Больше или равно >=

[">=", ["get", "rank"], 10]

Меньше <

["<", ["get", "elevation"], 500]

Меньше или равно <=

["<=", ["get", "speed_limit"], 60]

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


Логическое И: all

Оператор all возвращает true, если все вложенные условия истинны.

[
  "all",
  [">=", ["get", "population"], 50000],
  ["==", ["get", "type"], "city"]
]

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


Логическое ИЛИ: any

Оператор any возвращает true, если хотя бы одно условие истинно.

[
  "any",
  ["==", ["get", "type"], "lake"],
  ["==", ["get", "type"], "river"]
]

Применяется для объединения нескольких категорий объектов в одну визуальную группу.


Логическое НЕ: !

Инвертирует результат выражения.

["!", ["==", ["get", "protected"], true]]

Эквивалент: “все объекты, которые не находятся под защитой”.


Проверка наличия значения: has и !has

has

Проверяет наличие свойства у объекта.

["has", "name"]

Используется для исключения объектов без заданных атрибутов.


!has

Инверсия проверки наличия.

["!has", "name"]

Применяется для поиска «анонимных» или неполных объектов данных.


Проверка принадлежности: in и !in

in

Проверяет, входит ли значение в список.

["in", ["get", "type"], "park", "forest", "reserve"]

Позволяет группировать объекты по категориям без множества сравнений ==.


!in

Исключает значения из списка.

["!in", ["get", "type"], "road", "building"]

Используется для фильтрации «всего, кроме…».


Комбинирование логических операторов

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

[
  "all",
  [">", ["get", "area"], 1000],
  [
    "any",
    ["==", ["get", "type"], "park"],
    ["==", ["get", "type"], "forest"]
  ],
  ["!=", ["get", "access"], "private"]
]

Такая конструкция означает:

  • площадь больше 1000
  • тип — парк или лес
  • доступ не приватный

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

В выражениях MapLibre GL JS отсутствует традиционный приоритет операторов, как в языках программирования. Вместо этого порядок вычисления определяется структурой вложенности массива.

Пример:

[
  "any",
  ["all", condition1, condition2],
  condition3
]

Сначала вычисляется all, затем результат участвует в any.


Логические операторы в фильтрах слоёв

Логика фильтрации слоёв использует те же операторы, что и выражения стилей.

map.addLayer({
  id: "cities",
  type: "circle",
  source: "places",
  filter: [
    "all",
    [">", ["get", "population"], 100000],
    ["==", ["get", "category"], "city"]
  ]
});

Такой фильтр гарантирует отображение только крупных городов.


Логические операторы в условных стилях

Логика часто используется для динамического изменения визуальных свойств.

"circle-color": [
  "case",
  ["==", ["get", "type"], "park"],
  "#2ecc71",
  ["==", ["get", "type"], "water"],
  "#3498db",
  "#95a5a6"
]

Хотя здесь используется case, его условия также строятся на логических операторах.


Вложенные проверки и устойчивость логики

При работе с реальными геоданными часто встречаются неполные или неоднородные свойства. Логические операторы позволяют защищать выражения от ошибок:

[
  "all",
  ["has", "height"],
  [">", ["get", "height"], 50]
]

Без проверки has попытка сравнения могла бы привести к некорректной логике.


Особенности поведения булевых значений

В выражениях MapLibre GL JS булевы значения строго типизированы:

  • true и false интерпретируются как логические значения
  • строки и числа не приводятся автоматически к булевым типам в логических операторах
  • отсутствие проверки has может привести к null-значениям и неожиданным результатам

Сочетание логики с арифметическими выражениями

Логические операторы часто комбинируются с математическими:

[
  "all",
  [">", ["*", ["get", "width"], ["get", "height"]], 1000],
  ["<", ["get", "height"], 300]
]

Здесь логика зависит от результата арифметического вычисления.


Практическая структура сложных выражений

Типичная структура сложного логического выражения:

  • уровень фильтрации (all, any)
  • проверки существования (has)
  • сравнения (==, >, <)
  • принадлежность (in)
  • отрицания (!, !=)

Комбинация этих уровней позволяет строить высокоточные правила отображения объектов, не прибегая к внешней логике приложения.