В системе выражений Mapbox GL JS ключевую роль играет механизм интерполяции значений. Он используется для динамического изменения визуальных свойств слоёв в зависимости от масштаба, данных или других параметров. Основные режимы интерполяции — linear, exponential и cubic-bezier — определяют характер перехода между контрольными точками (stops) и позволяют управлять визуальной плавностью и акцентами карты.
Интерполяция в стиле Mapbox GL JS реализуется через выражение:
[
"interpolate",
[<type>, <parameters?>],
<input>,
<stop1>, <value1>,
<stop2>, <value2>,
...
]
zoom
или свойство данных)Наиболее часто используемые типы:
"linear""exponential""cubic-bezier"Линейная интерполяция задаёт равномерное изменение значения между двумя контрольными точками. График зависимости представляет собой прямую линию.
[
"interpolate",
["linear"],
["zoom"],
5, 0.5,
10, 1.0
]
Если zoom изменяется от 5 до 10, значение плавно растёт от 0.5 до 1.0 с постоянной скоростью.
Формально:
[ t = ]
[ value = v_0 + t (v_1 - v_0)]
"line-width": [
"interpolate",
["linear"],
["zoom"],
3, 1,
10, 5
]
Exponential интерполяция вводит нелинейное изменение скорости перехода. Значения изменяются быстрее или медленнее в зависимости от параметра base.
[
"interpolate",
["exponential", 2],
["zoom"],
5, 0.5,
10, 1.0
]
Функция использует степень:
[ t = ]
[ value = v_0 + t^{base}(v_1 - v_0)]
base = 1 → линейное поведениеbase > 1 → ускорение в конце0 < base < 1 → ускорение в началеExponential интерполяция часто используется там, где требуется:
"circle-radius": [
"interpolate",
["exponential", 1.5],
["zoom"],
5, 2,
12, 20
]
Cubic-bezier интерполяция заимствована из CSS-анимаций и позволяет задавать произвольную кривую перехода с помощью двух контрольных точек.
[
"interpolate",
["cubic-bezier", 0.2, 0.8, 0.3, 1.0],
["zoom"],
5, 0.5,
10, 1.0
]
Кривая задаётся четырьмя точками:
Контрольные точки:
Cubic-bezier позволяет:
["cubic-bezier", 0.0, 0.0, 0.58, 1.0]
["cubic-bezier", 0.42, 0.0, 1.0, 1.0]
["cubic-bezier", 0.42, 0.0, 0.58, 1.0]
"opacity": [
"interpolate",
["cubic-bezier", 0.4, 0.0, 0.2, 1.0],
["zoom"],
6, 0,
8, 1
]
Такой подход позволяет добиться визуально естественного появления слоя при изменении масштаба.
В Mapbox GL JS интерполяция напрямую влияет на восприятие пространственной информации:
Наиболее частый сценарий — зависимость от масштаба карты:
[
"interpolate",
["exponential", 1.2],
["zoom"],
0, 0.2,
5, 0.5,
10, 1,
14, 2
]
Такая конструкция позволяет управлять сложной шкалой роста значений на разных уровнях детализации.
Количество контрольных точек напрямую влияет на характер интерполяции:
Пример:
[
"interpolate",
["linear"],
["zoom"],
3, 0,
6, 0.3,
9, 0.8,
12, 1
]
Интерполяция часто используется внутри более сложных конструкций:
casematchstepПример:
[
"interpolate",
["exponential", 1.8],
["get", "population"],
0, 1,
1000000, 5
]
Здесь интерполяция работает не по zoom, а по данным слоя.
Выбор метода влияет не только на визуальную эстетику, но и на читаемость карты:
Во всех типах интерполяции значения за пределами stops:
В Mapbox GL JS интерполяция влияет на производительность рендеринга: