Выражения в MapLibre GL JS представляют собой формальный язык описания вычислений, используемый внутри стилей для динамического управления визуальными свойствами слоёв. Они позволяют задавать значения не только как константы, но и как функции от данных, масштаба, состояния фич и других параметров карты. Синтаксис основан на JSON-массивах, где первый элемент определяет тип операции, а последующие — аргументы.
Любое выражение в MapLibre GL JS записывается в виде массива:
["оператор", аргумент1, аргумент2, ...]
Такой формат обеспечивает однозначную интерпретацию и возможность композиции выражений любой сложности. Вложенность допускается произвольная, что позволяет строить многоуровневые вычисления.
Пример простого выражения:
["get", "name"]
Здесь выполняется получение значения свойства name из
текущего объекта данных.
Любые примитивные значения могут использоваться напрямую без обёртки в оператор:
10
"road"
true
Такие значения трактуются как постоянные и не зависят от контекста карты.
MapLibre GL JS предоставляет набор операторов для работы с данными объекта слоя.
["get", "property_name"]
Извлекает значение свойства текущего объекта.
["has", "property_name"]
Возвращает логическое значение.
["length", ["get", "name"]]
Используется для строк и массивов.
["id"]
Возвращает идентификатор фичи.
["geometry-type"]
["properties"]
Позволяют работать с типом геометрии и полным набором свойств объекта.
MapLibre GL JS поддерживает динамическое изменение стиля в зависимости от zoom level.
["zoom"]
Возвращает текущий уровень масштабирования.
Наиболее часто используемый оператор — interpolate.
["interpolate", ["linear"], ["zoom"], 5, 1, 10, 5]
Здесь значение плавно изменяется от 1 при zoom 5 до 5 при zoom 10.
Поддерживаются различные типы интерполяции:
"linear" — линейная"exponential" — экспоненциальная"cubic-bezier" — кривые БезьеПозволяет реализовать сопоставление значений:
["match",
["get", "type"],
"primary", "#ff0000",
"secondary", "#00ff00",
"#000000"
]
Если значение свойства type совпадает с одним из
перечисленных, возвращается соответствующий цвет, иначе — значение по
умолчанию.
Используется для последовательной проверки условий:
["case",
["==", ["get", "population"], 0], "#ccc",
["<", ["get", "population"], 1000], "#f0f0f0",
"#333"
]
Условия проверяются по порядку до первого истинного.
MapLibre GL JS поддерживает стандартные операции:
["+", 2, 3]
["-", 10, 5]
["*", 4, 2]
["/", 8, 2]
Логические операции:
["==", 1, 1]
["!=", 1, 2]
["<", 5, 10]
["<=", 5, 5]
["all", true, false]
["any", true, false]
["!", false]
Цветовые выражения позволяют динамически формировать визуальные параметры.
["rgb", 255, 0, 0]
["rgba", 255, 0, 0, 0.5]
["hsl", 120, 1, 0.5]
["to-rgba", ["color", "#ff0000"]]
["array", 1, 2, 3]
["at", 0, ["get", "coordinates"]]
["object", "key1", "value1", "key2", "value2"]
["to-number", "10"]
["to-string", 10]
["to-boolean", 1]
Позволяет объявлять локальные переменные:
["let",
"base", 10,
"mult", 2,
["*", ["var", "base"], ["var", "mult"]]
]
Используется для доступа к переменным:
["var", "base"]
Feature State позволяет хранить динамическое состояние объектов карты.
["feature-state", "selected"]
Используется для интерактивных сценариев, таких как выделение объектов при наведении или клике.
["match",
["get", "class"],
"water", "#2b8cff",
"road", "#999999",
"#000000"
]
["interpolate",
["linear"],
["zoom"],
5, 0.5,
10, 3,
15, 8
]
["interpolate",
["linear"],
["get", "density"],
0, 0,
100, 1
]
Сила системы выражений заключается в их вложенности. Любой оператор может принимать в качестве аргумента другое выражение.
Пример:
["case",
["has", "population"],
["interpolate",
["linear"],
["get", "population"],
0, 0.2,
1000000, 1
],
0
]
Здесь условие проверяет наличие свойства, а затем применяется интерполяция.
Выражения вычисляются в нескольких контекстах:
Каждый контекст предоставляет ограниченный набор доступных данных, что обеспечивает предсказуемость вычислений.
Система выражений не поддерживает произвольный JavaScript-код. Допустимы только заранее определённые операторы. Это обеспечивает:
Выражения не могут обращаться к внешним API, глобальным объектам или выполнять побочные эффекты.