В слое типа heatmap в Mapbox GL JS каждая точка исходных
данных не влияет на итоговое изображение одинаково. Интенсивность
влияния регулируется свойством
heatmap-weight, которое определяет «вес»
каждого географического объекта при расчёте плотности.
Mapbox GL JS использует heatmap-weight как динамическое
выражение, позволяющее учитывать не только наличие точки, но и её
значимость.
Тепловая карта формируется не как простое количество точек в области, а как взвешенная сумма значений.
Каждая точка источника данных имеет вклад:
вклад точки = heatmap-weight × (нормализованное значение точки)
Если heatmap-weight не задан, используется значение по
умолчанию 1.
Таким образом:
map.addLayer({
id: 'heatmap-layer',
type: 'heatmap',
source: 'points',
paint: {
'heatmap-weight': 1
}
});
В этом виде каждая точка равнозначна.
Одно из ключевых применений heatmap-weight — привязка к
атрибутам GeoJSON.
'heatmap-weight': [
'get',
'intensity'
]
Если объект данных содержит:
{
"type": "Feature",
"properties": {
"intensity": 3
}
}
то его вклад будет втрое выше стандартного.
Часто исходные данные имеют широкий диапазон значений. Для
корректного отображения используется нормализация через
interpolate.
'heatmap-weight': [
'interpolate',
['linear'],
['get', 'mag'],
0, 0,
6, 1
]
mag = 0 → вес 0mag = 6 → вес 1Иногда данные разделены по категориям, например:
Пример:
'heatmap-weight': [
'match',
['get', 'type'],
'fire', 1,
'smoke', 0.7,
'alert', 1.5,
0.3
]
Здесь:
heatmap-weight работает на уровне отдельных точек, тогда
как heatmap-intensity масштабирует уже агрегированный
результат.
Формально:
heatmap-weight → вклад точкиheatmap-intensity → масштаб всей поверхностиКомбинация позволяет формировать сложные визуальные модели плотности.
Вес можно изменять в зависимости от масштаба карты:
'heatmap-weight': [
'interpolate',
['linear'],
['zoom'],
0, 0.5,
10, 1,
15, 2
]
Это используется для:
В типичных наборах данных применяется двойная нормализация:
heatmap-weight)heatmap-radius)heatmap-intensity)Пример комплексной конфигурации:
paint: {
'heatmap-weight': [
'interpolate',
['linear'],
['get', 'value'],
0, 0,
100, 1
],
'heatmap-intensity': [
'interpolate',
['linear'],
['zoom'],
0, 1,
9, 3
],
'heatmap-radius': [
'interpolate',
['linear'],
['zoom'],
0, 2,
9, 20
]
}
Если значения из данных напрямую используются без приведения к диапазону 0–1, тепловая карта становится непропорциональной.
Значения > 10 часто приводят к визуальному доминированию отдельных точек.
При смешанных данных без match или case
теряется семантическая структура.
heatmap-weight применяется в сценариях:
В таких случаях вес часто отражает:
Источник:
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
Каждый объект Feature может содержать свойства, которые
напрямую участвуют в вычислении веса:
При большом количестве точек важна минимизация сложности выражений:
case конструкцийЕсли значение heatmap-weight вычисляется как
null или undefined, точка:
Поэтому используется защита:
'heatmap-weight': [
'coalesce',
['get', 'weight'],
1
]
heatmap-weight влияет не на цвет напрямую, а на
распределение плотности, которая затем преобразуется через:
heatmap-colorheatmap-opacityТаким образом формируется двухступенчатая модель:
При динамическом обновлении GeoJSON:
Это особенно важно для потоковых данных (streaming data), где каждое событие имеет собственный вклад в итоговое распределение.