根据谷歌论坛帖子和this GIS post,我想出了一个简单而完整的解决方案。
首先,定义一个函数以获取给定缩放级别的半径(以米为单位):由于不同纬度存在缩放差异,您需要输入someLatValue,例如您计划使用的地图中心。虽然是一个近似值,但对于一个小国家大小的准确结果来说已经足够了。您还需要以米为单位指定所需的半径大小。
如果您愿意,可以更改函数以将这些值作为参数读取(例如,获取当前地图视图中心的纬度和/或基于数据属性的半径),但如果它们是静态的,这使它们成为全局变量更容易。
var someLatValue = 35.726332;
var desiredRadiusInMeters = 1500;
function getHeatmapRadius(){
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()});
fixedRadiusHeatmap.setMap(theMap);
那么每次地图缩放时都需要重新设置半径,可以这样操作:
google.maps.event.addListener(theMap, 'zoom_changed', function () {
fixedRadiusHeatmap.setOptions({radius: getHeatmapRadius()});
});
在我的情况下,它有点滞后,所以它在固定半径出现之前显示(愚蠢地聚合和考虑不周)默认热图。也许有一种方法可以延迟渲染以使过渡更平滑,但这是另一个问题。