Выражение case используется для последовательной
проверки набора условий с возвратом значения первого истинного
результата. Механика напоминает цепочку
if / else if / else, но реализуется в декларативной форме
спецификации стилей.
В структуре выражений MapLibre GL JS все вычисления выполняются внутри массива, где первый элемент определяет тип операции:
["case", condition1, output1, condition2, output2, fallback]
Каждая пара condition → result обрабатывается
последовательно слева направо. При первом совпадении вычисление
прекращается, и возвращается соответствующее значение. Если ни одно
условие не истинно, используется значение по умолчанию
(fallback), если оно задано.
Формальная схема:
[
"case",
condition_1, value_1,
condition_2, value_2,
...,
default_value
]
Каждое условие представляет собой выражение, возвращающее булево
значение (true или false). В качестве условий
используются логические операторы MapLibre:
==, !=, >,
<, >=, <=)all, any,
!)has, in)Условная раскраска объектов в зависимости от свойства
type:
[
"case",
["==", ["get", "type"], "park"], "#2ecc71",
["==", ["get", "type"], "water"], "#3498db",
"#bdc3c7"
]
Логика выполнения:
type == park → зелёный цветtype == water → синий цветНаиболее частое применение case — динамическое
управление визуальными свойствами слоёв.
"fill-color": [
"case",
["==", ["get", "class"], "residential"], "#f1c40f",
["==", ["get", "class"], "commercial"], "#e67e22",
["==", ["get", "class"], "industrial"], "#95a5a6",
"#ecf0f1"
]
Каждому типу земельного использования назначается отдельная цветовая шкала.
"line-width": [
"case",
["==", ["get", "road_type"], "highway"], 4,
["==", ["get", "road_type"], "primary"], 3,
["==", ["get", "road_type"], "secondary"], 2,
1
]
Здесь визуальная иерархия дорог формируется через изменение толщины линии.
"circle-radius": [
"case",
["==", ["get", "importance"], "high"], 10,
["==", ["get", "importance"], "medium"], 6,
3
]
Условия внутри case могут содержать сложные логические
конструкции.
[
"case",
["all",
["==", ["get", "type"], "park"],
[">", ["get", "area"], 5000]
],
"#27ae60",
["all",
["==", ["get", "type"], "park"],
["<=", ["get", "area"], 5000]
],
"#2ecc71",
"#95a5a6"
]
Логика разделяет парки по площади, создавая дополнительную визуальную градацию.
Выражение case обладает строго последовательной моделью
вычисления:
Это делает порядок условий критически важным элементом логики.
Пример:
[
"case",
["==", ["get", "status"], "active"], "green",
["==", ["get", "status"], "active"], "red",
"gray"
]
Вторая проверка никогда не будет достигнута при первом совпадении.
Внутри выражений MapLibre выполняется строгое сравнение типов:
"10" не равна числу 10nullПример влияния типа:
["==", ["get", "level"], 1]
Если level хранится как строка "1", условие
вернёт false.
При отсутствии свойства поведение зависит от выражения:
["get", "property"] возвращает nullnull обычно дают falseПример безопасной проверки:
[
"case",
["==", ["get", "type"], "park"], "green",
["all",
["has", "type"],
["==", ["get", "type"], "water"]
], "blue",
"gray"
]
При большом количестве условий важно учитывать стоимость вычисления:
Пример упрощения:
[
"case",
["in", ["get", "kind"], ["literal", ["park", "forest"]]], "#2ecc71",
["in", ["get", "kind"], ["literal", ["water", "lake"]]], "#3498db",
"#ccc"
]
matchcase и match решают схожие задачи, но имеют
различия:
case работает с произвольными булевыми выражениямиmatch использует сопоставление значения с набором
константПример match:
[
"match",
["get", "type"],
"park", "#2ecc71",
"water", "#3498db",
"#ccc"
]
Пример case:
[
"case",
["==", ["get", "type"], "park"], "#2ecc71",
["==", ["get", "type"], "water"], "#3498db",
"#ccc"
]
Различие заключается в гибкости: case поддерживает
произвольную логику, включая диапазоны, логические комбинации и
вложенные проверки.
Векторные стили часто используют case для:
Пример адаптации под плотность:
"circle-opacity": [
"case",
[">", ["get", "density"], 1000], 0.9,
[">", ["get", "density"], 500], 0.6,
0.3
]
case часто комбинируется с другими типами выражений
MapLibre:
interpolate для плавных переходовstep для ступенчатых функцийlet для переиспользования значенийПример гибридной логики:
[
"case",
["==", ["get", "priority"], "high"],
["interpolate", ["linear"], ["zoom"], 5, 2, 10, 6],
["==", ["get", "priority"], "low"],
["interpolate", ["linear"], ["zoom"], 5, 1, 10, 3],
1
]
При увеличении количества условий проявляются особенности:
null значениям
стиляЭти свойства делают case инструментом для точного, но
управляемого ветвления в декларативных стилях картографических
приложений.