Настройка интенсивности

Google Maps JavaScript API предоставляет механизм визуализации тепловых карт через слой HeatmapLayer, где ключевым параметром, определяющим «силу» отображения точек, выступает интенсивность (intensity). Она влияет на вклад каждой точки данных в итоговое распределение плотности и позволяет управлять визуальной выразительностью без изменения исходного набора координат.

В основе тепловой карты лежит взвешенная сумма влияний точек. Каждая точка может иметь числовой вес, который масштабируется параметром интенсивности слоя.

Обобщённо поведение можно описать как:

  • каждая точка имеет координаты (lat, lng)
  • каждая точка может иметь вес w
  • интенсивность слоя I масштабирует вклад точки:

w’ = w × I

где:

  • 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.

Управление интенсивностью через API

Основной способ управления — метод 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);

В этом случае каждая точка усиливается пропорционально своему весу и глобальному коэффициенту интенсивности.

Нелинейное восприятие интенсивности

Человеческое восприятие плотности не является линейным. Поэтому даже небольшое изменение параметра интенсивности может значительно менять визуальную картину.

Практические наблюдения:

  • диапазон 0.1–0.5: слабые кластеры почти исчезают
  • диапазон 0.8–1.2: сбалансированная визуализация
  • диапазон 1.5–3: усиление горячих зон, подавление периферии

Для сложных наборов данных часто применяются адаптивные алгоритмы, корректирующие интенсивность в зависимости от плотности точек.

Привязка интенсивности к данным

Интенсивность может вычисляться на основе характеристик самих данных, например:

  • количество точек в текущей области
  • средний вес
  • дисперсия распределения

Пример адаптивной функции:

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 при большом объёме данных, особенно на слабых устройствах.

Связь с другими параметрами HeatmapLayer

Интенсивность тесно взаимодействует с рядом параметров:

  • 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);

Практика стабилизации визуального баланса

При работе с неоднородными данными интенсивность используется как компенсирующий коэффициент:

  • при редких данных — увеличение интенсивности
  • при плотных кластерах — снижение интенсивности
  • при смешанных распределениях — динамическая нормализация

Такой подход позволяет поддерживать одинаковую читаемость карты независимо от масштаба и плотности исходного набора координат.