Логические операторы в 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 возвращает true, если все вложенные
выражения истинны.
["all", expr1, expr2, expr3, ...]
Пример комбинированного фильтра:
["all",
["==", ["get", "type"], "city"],
[">", ["get", "population"], 100000]
]
Используется для построения строгих условий отбора объектов.
Внутри all допускается любое количество выражений,
включая вложенные логические конструкции.
Оператор any возвращает true, если хотя бы одно
выражение истинно.
["any", expr1, expr2, expr3, ...]
Пример:
["any",
["==", ["get", "type"], "capital"],
["==", ["get", "type"], "metropolis"]
]
Такое выражение выбирает объекты, относящиеся к одной из нескольких категорий.
any широко используется для объединения альтернативных
условий без необходимости дублирования логики.
Оператор none возвращает true, если ни одно из выражений
не истинно.
["none", expr1, expr2, expr3, ...]
Пример исключающего фильтра:
["none",
["==", ["get", "type"], "industrial"],
["==", ["get", "type"], "construction"]
]
Такой подход позволяет централизованно исключать группы объектов.
Оператор проверяет наличие значения в списке.
["in", value, v1, v2, v3, ...]
Пример:
["in", ["get", "category"], "park", "forest", "reserve"]
Используется для компактного описания множества допустимых значений.
Также поддерживается проверка вхождения строки в массив или набор значений свойства.
Проверяет отсутствие значения в списке.
["!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 и anyin с неподдерживаемыми типами
значенийКаждый оператор ожидает строго определённое количество аргументов и их тип.
Если свойство объекта отсутствует, логические операторы, использующие
get, возвращают null. Это влияет на результат
сравнений:
has используется для явной проверки наличия
свойстваПример:
["has", "population"]
Логические операторы формируют основу декларативной логики Mapbox GL JS. Они позволяют полностью отказаться от императивных конструкций при описании поведения карты, перенося всю логику в выражения, которые интерпретируются движком рендеринга.
Такая модель обеспечивает детерминированность вычислений, масштабируемость фильтрации и предсказуемость визуальных состояний слоёв.