Google Maps JavaScript API предоставляет механизм визуализации
тепловых карт через слой HeatmapLayer, где ключевым
параметром, определяющим «силу» отображения точек, выступает
интенсивность (intensity). Она влияет на вклад каждой точки данных в
итоговое распределение плотности и позволяет управлять визуальной
выразительностью без изменения исходного набора координат.
В основе тепловой карты лежит взвешенная сумма влияний точек. Каждая точка может иметь числовой вес, который масштабируется параметром интенсивности слоя.
Обобщённо поведение можно описать как:
w’ = w × I
где:
При увеличении интенсивности возрастает зона влияния каждой точки, а цветовые переходы становятся более насыщенными.
Базовая конфигурация включает создание массива данных и инициализацию
слоя HeatmapLayer.
const heatmapData = [
new google.maps.LatLng(40.7128, -74.0060),
new google.maps.LatLng(40.7138, -74.0050),
new google.maps.LatLng(40.7148, -74.0040)
];
const heatmap = new google.maps.visualization.HeatmapLayer({
data: heatmapData,
radius: 20
});
heatmap.setMap(map);
На этом этапе интенсивность не задана явно и принимает значение по умолчанию, равное 1.
Основной способ управления — метод
set('intensity', value). Значение обычно лежит в диапазоне
от 0 до 1, но технически может быть расширено выше единицы для усиления
эффекта.
heatmap.set('intensity', 0.5);
При значении ниже 1 визуальный эффект становится менее выраженным, плотные области «размываются», а слабые кластеры теряют заметность.
При значении выше 1 усиливается контраст, а локальные скопления точек начинают доминировать на карте.
heatmap.set('intensity', 2.0);
Интенсивность часто изменяется в ответ на пользовательские действия: масштабирование карты, фильтрацию данных или переключение временных интервалов.
function updateIntensityByZoom(map, heatmap) {
const zoom = map.getZoom();
let intensity = 1;
if (zoom < 10) {
intensity = 0.5;
} else if (zoom >= 10 && zoom < 14) {
intensity = 1;
} else {
intensity = 2;
}
heatmap.set('intensity', intensity);
}
google.maps.event.addListener(map, 'zoom_changed', () => {
updateIntensityByZoom(map, heatmap);
});
Такой подход позволяет компенсировать визуальные искажения плотности при изменении масштаба.
Интенсивность не заменяет веса точек, а дополняет их. Если каждая точка уже содержит параметр веса, итоговое влияние рассчитывается как произведение веса на интенсивность слоя.
const weightedData = [
{ location: new google.maps.LatLng(40.7128, -74.0060), weight: 3 },
{ location: new google.maps.LatLng(40.7138, -74.0050), weight: 1 },
{ location: new google.maps.LatLng(40.7148, -74.0040), weight: 5 }
];
const heatmap = new google.maps.visualization.HeatmapLayer({
data: weightedData
});
heatmap.set('intensity', 1.5);
В этом случае каждая точка усиливается пропорционально своему весу и глобальному коэффициенту интенсивности.
Человеческое восприятие плотности не является линейным. Поэтому даже небольшое изменение параметра интенсивности может значительно менять визуальную картину.
Практические наблюдения:
Для сложных наборов данных часто применяются адаптивные алгоритмы, корректирующие интенсивность в зависимости от плотности точек.
Интенсивность может вычисляться на основе характеристик самих данных, например:
Пример адаптивной функции:
function calculateIntensity(dataPoints) {
const avgWeight = dataPoints.reduce((sum, p) => sum + (p.weight || 1), 0) / dataPoints.length;
if (avgWeight < 1.5) return 1.5;
if (avgWeight < 3) return 1;
return 0.7;
}
heatmap.set('intensity', calculateIntensity(weightedData));
Такой подход стабилизирует визуализацию при изменяющейся нагрузке данных.
Хотя интенсивность не изменяет количество точек, она влияет на сложность рендеринга визуального слоя. При высоких значениях:
Это может приводить к снижению FPS при большом объёме данных, особенно на слабых устройствах.
Интенсивность тесно взаимодействует с рядом параметров:
radius — радиус влияния точкиopacity — прозрачность слояgradient — цветовая схемаКомбинация параметров определяет итоговое восприятие плотности.
Пример совместной настройки:
heatmap.setOptions({
radius: 25,
opacity: 0.8,
gradient: [
'rgba(0, 0, 255, 0)',
'rgba(0, 255, 255, 1)',
'rgba(0, 255, 0, 1)',
'rgba(255, 255, 0, 1)',
'rgba(255, 0, 0, 1)'
]
});
heatmap.set('intensity', 1.3);
При работе с неоднородными данными интенсивность используется как компенсирующий коэффициент:
Такой подход позволяет поддерживать одинаковую читаемость карты независимо от масштаба и плотности исходного набора координат.