Математические операторы

В системе выражений 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"]]]

Тригонометрические функции

Поддерживаются стандартные тригонометрические операции:

  • sin
  • cos
  • tan

Пример синусоидального изменения параметра:

["*", 10, ["sin", ["*", 0.1, ["get", "angle"]]]]

Такие конструкции применяются для создания плавных анимационных эффектов или вариативности визуализации.


Логарифмы и степень

["ln", ["get", "value"]]
["log2", ["get", "value"]]

Используются для сжатия диапазонов данных, особенно при визуализации распределений с сильной асимметрией.


Операторы сравнения и их математическая роль

Хотя формально они относятся к логическим выражениям, их часто используют в математических вычислениях как элементы условной алгебры.

Основные операторы:

  • <
  • <=
  • >
  • >=
  • ==
  • !=

Пример проверки диапазона:

["all",
  [">=", ["get", "value"], 10],
  ["<", ["get", "value"], 100]
]

Это эквивалент математическому интервалу:

10 ≤ x < 100

Такие конструкции позволяют формировать дискретные математические области.


Условные математические выражения (case)

Конструкция case позволяет задавать кусочно-заданные функции.

Пример ступенчатой функции:

["case",
  ["<", ["get", "zoom"], 5], 1,
  ["<", ["get", "zoom"], 10], 2,
  3
]

Фактически это реализация математической функции:

f(z) =
  1, z < 5
  2, 5 ≤ z < 10
  3, z ≥ 10

Масштабирование и зависимость от zoom

Одним из ключевых математических источников данных в 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"]]
]

Здесь происходит:

  1. масштабирование zoom
  2. добавление атрибута данных
  3. нормализация через max
  4. деление результата

Такие конструкции позволяют формировать полноценные математические модели прямо в стиле карты.


Нормализация данных через математические операторы

Частая задача — приведение значений к диапазону [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]
]

Это создаёт модель, в которой визуальный параметр зависит одновременно от:

  • атрибутивных данных
  • масштаба карты

Такая комбинация формирует основу динамической картографической визуализации.