Взвешенные точки представляют собой расширение стандартной модели географических данных, в которой каждому координатному объекту сопоставляется числовой коэффициент значимости. В контексте Google Maps JavaScript API этот подход позволяет отображать плотность, интенсивность или приоритет пространственных данных не только через количество объектов, но и через их вклад в итоговую визуализацию.
Каждая точка задаётся как пара:
Формально:
где w — вес, отражающий силу влияния точки.
В отличие от классического набора маркеров, где каждая точка эквивалентна любой другой, взвешенные данные вводят непрерывную шкалу значимости.
В Google Maps API взвешенные точки чаще всего реализуются через слой визуализации тепловых карт:
google.maps.visualization.HeatmapLayerОсновная структура данных:
const weightedData = [
{ location: new google.maps.LatLng(43.238949, 76.889709), weight: 2 },
{ location: new google.maps.LatLng(43.256540, 76.928480), weight: 5 },
{ location: new google.maps.LatLng(43.277500, 76.895600), weight: 1 }
];
Каждый объект включает:
location — географическая точкаweight — числовая интенсивностьСоздание карты и подключение слоя визуализации выполняется через
стандартный объект google.maps.Map и
HeatmapLayer.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 43.238949, lng: 76.889709 },
zoom: 12
});
const heatmap = new google.maps.visualization.HeatmapLayer({
data: weightedData,
radius: 20,
opacity: 0.6
});
heatmap.setMap(map);
Параметры слоя:
Вес определяет интенсивность воздействия точки на окружающее пространство. Внутри тепловой карты каждая точка формирует распределение плотности, обычно описываемое гауссовым ядром:
В простейшем виде вклад точки можно представить как:
I(d) = w * exp(-d² / (2σ²))
где:
w — вес точкиd — расстояние до пикселяσ — параметр сглаживанияПри работе с реальными данными веса часто имеют несопоставимые масштабы. Например:
Для корректного отображения применяется нормализация:
w' = (w - w_min) / (w_max - w_min)
После нормализации значения приводятся к диапазону
[0, 1], что обеспечивает корректную визуальную
интерпретацию.
Google Maps API позволяет обновлять данные тепловой карты без пересоздания слоя:
const pointArray = new google.maps.MVCArray(weightedData);
const heatmap = new google.maps.visualization.HeatmapLayer({
data: pointArray
});
// обновление веса
pointArray.push({
location: new google.maps.LatLng(43.25, 76.90),
weight: 10
});
Изменение массива автоматически приводит к перерасчёту визуализации.
Дополнительный уровень управления достигается через глобальный коэффициент интенсивности:
heatmap.set("intensity", 2.5);
Этот параметр масштабирует вклад всех точек одновременно, не изменяя исходные веса.
Взвешенные точки могут быть представлены не только тепловыми картами, но и маркерами с динамическими параметрами.
Пример масштабирования радиуса маркера:
const marker = new google.maps.Circle({
strokeColor: "#FF0000",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#FF0000",
fillOpacity: 0.35,
map,
center: { lat: 43.238949, lng: 76.889709 },
radius: weight * 100
});
Такой подход используется при необходимости дискретного отображения значений.
При большом количестве точек используется кластеризация. В стандартной реализации Google Maps MarkerClusterer учитывает только количество объектов, однако взвешенные данные требуют расширенной логики.
Обобщённый подход:
W_cluster = Σ w_i
Это позволяет отображать не плотность объектов, а их совокупную значимость.
Взвешенные данные часто фильтруются по пороговому значению:
const filtered = data.filter(point => point.weight >= 5);
Такой подход используется для:
При обработке тысяч и миллионов точек возникают ограничения:
Оптимизационные методы:
Часто применяется разбиение карты на сетку:
cell_weight = Σ w_i in cell
Такой подход уменьшает количество визуальных элементов и повышает стабильность рендеринга.
Для более плавной картины применяется интерполяция между точками. Используются методы:
Общий принцип IDW:
V(x) = Σ (w_i / d_i^p) / Σ (1 / d_i^p)
где p — коэффициент влияния расстояния.
Взвешенные точки могут комбинироваться с другими слоями Google Maps:
Это позволяет строить сложные аналитические карты, где весовые данные интерпретируются в контексте инфраструктуры.
В некоторых сценариях веса преобразуются в категории:
Каждая категория отображается отдельной визуальной схемой, что уменьшает когнитивную нагрузку при интерпретации данных.
Параметр радиуса напрямую влияет на визуальную плотность:
heatmap.set("radius", 40);
Взвешенные точки часто служат основой для:
Сами данные становятся входом для последующих вычислительных процессов, а не только визуальным слоем.
При потоковых данных используется постоянное обновление массива:
setInterval(() => {
pointArray.push({
location: new google.maps.LatLng(randomLat(), randomLng()),
weight: Math.random() * 10
});
}, 1000);
Это позволяет отображать динамические процессы:
Вес может отражать различные метрики:
Таким образом, одна и та же географическая структура может интерпретироваться в разных аналитических контекстах без изменения координатной базы.