Выражение match представляет собой дискретное
сопоставление значений, аналогичное конструкции switch-case
в императивных языках, но встроенное в декларативную систему стилей
MapLibre GL JS.
Формальная структура:
["match", input, matchValue1, output1, matchValue2, output2, ..., fallback]
feature)Ключевая особенность заключается в том, что сопоставление выполняется строго и без неявных преобразований типов.
При обработке выражения match происходит
последовательная проверка:
inputmatchValue по
порядкуoutputfallbackПринцип работы можно представить как линейный поиск по таблице соответствий.
Сравнение в match не допускает приведения типов. Это
означает:
"1" не равна числу 1true не равен "true"Примеры:
["match", ["get", "type"],
"road", "#ff0000",
"water", "#0000ff",
"#cccccc"
]
Если feature.properties.type = "road", результатом будет
#ff0000.
При этом:
["match", ["get", "id"],
1, "red",
"1", "blue",
"gray"
]
значение 1 и "1" рассматриваются как разные
случаи.
Наиболее частый сценарий применения — стилизация объектов по атрибутам GeoJSON или векторных тайлов.
"fill-color": [
"match",
["get", "class"],
"park", "#2ecc71",
"water", "#3498db",
"industrial", "#95a5a6",
"#e0e0e0"
]
Здесь значение свойства class определяет цвет
заливки.
Такая схема позволяет:
match поддерживает сопоставление с несколькими
возможными значениями для одного результата через вложенные массивы.
["match", ["get", "type"],
["road", "highway"], "#ff9900",
["river", "stream"], "#3399ff",
"#999999"
]
Если значение type равно "road" или
"highway", будет выбран один и тот же результат.
Такой подход позволяет:
match может возвращать любые допустимые типы значений
MapLibre GL JS:
string)Пример изменения толщины линии:
"line-width": [
"match",
["get", "highway"],
"primary", 4,
"secondary", 2,
"tertiary", 1,
0.5
]
match применяется как в визуальных свойствах
(paint), так и в свойствах макета
(layout).
Пример управления видимостью слоя:
"layout": {
"visibility": [
"match",
["get", "show"],
true, "visible",
"none"
]
}
Пример динамического текста:
"text-size": [
"match",
["get", "rank"],
"major", 16,
"minor", 12,
10
]
match часто используется внутри других выражений,
включая case, let, coalesce,
арифметические операции.
["case",
["==", ["get", "type"], "road"],
["match", ["get", "class"],
"primary", "#ff0000",
"secondary", "#ff8800",
"#cccccc"
],
"#000000"
]
Такой подход позволяет строить многоуровневую логику стилизации.
Если входное значение отсутствует (null или
undefined), match не выполняет совпадений и
сразу возвращает fallback.
["match", ["get", "category"],
"a", 1,
"b", 2,
0
]
Если category отсутствует, результатом будет
0.
Числовые значения сравниваются строго, включая тип float/integer.
["match", ["get", "level"],
1, "#00ff00",
2, "#ffff00",
3, "#ff0000",
"#999999"
]
Если level = 1.0, совпадение происходит, так как
значение интерпретируется как число 1, но любые отклонения типа или
структуры приводят к промаху.
match является линейным по сложности: O(n), где n —
количество пар значений.
При больших наборах данных это важно учитывать:
match замедляют рендерингstep или
interpolateСравнение:
match — дискретные категорииstep — числовые диапазоныinterpolate — плавные переходыНаиболее распространённый сценарий — категоризация объектов:
"circle-color": [
"match",
["get", "mag_type"],
"md", "#2ecc71",
"ml", "#f1c40f",
"ms", "#e67e22",
"#95a5a6"
]
Здесь каждый тип события получает уникальный цвет, а неизвестные значения окрашиваются в нейтральный оттенок.
Булевы значения также допустимы:
"visibility": [
"match",
["get", "active"],
true, "visible",
false, "none",
"none"
]
При этом важно учитывать, что строковое "true" не
эквивалентно булевому true.
match часто комбинируется с:
get — извлечение свойствto-string, to-number — приведение
типовcoalesce — обработка nullcase — условные цепочкиПример с нормализацией:
["match",
["to-string", ["get", "type"]],
"road", "#ff0000",
"water", "#0000ff",
"#cccccc"
]
На практике часто возникают ошибки:
Отсутствие fallback приводит к возвращению undefined,
что может вызвать некорректную отрисовку слоя.
| Выражение | Назначение | Поведение |
|---|---|---|
| match | Категории | точное сопоставление |
| step | Пороговые значения | интервалы |
| interpolate | Плавные переходы | непрерывные шкалы |
match занимает центральное место в задачах категоризации
данных в визуализации карт.
Комбинированный пример слоя линий:
{
"id": "roads",
"type": "line",
"source": "vector",
"source-layer": "transportation",
"paint": {
"line-color": [
"match",
["get", "road_class"],
"motorway", "#d73027",
"trunk", "#fc8d59",
"primary", "#fee08b",
"#cccccc"
],
"line-width": [
"match",
["get", "road_class"],
"motorway", 3,
"trunk", 2.5,
"primary", 2,
1
]
}
}
Такой подход позволяет одной конфигурацией охватывать весь класс дорог без создания отдельных слоёв.
При десятках и сотнях категорий match становится менее
эффективным. В таких случаях используются:
Тем не менее, match остаётся стандартным инструментом
декларативной стилизации.
match может работать с результатами арифметических или
логических выражений:
["match",
["+", ["get", "a"], ["get", "b"]],
0, "none",
1, "low",
2, "medium",
"high"
]
Такое использование позволяет строить производные категории без изменения исходных данных.