В стилях MapLibre GL JS выражение step используется для
построения ступенчатых (piecewise constant) функций, где значение
изменяется скачкообразно при достижении заданных порогов. Такой подход
применяется для дискретной классификации данных: масштабирование
символов, категоризация числовых атрибутов, настройка визуальных
интервалов без интерполяции между ними.
Базовая структура step выражения имеет следующий
вид:
["step", input, output0, stop1, output1, stop2, output2, ...]
Логика работы определяется последовательным сравнением:
input < stop1 → используется
output0stop1 ≤ input < stop2 → используется
output1input ≥ lastStop → используется последний
outputNВыражение вычисляется слева направо, без интерполяции. Это ключевое
отличие от interpolate. Значение не «плавно» меняется, а
перескакивает между заранее заданными состояниями.
Для каждого входного значения выполняется поиск первого порога, который оно не превышает. После этого выбирается соответствующий выход.
Принцип можно представить как последовательность условий:
if input < stop1 → output0
else if input < stop2 → output1
else → output2
step часто применяется к свойствам геометрии или
атрибутам из векторных тайлов. Значение извлекается через выражение
["get", "property"].
Пример изменения цвета объектов в зависимости от числового поля
population:
[
"step",
["get", "population"],
"#fee5d9",
1000,
"#fcae91",
5000,
"#fb6a4a",
20000,
"#cb181d"
]
Здесь формируется классификация:
Подобный подход часто используется в хороплетных картах и тематической визуализации.
Одно из наиболее распространённых применений step —
адаптация визуализации к уровню зума. Входным значением выступает
["zoom"].
Пример изменения радиуса точек:
[
"step",
["zoom"],
2,
5,
4,
10,
8,
15,
16
]
Интерпретация:
Такая схема позволяет контролировать визуальную плотность объектов на разных масштабах.
Ключевая особенность step заключается в отсутствии
плавных переходов. Значение остаётся постоянным внутри интервала.
Это делает выражение подходящим для задач, где:
Пример: изменение размера символов зданий в зависимости от типа плотности застройки.
[
"step",
["get", "density"],
1,
3,
2,
6,
3
]
Здесь каждый диапазон соответствует отдельному визуальному классу.
Пороги (stop значения) должны быть упорядочены по
возрастанию. Нарушение порядка приводит к некорректной классификации или
игнорированию части выражения.
Корректная структура:
stop1 < stop2 < stop3
Типичная ошибка — использование неотсортированных порогов, что ломает логику ступенчатого распределения.
step часто комбинируется с другими конструкциями
выражений.
case логикой
через вложенностьХотя в MapLibre GL JS есть case, step может
использоваться как более компактная альтернатива числовой
классификации.
interpolate
для гибридных эффектовВ некоторых случаях применяется комбинированный подход:
step задаёт резкие переходы между диапазонамиinterpolate для плавной
детализацииПример: изменение прозрачности в зависимости от зума с порогами.
step применяется в большинстве визуальных свойств
слоёв:
circle-radiuscircle-colorline-widthfill-opacitytext-sizeПример для линий:
[
"step",
["zoom"],
0.5,
8,
1,
12,
2,
16,
4
]
Линии постепенно становятся визуально более выраженными при увеличении масштаба.
Входное значение может быть:
["get", ...])["zoom"])["+", ...],
["*", ...])Важно, что step требует числового контекста; строковые
значения приводят к некорректному поведению.
Если указано только:
["step", input, output0]
то выражение всегда возвращает output0, независимо от
входного значения.
При добавлении одного порога:
["step", input, output0, 10, output1]
логика упрощается до бинарного выбора:
Выражение step вычисляется на уровне рендеринга стиля и
оптимизировано для WebGL-пайплайна MapLibre. Оно не требует
дополнительных JavaScript-вычислений на стороне приложения, что снижает
нагрузку при работе с большими наборами данных.
Особенно эффективно при:
Каждый из этих сценариев опирается на дискретную природу выражения, где важнее категория, чем точное значение.
step не предназначен для:
В таких случаях предпочтительнее использовать
interpolate или case, либо их комбинации с
арифметическими выражениями.
Пороговые значения интерпретируются включительно по правой границе:
Это означает, что значение ровно равное stopN относится
к следующему диапазону.
Такая модель обеспечивает предсказуемое поведение при граничных значениях и исключает пересечения классов.