1.问题介绍
在使用ol的热力图时我们会发现一种现象,当缩放地图时热力图的渲染效果会发生变化。

📌 原因:
在 OpenLayers 中,热力图的形态是由 radius
(半径)和blur
(模糊度)两个属性来决定的。而这两个属性的值都以像素为单位。
当地图缩放时,相同的像素数量在不同缩放级别下代表的实际地理范围会发生变化,从而导致热力图的视觉效果改变。
2.问题解决
🎯解决方案:
如果想要让热力图在不同的缩放级别下保持统一的效果,就需要根据当前分辨率去实时的计算半径、模糊度的像素值。
首先设置基准的半径和模糊度,基准值的单位不能再用像素,可以使用米或千米,例如我这里将期望的半径设定为30km,期望的模糊度设定为40km。
JavaScrit
const radiusKm = 30; // 半径 km
const blurKm = 40; // 模糊 km
接着在每次地图的分辨率发生变化时,计算基准半径和模糊度所对应的像素值,并设置热力图的对应参数。
需要注意最好不要直接使用分辨率来进行计算,因为你无法保证当前地图的分辨率的单位一定是米,因此要先通过projection.getMetersPreUnit()
获取当前坐标系下每个单位所对应的米数,然后将分辨率的单位转换为米。
JavaScrit
// 监听地图缩放事件,动态调整热力图参数
const updateHeatmapStyle = () => {
const resolution = window.map.getView().getResolution();
const metersPerUnit = window.map
.getView()
.getProjection()
.getMetersPerUnit();
const factor = resolution * metersPerUnit;
const adjustedBlur = (blurKm * 1000) / factor;
const adjustedRadius = (radiusKm * 1000) / factor;
// 更新热力图样式
heatLayer.setRadius(adjustedRadius);
heatLayer.setBlur(adjustedBlur);
};
// 监听地图视图变化
window.map.getView().on("change:resolution", updateHeatmapStyle);
📺最终效果:
