В MapLibre GL JS весовые выражения применяются в тех частях стиля, где требуется преобразовать числовые или категориальные данные в относительную значимость, влияющую на визуальное отображение объектов. Наиболее характерный случай — управление интенсивностью тепловых карт и влиянием отдельных точек на результирующий визуальный слой.
Вес (weight) в контексте MapLibre GL JS — это коэффициент, который усиливает или ослабляет вклад конкретного объекта в итоговое визуальное представление. В отличие от прямого отображения свойств (цвет, размер, прозрачность), вес не является визуальным параметром сам по себе. Он выступает промежуточным числом, влияющим на вычисление итоговой визуальной функции слоя.
В выражениях стиля вес задаётся через систему expression, где данные из источника преобразуются в число, обычно в диапазоне от 0 до 1 или с последующей нормализацией внутри слоя.
Наиболее распространённое использование веса реализовано в тепловых
слоях через свойство heatmap-weight. Оно определяет,
насколько сильно каждая точка данных влияет на окружающее пространство
тепловой карты.
Типичное определение:
map.addLayer({
id: 'heatmap-layer',
type: 'heatmap',
source: 'points',
paint: {
'heatmap-weight': [
'interpolate',
['linear'],
['get', 'intensity'],
0, 0,
6, 1
]
}
});
Здесь значение свойства intensity из данных
преобразуется в нормализованный вес. При значении 0 вклад точки
минимален, при 6 и выше — максимален.
Выражение interpolate задаёт плавное преобразование
исходного значения:
Фактически это функция:
weight = f(attribute_value)
где f — кусочно-линейное преобразование.
Помимо плавной интерполяции применяется ступенчатая логика через
step. Она полезна, когда данные необходимо разбить на
категории влияния.
'heatmap-weight': [
'step',
['get', 'mag'],
0,
3, 0.3,
5, 0.7,
8, 1
]
В этом случае вес меняется скачкообразно:
Такой подход часто используется в геоданных с естественными порогами: землетрясения, плотность событий, аварийность.
В тепловых слоях вес напрямую участвует в вычислении плотности поля. Алгоритм агрегирует влияние всех точек, после чего формируется непрерывное распределение интенсивности.
Упрощённо процесс можно описать так:
Таким образом, две точки с одинаковой геометрией, но разным весом, создают принципиально разную визуальную картину.
Весовые выражения часто строятся на основе атрибутов объектов:
'heatmap-weight': [
'*',
['get', 'count'],
0.1
]
Здесь используется арифметическое выражение:
count задаёт исходную величину;Такая форма удобна для работы с агрегированными данными, где каждое значение уже отражает частоту событий.
Вес может изменяться в зависимости от масштаба карты. Это позволяет усиливать или ослаблять влияние объектов при увеличении или уменьшении масштаба.
'heatmap-weight': [
'interpolate',
['linear'],
['zoom'],
0, 0.2,
10, 0.6,
15, 1
]
Здесь используется зум как управляющий параметр. На низких уровнях детализации влияние точек ослаблено, чтобы избежать перегрузки, а при приближении усиливается.
Вес в тепловых слоях не работает изолированно. Он взаимодействует с:
heatmap-intensity — общий коэффициент усиления
слоя;heatmap-radius — радиус распространения влияния;heatmap-color — интерпретация итоговой плотности;heatmap-opacity — финальная визуальная
прозрачность.Фактически вес формирует базовое поле, которое затем масштабируется и окрашивается.
На практике часто встречаются некорректные конфигурации:
Отсутствие нормализации данных Сырые значения (например, от 0 до 10000) без приведения к диапазону приводят к доминированию отдельных точек.
Линейная модель для нелинейных данных В случаях экспоненциального распределения событий линейная интерполяция даёт искажённую картину.
Игнорирование масштаба карты Постоянный вес без зависимости от zoom создаёт перегрузку на одних уровнях и пустоту на других.
Смешение категориальных и числовых весов Использование строковых значений без явного преобразования в число приводит к некорректной оценке влияния.
Весовые выражения часто становятся частью более сложных логических конструкций:
'heatmap-weight': [
'case',
['==', ['get', 'type'], 'event'], 1,
['==', ['get', 'type'], 'noise'], 0.3,
0.1
]
Здесь вес зависит от категории объекта. Такая модель позволяет выделять приоритетные классы данных без изменения источника.
Хотя weight выражения не являются вычислительно тяжёлыми сами по себе, их влияние проявляется через итоговую плотность данных. Чем выше средний вес объектов, тем более насыщенным становится поле, что увеличивает нагрузку на:
Оптимизация заключается в ограничении диапазона значений и предварительной агрегации данных.
Корректная шкала веса должна удовлетворять нескольким условиям:
Чаще всего используется нормализация к диапазону 0–1 или 0–10 с последующим масштабированием внутри выражения.
Вес не заменяет плотность, но модифицирует её. Две области с одинаковым количеством точек могут выглядеть по-разному, если распределение веса отличается:
Эта асимметрия позволяет моделировать приоритеты данных, а не только их количество.