В Mapbox GL JS выражения (expressions) являются базовым механизмом динамического управления стилями слоёв без необходимости пересоздавать стиль или обращаться к внешнему JavaScript-коду. Они позволяют вычислять значения свойств на основе данных, масштаба, состояния объектов и контекста рендеринга карты.
Ключевая особенность выражений заключается в том, что они интерпретируются внутри графического движка и выполняются на каждом кадре отрисовки, что делает их более производительными по сравнению с внешними вычислениями через JavaScript.
Выражения в стиле Mapbox GL JS представляют собой массивы, где первый элемент — имя оператора, а последующие — аргументы:
["operator", arg1, arg2, ...]
Такой формат обеспечивает строгую сериализацию и возможность выполнения в рамках декларативной системы стилей.
Пример простого выражения:
["get", "name"]
Это выражение извлекает значение свойства name из
текущего объекта данных.
Выражения делятся на несколько функциональных групп: доступ к данным, логические операции, математические вычисления, работа с условиями, интерполяция и управление контекстом карты.
Базовые операторы позволяют извлекать свойства объектов и работать с ними напрямую.
Извлекает значение свойства:
["get", "population"]
Используется для data-driven styling, когда визуальные параметры зависят от атрибутов GeoJSON или векторных тайлов.
Проверяет наличие свойства:
["has", "name"]
Позволяет обращаться к состоянию объекта, установленному через API:
["feature-state", "hover"]
Это критически важно для интерактивных сценариев, таких как hover-эффекты без изменения исходных данных.
Многоуровневые условия:
["case",
["==", ["get", "type"], "park"], "#00ff00",
["==", ["get", "type"], "water"], "#0000ff",
"#cccccc"
]
Каждое условие проверяется последовательно до первого совпадения.
Сопоставление значений с набором вариантов:
["match",
["get", "class"],
"primary", "#ff0000",
"secondary", "#00ff00",
"tertiary", "#0000ff",
"#999999"
]
Этот оператор более компактный и читаемый, чем длинные цепочки
case.
Один из самых мощных инструментов, позволяющий плавно изменять значения.
Линейная интерполяция:
["interpolate",
["linear"],
["zoom"],
5, 1,
10, 2,
15, 4
]
В данном случае значение зависит от уровня масштаба карты.
["interpolate",
["exponential", 1.5],
["zoom"],
5, 1,
10, 2,
15, 8
]
Экспонента позволяет контролировать кривизну изменения значений.
Используется для ступенчатого изменения значений:
["step",
["zoom"],
"#888888",
5, "#aaaaaa",
10, "#ffffff"
]
В отличие от интерполяции, значения меняются резко.
Выражения поддерживают арифметику и сравнения:
["+", 2, 3]
["*", 10, 5]
["/", ["get", "value"], 2]
["==", 1, 1]
["!=", 2, 3]
["<", 5, 10]
["<=", 10, 10]
["all",
["==", ["get", "type"], "road"],
[">", ["get", "width"], 5]
]
["any",
["==", ["get", "class"], "highway"],
["==", ["get", "class"], "motorway"]
]
Система выражений строго типизирована. Несовместимые операции приводят к игнорированию значения или использованию fallback.
Позволяет задавать резервные значения:
["coalesce",
["get", "name"],
["get", "alt_name"],
"unknown"
]
Это критично при работе с неполными данными.
Возвращает текущий масштаб:
["zoom"]
Используется для адаптивной стилизации.
Применяется в heatmap-слоях для вычисления плотности:
["heatmap-density"]
Позволяет различать типы геометрии:
["geometry-type"]
Полезно при универсальных слоях, работающих сразу с точками, линиями и полигонами.
Позволяют переиспользовать вычисленные значения:
["let",
"width", ["get", "width"],
"doubleWidth", ["*", ["var", "width"], 2],
["var", "doubleWidth"]
]
Это снижает дублирование и повышает читаемость сложных выражений.
Система состояния объектов используется для интерактивности без изменения источника данных.
Пример:
map.setFeatureState(
{ source: "cities", id: 123 },
{ hover: true }
);
И использование в стиле:
["case",
["boolean", ["feature-state", "hover"], false],
"#ff0000",
"#0000ff"
]
Сложные стили часто комбинируют несколько операторов:
["interpolate",
["linear"],
["zoom"],
5,
["case",
["==", ["get", "type"], "water"],
1,
0.5
],
10,
["case",
["==", ["get", "type"], "water"],
2,
1
]
]
Такие конструкции позволяют одновременно учитывать масштаб и свойства данных.
Производительность выражений зависит от:
Рекомендуется избегать избыточной вложенности и дублирования
вычислений, используя let и coalesce.
Выражения в Mapbox GL JS:
Это делает систему пригодной для высоконагруженных картографических приложений.
Выражения заменяют императивную логику, перенос её в декларативный слой стиля. Это позволяет:
В экосистеме entity[“company”,“Mapbox”,“mapping platform and company”][Mapbox](https://www.mapbox.com?utm_source=chatgpt.com) выражения стали основой современного подхода к визуализации геоданных, где стиль описывает не только внешний вид, но и поведение объектов в зависимости от контекста данных и карты.