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

Логические операторы в Mapbox GL JS используются в выражениях фильтрации и управления стилями для построения условий, определяющих отображение геообъектов. Они применяются внутри property expressions и filter expressions слоёв, позволяя комбинировать условия, сравнивать значения свойств объектов и формировать сложные правила визуализации данных.


В Mapbox GL JS логические операторы реализуются через JSON-подобные выражения, где первый элемент массива — оператор, а последующие элементы — операнды. Такая форма обеспечивает однозначный разбор и строгую типизацию выражений в стиле Mapbox Style Specification.

Пример общей структуры:

["operator", operand1, operand2, ...]

Логические операторы возвращают булево значение true или false, которое используется в фильтрах слоёв или внутри составных выражений.


Оператор отрицания

“!”

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

["!", expression]

Если выражение истинно, результат становится ложным, и наоборот.

Применение в фильтрах:

["!", ["has", "population"]]

Такое выражение выбирает объекты, у которых отсутствует свойство population.

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


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

“==”

Оператор строгого равенства проверяет совпадение двух значений.

["==", value1, value2]

Сравнение чувствительно к типам данных.

Пример:

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

Фильтрация выполняется по точному совпадению значения свойства type.


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

“!=”

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

["!=", value1, value2]

Пример:

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

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


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

Mapbox GL JS поддерживает набор операторов для числовых сравнений.

“<”, “<=”, “>”, “>=”

["<", value1, value2]
["<=", value1, value2]
[">", value1, value2]
[">=", value1, value2]

Эти операторы применяются к числовым свойствам объектов.

Пример фильтрации по численности:

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

Вариант с диапазоном:

["all",
  [">=", ["get", "population"], 50000],
  ["<", ["get", "population"], 200000]
]

Такая конструкция формирует логическое пересечение условий.


Логическое И

“all”

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

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

Пример комбинированного фильтра:

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

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

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


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

“any”

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

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

Пример:

["any",
  ["==", ["get", "type"], "capital"],
  ["==", ["get", "type"], "metropolis"]
]

Такое выражение выбирает объекты, относящиеся к одной из нескольких категорий.

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


Логическое НЕ ИЛИ

“none”

Оператор none возвращает true, если ни одно из выражений не истинно.

["none", expr1, expr2, expr3, ...]

Пример исключающего фильтра:

["none",
  ["==", ["get", "type"], "industrial"],
  ["==", ["get", "type"], "construction"]
]

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


Оператор принадлежности

“in”

Оператор проверяет наличие значения в списке.

["in", value, v1, v2, v3, ...]

Пример:

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

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

Также поддерживается проверка вхождения строки в массив или набор значений свойства.


Оператор отрицательной принадлежности

“!in”

Проверяет отсутствие значения в списке.

["!in", value, v1, v2, v3, ...]

Пример:

["!in", ["get", "status"], "inactive", "closed"]

Оператор часто применяется для фильтрации «активных» объектов по исключению нежелательных статусов.


Вложенные логические конструкции

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

Пример комбинированной логики:

["all",
  ["any",
    ["==", ["get", "type"], "city"],
    ["==", ["get", "type"], "town"]
  ],
  ["!", ["==", ["get", "status"], "archived"]],
  [">=", ["get", "population"], 10000]
]

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


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

Логические операторы активно применяются в свойстве filter слоя карты.

map.addLayer({
  id: "cities-layer",
  type: "circle",
  source: "cities",
  filter: ["all",
    ["==", ["get", "type"], "city"],
    [">", ["get", "population"], 50000]
  ],
  paint: {
    "circle-radius": 6
  }
});

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


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

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

Каждое выражение вычисляется слева направо внутри своего уровня, а результат передаётся на следующий уровень вложенности.


Сочетание с другими типами выражений

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

  • выражениями доступа к свойствам ["get", "property"]
  • арифметическими выражениями
  • выражениями интерполяции
  • условиями case

Пример:

["case",
  ["all",
    [">", ["get", "population"], 100000],
    ["==", ["get", "type"], "city"]
  ],
  "#ff0000",
  "#00ff00"
]

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


Типичные ошибки при использовании

Вложенные выражения требуют строгого соблюдения структуры массива. Нарушение порядка аргументов или использование некорректных типов приводит к ошибкам интерпретации стиля.

Особое внимание требуется при:

  • смешивании строк и чисел в сравнении
  • неправильной вложенности all и any
  • использовании in с неподдерживаемыми типами значений

Каждый оператор ожидает строго определённое количество аргументов и их тип.


Поведение при отсутствии данных

Если свойство объекта отсутствует, логические операторы, использующие get, возвращают null. Это влияет на результат сравнений:

  • сравнение с числом возвращает false
  • отрицание может привести к true в зависимости от контекста
  • has используется для явной проверки наличия свойства

Пример:

["has", "population"]

Роль логических операторов в архитектуре стилей

Логические операторы формируют основу декларативной логики Mapbox GL JS. Они позволяют полностью отказаться от императивных конструкций при описании поведения карты, перенося всю логику в выражения, которые интерпретируются движком рендеринга.

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