Heatmap-слой предназначен для визуализации плотности точечных данных на карте без отображения отдельных маркеров. Вместо дискретных точек используется непрерывное распределение интенсивности, где цвет и яркость отражают концентрацию событий в пространстве.
Основная область применения — анализ больших наборов координат: геолокации пользователей, события, заказы, точки интереса, телеметрия. Heatmap позволяет быстро выявлять кластеры и зоны активности без перегрузки интерфейса.
Heatmap в Mapbox GL JS строится на основе точечных данных из
источника типа GeoJSON. Каждая точка влияет на окружающее
пространство в радиусе, формируя «поле плотности».
Формально каждая точка задаёт вклад:
Результирующее изображение представляет собой интерполяцию этих влияний.
Heatmap-слой всегда опирается на source типа
geojson.
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
properties: {
magnitude: 1
},
geometry: {
type: 'Point',
coordinates: [37.6173, 55.7558]
}
}
]
}
});
Каждый Feature должен содержать
Point-геометрию. Дополнительные свойства используются для
управления весом.
map.addLayer({
id: 'heatmap-layer',
type: 'heatmap',
source: 'points',
maxzoom: 18,
paint: {
'heatmap-weight': 1
}
});
Минимальная конфигурация включает:
type: 'heatmap'source с точкамиheatmap-weightHeatmap-слой управляется набором выражений в paint,
определяющих поведение визуализации.
Определяет вклад каждой точки в итоговую плотность.
'heatmap-weight': [
'interpolate',
['linear'],
['get', 'magnitude'],
0, 0,
6, 1
]
Чем выше значение, тем сильнее влияние точки.
Управляет общей «силой» heatmap.
'heatmap-intensity': [
'interpolate',
['linear'],
['zoom'],
0, 1,
9, 3
]
Используется для усиления эффекта при увеличении масштаба.
Радиус влияния каждой точки в пикселях.
'heatmap-radius': [
'interpolate',
['linear'],
['zoom'],
0, 2,
9, 20
]
Малые значения дают локальные пятна, большие — сглаженную карту плотности.
Степень размытия.
'heatmap-blur': 1
Повышение blur уменьшает резкость границ и усиливает непрерывность распределения.
Прозрачность слоя.
'heatmap-opacity': 0.8
Часто используется в связке с другими слоями (например, точечными маркерами поверх heatmap).
Цвет задаётся через интерполяцию плотности.
'heatmap-color': [
'interpolate',
['linear'],
['heatmap-density'],
0, 'rgba(0,0,255,0)',
0.2, 'blue',
0.4, 'cyan',
0.6, 'lime',
0.8, 'yellow',
1, 'red'
]
Параметр heatmap-density — нормализованное значение от 0
до 1, отражающее локальную концентрацию.
Heatmap в Mapbox GL JS часто комбинируется с изменением параметров по zoom.
'heatmap-radius': [
'interpolate',
['exponential', 2],
['zoom'],
0, 2,
10, 25
],
'heatmap-intensity': [
'interpolate',
['linear'],
['zoom'],
0, 1,
12, 4
]
Так достигается эффект детализации: при уменьшении масштаба данные агрегируются визуально, при увеличении — раскрываются локальные структуры.
Каждый Feature может содержать свойства, влияющие на
итоговую визуализацию:
magnitude, count,
value)Пример:
properties: {
magnitude: 5,
type: 'event'
}
Использование веса:
'heatmap-weight': ['get', 'magnitude']
Heatmap является более эффективной альтернативой рендерингу большого
количества circle-слоёв, но чувствителен к объёму
данных.
Факторы производительности:
paintОптимизация часто включает:
Heatmap и кластеризация решают схожие задачи, но различаются подходом:
Кластеризация:
cluster: true,
clusterRadius: 40
Heatmap предпочтителен при анализе распределения, кластеризация — при необходимости точного подсчёта групп.
Часто heatmap используется совместно с circle-слоем для
перехода от плотности к отдельным объектам.
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 3,
'circle-color': 'white'
}
});
Типичный паттерн:
'heatmap-opacity': [
'interpolate',
['linear'],
['zoom'],
7, 1,
10, 0
]
Heatmap можно ограничивать по условиям:
filter: ['==', ['get', 'type'], 'event']
или более сложные условия:
filter: ['>=', ['get', 'magnitude'], 3]
Источник можно обновлять без пересоздания слоя:
map.getSource('points').setData(newGeojson);
Это позволяет строить динамические heatmap в реальном времени (например, потоковые события).
Mapbox GL JS поддерживает выражения, позволяющие комбинировать данные:
'heatmap-weight': [
'+',
['get', 'magnitude'],
['*', ['get', 'importance'], 0.5]
]
Также возможно нормирование:
['/', ['get', 'value'], 10]
Типичная конфигурация heatmap-слоя включает:
На низком zoom:
На среднем zoom:
На высоком zoom:
Heatmap не отражает точные координаты объектов, а только плотность распределения. Это важно учитывать при анализе:
Heatmap-слой часто используется как визуальный слой поверх аналитических систем:
В таких системах GeoJSON часто формируется сервером в агрегированном виде для снижения нагрузки на клиент.