如何在openlayers中将缩放级别限制为整数

如何在openlayers中将缩放级别限制为整数,openlayers,openlayers-3,Openlayers,Openlayers 3,我正在开发谷歌地图和openlayers 4之间的集成。我把我的工作建立在这个基础上 我的问题是,在ol 3和ol 4.4.2之间的某个地方,change:resolution事件的行为发生了变化。在此代码之前 view.on('change:resolution', () => { console.log(view.getZoom()) }) 每次鼠标滚轮旋转仅调用一次并记录(例如): 现在它产生了这样的东西: 4.017277252772164 4.08563754449

我正在开发谷歌地图和openlayers 4之间的集成。我把我的工作建立在这个基础上

我的问题是,在ol 3和ol 4.4.2之间的某个地方,
change:resolution
事件的行为发生了变化。在此代码之前

view.on('change:resolution', () => {
    console.log(view.getZoom())  
})
每次鼠标滚轮旋转仅调用一次并记录(例如):

现在它产生了这样的东西:

4.017277252772164
4.08563754449778
4.152661471658049
4.522609511830051
4.691606503462093
4.793368457643155
4.891103916717288
4.980192777999678
4.999621855713164
5
因此,当我尝试在谷歌地图和openlayers之间同步缩放时(如示例中所示),它会导致谷歌地图在每次缩放时闪烁。谷歌地图似乎不支持缩放的分数

我可以将openlayer缩放值限制为整数,还是进行一些处理


在调用Google Map.setZoom时,我尝试使用openlayers zoom的ceil/floor值,但由于缩放也涉及到中心位置的变化,因此会导致不平稳、不愉快的行为。

在收缩缩放时,默认行为是为了更好地支持平板电脑和触摸板

interactions: ol.interaction.defaults({mouseWheelZoom: false}).extend([
      new ol.interaction.MouseWheelZoom({
        constrainResolution: true // force zooming to a integer zoom
      })
    ])

对于任何想解决此问题的人,我解决此问题的方法是将默认缩放交互的
zoomDuration
设置为0,并结合
constraintResolution
属性

中间缩放级别来自用于从一个级别缩放到另一个级别的动画(动画的默认持续时间为250ms)。通过使用
constraintResolution
可以确保您有一个可由Google Map使用的整数值,通过将
zoomDuration
设置为0,可以删除导致
更改:分辨率处理程序中分数值的动画

在没有动画的情况下,结果会有一点突然,但这样OpenLayers和Google Map之间就不会有任何奇怪的行为了

我正在使用OpenLayers 6.5.0,但我想它也可以使用早期版本。以下是工作代码:

从“ol/interaction”导入{defaults};
// ...
this.view=新视图({
// ...
决议:是的,
});
const olMap=新映射({
目标:“地图”,
控件:[],
图层:[],
视图:this.view,
交互:默认值({zoomDuration:0}),
});

它似乎无法解决我的问题。是的,zoom的最终值是一个整数,但我仍然得到分数之间的值。使用
map.on('moveend',()=>{console.log(map.getView().getZoom())})
缩放结束后,您需要的不是分辨率更改,因为它在缩放级别之间设置动画。只有在openlayers动画结束后,我才能启动google map zoom动画,它看起来比我现在拥有的更奇怪
interactions: ol.interaction.defaults({mouseWheelZoom: false}).extend([
      new ol.interaction.MouseWheelZoom({
        constrainResolution: true // force zooming to a integer zoom
      })
    ])