缩放事件侦听器之前的Javascript OpenLayers

缩放事件侦听器之前的Javascript OpenLayers,javascript,google-maps,openlayers,zooming,Javascript,Google Maps,Openlayers,Zooming,我试图设置OpenLayers,使其在缩放开始前不显示矢量层,并在缩放结束后重新显示矢量层。我已经建立了缩放结束部分,如下所示: map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}}); function mapEvent(event) { if(event.type == "zoomend") { hide_vector_layer(); }

我试图设置OpenLayers,使其在缩放开始前不显示矢量层,并在缩放结束后重新显示矢量层。我已经建立了缩放结束部分,如下所示:

map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}});

function mapEvent(event) {
    if(event.type == "zoomend") {
        hide_vector_layer();
        }
}
但是我没有看到任何类型的事件监听器用于文档缩放的开始。有一个“movestart”,包括移动、平移和缩放。不幸的是,我不能使用“movestart”选项,因为我不想在平移过程中图层消失。你会认为会有一个“zoomstart”,就像有一个“ZoomMend”

我之所以尝试这样做,是因为我不喜欢使用GoogleMaps作为基础层时矢量层以不同的速度缩放。它看起来是错误的,看起来所有的特征都不准确,即使它们在缩放完成后落在正确的位置


有什么建议吗?

为此,您应该覆盖OpenLayers.Map的moveTo和moveByPx方法,以消除除缩放以外的任何操作的movestart事件触发。

我遇到了与OP相同的问题,我尝试用drnextgis的解决方案来解决它。但不幸的是,它没有完全起作用::OpenLayers.Map.moveTo中的
zoomChanged
属性不仅在缩放级别更改时计算为
true
,而且在地图大小调整时也计算为
true

我的地图是用户浏览器窗口的100%,因此如果他们调整了窗口的大小,就会触发事件。这对我来说是不受欢迎的,因为我只想在缩放级别实际发生变化时触发事件。我的解决方案是创建一个名为“zoomstart”的新事件,我将其插入OpenLayers.Map.moveTo的顶部。代码如下:

var getZoom = this.getZoom();
if ( !!getZoom && !!zoom && this.isValidZoomLevel(zoom) && getZoom != zoom )
    this.events.triggerEvent("zoomstart", zoom);
这段代码将把新的缩放级别传递给注册到
zoomstart
的事件侦听器,在我的例子中,我根据新的缩放级别确定地图的限制范围并执行其他操作


和平与你同在。

这里有一个简单的方法,可以将“BeforeZoom”事件添加到OpenLayers中。只需将下面的代码添加到创建地图对象的位置

map.zoomToProxy = map.zoomTo;
map.zoomTo =  function (zoom,xy){
    //Your Before Zoom Actions

    //If you want zoom to go through call
    map.zoomToProxy(zoom,xy); 
    //else do nothing and map wont zoom
};
工作原理:

对于任何类型的缩放活动,OpenLayers API最终都会调用名为zoomTo的函数。因此,在重写它之前,我们将该函数复制到一个名为“zoomToProxy”的新函数中。我们覆盖它并添加条件缩放逻辑。如果我们想实现缩放,只需调用新的代理函数:)

Shaunak的解决方案对我来说非常有效。 我想将缩放限制在11以下,所以将他的代码编辑为

if (zoom > 11) {
    map.zoomToProxy(zoom, xy);
}
“movestart”处理“zoomstart”。要检测zoomstart是否启动,请尝试:

 map.events.register("movestart",map, function(e) {
        if(e.zoomChanged)
        {
        //zoom start code here
        }

    });

这应该作为对Shaunak答案的评论发布,而不是作为一个单独的答案发布。这种方法是有效的,但为了更安全,您应该替换map.zoomToProxy.apply函数中的行(这是参数);因此,如果他们向zoomTo添加新参数,它们也会被传递。啊,我还忘了提到OpenLayers API在实际执行缩放之前调用zoomTo,因此您可以在第一条注释之前使用代码来执行操作,就像它是一个“zoomstart”事件一样。例如,您可以防止缩放。这两方面都正确。谢谢!