В MapLibre GL JS система выражений стилей построена вокруг декларативного описания логики, где поведение слоя определяется не императивным кодом, а вычисляемыми выражениями. Условные выражения в этом контексте позволяют изменять визуализацию карты в зависимости от свойств данных, масштаба, состояния фич и комбинации логических условий.
Система выражений работает на уровне JSON-описания стиля. Каждое выражение представляет собой массив, где первый элемент — оператор, а последующие — аргументы.
Базовая идея заключается в том, что стиль перестаёт быть статическим и становится функцией от данных:
feature.properties)zoom)Условные выражения формируют основу динамического рендеринга,
позволяя заменять традиционные if/else конструкции.
Условные выражения опираются на логические операторы:
["==", value1, value2]["!=", value1, value2]["<", a, b]["<=", a, b][" >", a, b]["!"] (логическое отрицание)["all", ...]["any", ...]["none", ...][
"case",
["==", ["get", "type"], "park"],
"#2ecc71",
"#3498db"
]
Здесь цвет зависит от свойства type.
case является базовым инструментом ветвления. Оно
последовательно проверяет условия и возвращает первое совпавшее
значение.
["case",
condition1, result1,
condition2, result2,
fallback
]
[
"case",
["==", ["get", "class"], "primary"],
"#e74c3c",
["==", ["get", "class"], "secondary"],
"#f1c40f",
"#95a5a6"
]
Такой подход заменяет цепочку if / else if / else в
традиционном коде.
match используется для сопоставления значения с набором
ключей.
["match",
value,
key1, result1,
key2, result2,
default
]
[
"match",
["get", "landuse"],
"residential", "#dcdde1",
"commercial", "#f6e58d",
"industrial", "#95afc0",
"#ffffff"
]
match эффективен, когда требуется дискретная
классификация без сложных условий.
step используется для построения ступенчатых функций,
особенно при работе с числовыми значениями.
["step",
input,
output0,
stop1, output1,
stop2, output2
]
[
"step",
["zoom"],
1,
5, 2,
10, 4
]
Здесь значение увеличивается при достижении порогов zoom.
Условные выражения становятся мощнее при объединении логических операторов.
[
"all",
["==", ["get", "type"], "road"],
[">", ["get", "width"], 5]
]
[
"any",
["==", ["get", "class"], "highway"],
["==", ["get", "class"], "motorway"]
]
[
"none",
["==", ["get", "building"], "yes"],
["has", "height"]
]
Такая композиция позволяет строить сложные правила без написания кода.
Наиболее распространённый сценарий — использование get
для доступа к данным объекта:
["get", "population"]
[
"case",
[">", ["get", "population"], 1000000],
"#c0392b",
[">", ["get", "population"], 100000],
"#e67e22",
"#2ecc71"
]
Здесь визуальный вес отражает плотность населения.
Условные выражения допускают рекурсивную вложенность, что позволяет строить сложную логику.
[
"case",
["all",
["==", ["get", "type"], "water"],
["!=", ["get", "usage"], "industrial"]
],
"#3498db",
["==", ["get", "type"], "water"],
"#2980b9",
"#bdc3c7"
]
Параметр zoom часто используется для изменения
визуализации в зависимости от уровня приближения карты.
[
"interpolate",
["linear"],
["zoom"],
5, 1,
10, 3,
15, 8
]
Хотя это интерполяция, её часто комбинируют с условными конструкциями.
Ранее логика фильтрации выполнялась через filter
слоя:
"filter": ["==", "type", "road"]
Однако выражения позволяют переносить логику в свойства стиля:
filter — предварительное отсечение данных[
"case",
["==", ["get", "hidden"], true],
0,
1
]
[
"match",
["get", "category"],
"hospital", "#e74c3c",
"school", "#f1c40f",
"park", "#2ecc71",
"#bdc3c7"
]
[
"case",
["==", ["get", "highway"], "motorway"],
6,
2
]
[
"interpolate",
["linear"],
["zoom"],
8,
[
"case",
["==", ["get", "class"], "minor"],
0.2,
0.8
],
14,
1
]
Условные выражения требуют строгого соблюдения типов:
Ошибка типизации приводит к некорректному рендерингу слоя.
Хотя выражения выполняются на уровне WebGL пайплайна, их сложность влияет на производительность.
Факторы влияния:
casematchРекомендации по оптимизации:
match вместо длинных
caseget для одного свойстваВ реальных картах условные выражения редко используются изолированно. Обычно они комбинируются в слоях:
Пример комплексного подхода:
[
"case",
["all",
["==", ["get", "type"], "building"],
[">", ["get", "height"], 50]
],
"#8e44ad",
["==", ["get", "type"], "building"],
"#9b59b6",
"#ecf0f1"
]
При вычислении выражений важно учитывать порядок:
case проверяет сверху внизmatch ищет точное совпадениеТакая модель позволяет строить детерминированные правила отображения, где каждый объект получает строго определённое визуальное состояние на основе данных и контекста отображения.