В Mapbox GL JS стили описываются декларативно, а динамическое поведение задаётся через выражения. Выражение представляет собой массив, где первый элемент — оператор, последующие — аргументы. Такой формат позволяет интерпретатору стиля выполнять вычисления без пользовательского кода во время рендеринга карты.
Базовый пример выражения:
["get", "population"]
Значение берётся из свойства объекта данных
population.
Сложные выражения строятся вложенно:
["interpolate", ["linear"], ["zoom"], 5, 1, 10, 10]
Зависимость значения от масштаба карты задаётся через интерполяцию.
Выражения интерпретируются в рамках конкретного слоя и свойства стиля. Контекст определяет допустимые типы результата:
line-width,
opacityfill-color,
line-colortext-fieldНесоответствие типа выражения ожидаемому контексту приводит к ошибкам валидации.
Система выражений Mapbox GL JS является строго типизированной. Каждый оператор имеет определённую сигнатуру.
Примеры:
["+", number, number] → number["get", string] → any["==", value, value] → boolean["case", boolean, result, ...] → valueНарушение сигнатуры приводит к ошибке при загрузке стиля или к игнорированию слоя.
Основной уровень проверки выражений выполняется через спецификацию стилей Mapbox Style Specification. При загрузке стиля происходит синтаксический и семантический анализ.
Ключевые этапы:
При обнаружении ошибки слой может быть полностью отключён или заменён значением по умолчанию.
Библиотека mapbox-gl-style-spec содержит валидатор
стилей и выражений.
Пример программной проверки:
import validateStyle from "@mapbox/mapbox-gl-style-spec/lib/validate_style";
const style = {
version: 8,
sources: {},
layers: [
{
id: "water",
type: "fill",
source: "map",
paint: {
"fill-color": ["get", "water_color"]
}
}
]
};
const errors = validateStyle(style);
console.log(errors);
Результат содержит список ошибок с указанием пути в стиле и причиной несоответствия.
Каждое выражение может быть проверено отдельно, если извлечь его из контекста стиля.
Типичный подход:
const expression = ["interpolate", ["linear"], ["zoom"], 0, 0, 10, 1];
При интеграции в слой валидатор проверяет:
Даже при успешной валидации возможны ошибки во время рендеринга. Они фиксируются через событие карты:
map.on("error", (e) => {
console.log(e.error);
});
Типичные runtime-проблемы:
["get", "missing"])["+", "string", 10]
Ожидаются числа, строка делает выражение некорректным.
["get", ["get", "value"]]
Внутренний get возвращает динамический тип, что может
нарушить ожидания внешнего оператора.
["+", 1, 2]
Использование числового результата в свойстве, ожидающем цвет.
["==", ["get", "type"], true]
Сравнение строки и булевого значения.
Фильтры слоёв также являются выражениями:
filter: ["all",
["==", ["get", "type"], "park"],
[">", ["get", "area"], 1000]
]
Проверка фильтра включает:
all,
any, none)При работе с большими стилями выражения часто становятся вложенными и трудно читаемыми. Для анализа используется разбиение на подвыражения:
const zoomLevel = ["zoom"];
const width = [
"interpolate",
["linear"],
zoomLevel,
5,
1,
10,
20
];
Такой подход упрощает проверку и снижает вероятность ошибок типизации.
Получение текущего стиля позволяет анализировать выражения в рантайме:
const style = map.getStyle();
style.layers.forEach(layer => {
console.log(layer.paint);
});
Хотя прямой встроенной валидации выражений на стороне API Mapbox GL JS нет, анализ JSON структуры стиля позволяет выявлять потенциальные проблемы до применения.
Mapbox GL JS генерирует диагностические сообщения, которые содержат:
Эти данные используются для локализации некорректного участка выражения в больших стилях.
Система валидации выражений имеет ряд ограничений:
Из-за этого часть ошибок проявляется только при рендеринге, а не при загрузке стиля.
Корректность выражений зависит от структуры данных источников. Если выражение ожидает числовое поле, а источник содержит строку, результат становится непредсказуемым.
Типичный случай:
["get", "elevation"]
При числовой логике поля elevation строковое значение
приведёт к некорректной интерпретации выражений интерполяции и
сравнений.
В крупных проектах используется многоуровневая проверка:
Такая комбинация снижает вероятность появления некорректных выражений в продакшене и позволяет выявлять ошибки до выполнения рендеринга карты.