Визуализация плотности точек на карте реализуется через слой тепловой карты (Heatmap Layer), который входит в состав библиотеки визуализации Google Maps JavaScript API. Этот инструмент предназначен для отображения распределения большого количества географических точек в виде градиентной карты интенсивности, где цвет и яркость отражают концентрацию данных в конкретных областях.
Heatmap Layer представляет собой отдельный слой поверх базовой карты, который использует входной набор координат и преобразует их в растровую визуализацию с плавными переходами плотности.
Ключевые особенности:
Map объекта;Heatmap Layer не включается в базовую загрузку API и требует
подключения дополнительной библиотеки visualization.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 50.4501, lng: 30.5234 },
zoom: 12
});
const heatmap = new google.maps.visualization.HeatmapLayer({
data: []
});
heatmap.setMap(map);
Подключение скрипта:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=visualization">
</script>
Основой слоя являются точки типа LatLng или объекты
WeightedLocation.
const points = [
new google.maps.LatLng(50.4501, 30.5234),
new google.maps.LatLng(50.4547, 30.5238),
new google.maps.LatLng(50.4470, 30.5250)
];
WeightedLocation используется для задания интенсивности влияния каждой точки.
const weightedPoints = [
{
location: new google.maps.LatLng(50.4501, 30.5234),
weight: 3
},
{
location: new google.maps.LatLng(50.4547, 30.5238),
weight: 1
}
];
Вес влияет на яркость и радиус влияния точки в итоговой визуализации.
const heatmap = new google.maps.visualization.HeatmapLayer({
data: weightedPoints,
radius: 20,
opacity: 0.7
});
heatmap.setMap(map);
Основные параметры:
data — массив точек;radius — радиус влияния каждой точки;opacity — прозрачность слоя;dissipating — изменение поведения при
масштабировании.Параметр radius определяет размер области, в которой
точка влияет на итоговую тепловую карту.
heatmap.set("radius", 40);
Поведение при zoom зависит от dissipating:
heatmap.set("dissipating", true);
true — радиус адаптируется к масштабу карты;false — радиус фиксирован в пикселях.Heatmap Layer использует цветовой градиент для отображения плотности данных.
heatmap.set("gradient", [
"rgba(0, 255, 255, 0)",
"rgba(0, 255, 255, 1)",
"rgba(0, 191, 255, 1)",
"rgba(0, 127, 255, 1)",
"rgba(0, 63, 255, 1)",
"rgba(0, 0, 255, 1)",
"rgba(0, 0, 223, 1)",
"rgba(0, 0, 191, 1)",
"rgba(0, 0, 159, 1)",
"rgba(0, 0, 127, 1)",
"rgba(63, 0, 91, 1)",
"rgba(127, 0, 63, 1)",
"rgba(191, 0, 31, 1)",
"rgba(255, 0, 0, 1)"
]);
Градиент задаёт интерпретацию интенсивности:
Heatmap Layer поддерживает обновление набора данных без пересоздания слоя.
heatmap.setData([
new google.maps.LatLng(50.4510, 30.5200),
new google.maps.LatLng(50.4550, 30.5300)
]);
Для работы с динамическими потоками данных часто используется добавление и удаление элементов массива:
const data = heatmap.getData();
data.push(new google.maps.LatLng(50.4560, 30.5310));
Heatmap Layer можно скрывать без удаления:
heatmap.setMap(null); // скрыть
heatmap.setMap(map); // показать снова
При работе с большими массивами данных Heatmap Layer может требовать оптимизации.
Heatmap Layer и marker clustering решают разные задачи:
| Подход | Назначение |
|---|---|
| Heatmap Layer | плотность распределения |
| Marker Clustering | группировка отдельных объектов |
Heatmap Layer не предназначен для интерактивного выбора отдельных точек, в отличие от кластеров.
Вес позволяет моделировать различную значимость событий.
Пример использования:
const events = [
{ location: new google.maps.LatLng(50.45, 30.52), weight: 5 },
{ location: new google.maps.LatLng(50.46, 30.53), weight: 1 }
];
Сценарии применения:
Heatmap Layer поддерживает изменение параметров без пересоздания:
heatmap.set("opacity", 0.4);
heatmap.set("radius", 30);
Это позволяет адаптировать визуализацию под пользовательские действия или изменения данных.
Heatmap Layer часто используется вместе с API серверов, возвращающих геоданные.
Типичный поток:
LatLng;fetch("/api/heatmap-data")
.then(res => res.json())
.then(points => {
const data = points.map(p =>
new google.maps.LatLng(p.lat, p.lng)
);
heatmap.setData(data);
});
Слишком большой radius приводит к потере детализации и
«размытию» структуры данных.
// некорректно
heatmap.setData([{ lat: 50, lng: 30 }]);
Создание нового Heatmap Layer вместо обновления данных приводит к лишним затратам памяти.
Изменение параметров в зависимости от zoom:
google.maps.event.addListener(map, "zoom_changed", () => {
const zoom = map.getZoom();
heatmap.set("radius", zoom * 2);
});
const filtered = data.filter(p => p.type === "incident");
heatmap.setData(filtered);
Несколько слоёв позволяют разделять типы данных:
Heatmap Layer может реагировать на изменения области просмотра:
google.maps.event.addListener(map, "idle", () => {
const bounds = map.getBounds();
// фильтрация данных по текущей области
});
Heatmap Layer эффективен для:
Неэффективен для:
При изменении zoom происходит перерасчёт:
Это обеспечивает визуальную стабильность при навигации по карте и предотвращает «разрыв» теплового слоя.