Выражения для case

Общая логика условного ветвления

Выражение 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" не равна числу 10
  • булевые значения не приводятся автоматически
  • отсутствие свойства возвращает null

Пример влияния типа:

["==", ["get", "level"], 1]

Если level хранится как строка "1", условие вернёт false.


Обработка отсутствующих данных

При отсутствии свойства поведение зависит от выражения:

  • ["get", "property"] возвращает null
  • сравнения с null обычно дают false
  • условия должны учитывать возможные пустые значения

Пример безопасной проверки:

[
  "case",
  ["==", ["get", "type"], "park"], "green",
  ["all",
    ["has", "type"],
    ["==", ["get", "type"], "water"]
  ], "blue",
  "gray"
]

Оптимизация выражений case

При большом количестве условий важно учитывать стоимость вычисления:

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

Пример упрощения:

[
  "case",
  ["in", ["get", "kind"], ["literal", ["park", "forest"]]], "#2ecc71",
  ["in", ["get", "kind"], ["literal", ["water", "lake"]]], "#3498db",
  "#ccc"
]

Сравнение с match

case и 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
]

Особенности поведения в сложных стилях

При увеличении количества условий проявляются особенности:

  • рост глубины вложенности ухудшает читаемость
  • повторяющиеся проверки увеличивают вычислительную нагрузку
  • отсутствие fallback приводит к null значениям стиля
  • порядок условий становится частью логики, а не только структуры

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