В системе выражений MapLibre GL JS математические операторы
используются для динамического вычисления значений свойств стиля на
основе данных, масштаба и пользовательских параметров. Выражения
применяются в слоях (paint, layout,
filter) и позволяют строить адаптивные стили без
необходимости пересоздавать слой.
Базовый набор арифметических операторов включает сложение, вычитание, умножение и деление:
+ — сложение- — вычитание* — умножение/ — делениеКаждый оператор работает в рамках JSON-структуры выражений.
Пример линейного масштабирования толщины линии:
["*", 2, ["get", "road_width"]]
Здесь значение свойства road_width умножается на 2,
формируя итоговую ширину линии.
Комбинации арифметических операторов позволяют строить более сложные формулы:
["+", ["*", 0.5, ["get", "population"]], 10]
Такое выражение увеличивает значение population, затем
добавляет базовое смещение.
В выражениях отсутствует классический синтаксис приоритета операторов, как в языках программирования. Приоритет задаётся исключительно структурой вложенности массива.
Пример, эквивалентный формуле:
(10 + 20) * 3
в MapLibre выражается так:
["*", ["+", 10, 20], 3]
Если изменить структуру:
["+", 10, ["*", 20, 3]]
результат будет другим, поскольку сначала вычисляется умножение.
Это делает выражения строго детерминированными и исключает неоднозначность разбора.
Помимо базовых операторов, доступны математические функции, расширяющие возможности вычислений.
["abs", ["-", ["get", "elevation"], 100]]
Используется для нормализации отклонений относительно базового уровня.
["round", ["get", "value"]]
["floor", ["get", "value"]]
["ceil", ["get", "value"]]
Округление применяется в случаях, когда требуется дискретизация визуальных параметров, например ступенчатая шкала толщины линий.
["min", ["get", "a"], ["get", "b"]]
["max", ["get", "a"], 100]
Функции min и max часто используются для
ограничения диапазонов значений.
Пример ограничения прозрачности:
["max", 0, ["min", 1, ["get", "opacity"]]]
Поддерживаются стандартные тригонометрические операции:
sincostanПример синусоидального изменения параметра:
["*", 10, ["sin", ["*", 0.1, ["get", "angle"]]]]
Такие конструкции применяются для создания плавных анимационных эффектов или вариативности визуализации.
["ln", ["get", "value"]]
["log2", ["get", "value"]]
Используются для сжатия диапазонов данных, особенно при визуализации распределений с сильной асимметрией.
Хотя формально они относятся к логическим выражениям, их часто используют в математических вычислениях как элементы условной алгебры.
Основные операторы:
<<=>>===!=Пример проверки диапазона:
["all",
[">=", ["get", "value"], 10],
["<", ["get", "value"], 100]
]
Это эквивалент математическому интервалу:
10 ≤ x < 100
Такие конструкции позволяют формировать дискретные математические области.
Конструкция case позволяет задавать кусочно-заданные
функции.
Пример ступенчатой функции:
["case",
["<", ["get", "zoom"], 5], 1,
["<", ["get", "zoom"], 10], 2,
3
]
Фактически это реализация математической функции:
f(z) =
1, z < 5
2, 5 ≤ z < 10
3, z ≥ 10
Одним из ключевых математических источников данных в MapLibre является уровень масштабирования карты.
["zoom"]
Использование zoom в арифметике позволяет строить непрерывные функции:
["*", ["zoom"], 2]
или более сложные зависимости:
["+", 5, ["*", 0.5, ["zoom"]]]
Это позволяет задавать параметры, изменяющиеся в зависимости от масштаба:
Интерполяция является центральным инструментом плавного перехода значений.
["interpolate", ["linear"], ["zoom"],
0, 0,
10, 20
]
Математически это функция:
f(z) = a + (b - a) * t
где t зависит от zoom.
["interpolate", ["exponential", 1.5], ["zoom"],
0, 1,
10, 100
]
Такая форма позволяет ускорять рост функции по степени, управляемой базой экспоненты.
["step", ["zoom"],
1,
5, 2,
10, 3
]
Эквивалент кусочной функции без плавных переходов.
Одним из ключевых принципов системы является композиционность: любое выражение может быть аргументом другого выражения.
Пример сложной композиции:
["/",
["+",
["*", ["zoom"], 2],
["get", "value"]
],
["max", 1, ["get", "divider"]]
]
Здесь происходит:
Такие конструкции позволяют формировать полноценные математические модели прямо в стиле карты.
Частая задача — приведение значений к диапазону [0, 1]
или другому стандартному интервалу.
Пример нормализации:
["/",
["-", ["get", "value"], 10],
90
]
Эквивалент формулы:
(x - min) / (max - min)
С использованием ограничений:
["max", 0,
["min", 1,
["-",
["get", "value"], 10
]
]
]
Математические операторы часто применяются для построения геометрически интерпретируемых значений:
Пример вычисления радиуса:
["*", 5, ["sqrt", ["get", "area"]]]
Это отражает зависимость радиуса от площади объекта.
Для предотвращения некорректных значений используются ограничения
через min и max.
Пример стабилизации прозрачности:
["min", 1,
["max", 0,
["get", "opacity"]
]
]
Такая конструкция гарантирует попадание значения в допустимый диапазон.
Сложные стили часто представляют собой математические модели с несколькими уровнями вложенности:
["*",
["interpolate", ["linear"], ["zoom"],
0, 0.5,
10, 2
],
["max", 1, ["get", "factor"]]
]
Здесь сочетаются:
При некорректных данных выражения стремятся к безопасному поведению:
get возвращает fallback (если
предусмотрен)Поэтому математические конструкции проектируются с учётом устойчивости:
["/", ["get", "value"], ["max", 1, ["get", "divider"]]]
Основная сила выражений заключается в объединении математических операторов и данных слоя.
Пример:
["+",
["*", ["get", "population"], 0.001],
["*", ["zoom"], 2]
]
Это создаёт модель, в которой визуальный параметр зависит одновременно от:
Такая комбинация формирует основу динамической картографической визуализации.