На основе сообщения на форуме группы Google и этой ГИС post, я придумал простое, но полное решение в том же духе.
Во-первых, определите функцию для получения радиуса в метрах для данного уровня масштабирования: поскольку существуют различия в масштабировании для разных широт, вам нужно ввести someLatValue
, например, центр карты, которую вы планируете использовать. Хотя это приближение, этого будет достаточно для получения точных результатов вплоть до размера небольшой страны. Вам также необходимо указать размер желаемого радиуса в метрах.
Вы можете изменить функцию для чтения этих значений в качестве параметров, если хотите (например, получить широту центра текущего вида карты и/или радиус на основе свойства данных), но если они статичны, это делает их глобалы проще.
var someLatValue = 35.726332;
var desiredRadiusInMeters = 1500;
function getHeatmapRadius(zoomLevel){
metersPerPx = 156543.03392 * Math.cos(someLatValue * Math.PI / 180) / Math.pow(2,theMap.getZoom());
return desiredRadiusInMeters / metersPerPx;
};
Это возвращает (приблизительный) радиус в пикселях для желаемого количества метров и уровня масштабирования вокруг определенной широты. Значение 156543.03392
основано на приблизительном радиусе Земли, который Google фактически использует для Карт Google.
Итак, скажем, у вас есть такая тепловая карта:
fixedRadiusHeatmap = new google.maps.visualization.HeatmapLayer({
data: myCoords,
map: theMap
});
Чтобы установить начальный вид, просто вызовите функцию перед добавлением тепловой карты на карту.
fixedRadiusHeatmap.setOptions({radius: getHeatmapRadius(theMap.getZoom())});
fixedRadiusHeatmap.setMap(theMap);
Затем нужно сбрасывать радиус каждый раз при масштабировании карты, что можно сделать так:
google.maps.event.addListener(theMap, 'zoom_changed', function () {
fixedRadiusHeatmap.setOptions({radius: getHeatmapRadius(theMap.getZoom())});
});
В моем случае он немного отстает, поэтому показывает (тупо агрегированную и плохо продуманную) тепловую карту по умолчанию до того, как появится карта с фиксированным радиусом. Возможно, есть способ отложить рендеринг, чтобы сделать переход более плавным, но это другая проблема.
person
Aaron Bramson
schedule
25.01.2019