【问题标题】:Javascript OpenLayers before zoom event listener缩放事件侦听器之前的 Javascript OpenLayers
【发布时间】:2012-06-26 05:57:52
【问题描述】:

我正在尝试将 OpenLayers 设置为在缩放开始之前不显示矢量图层,并使其在缩放结束后重新出现。我已经像这样建立了缩放结束部分:

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

function mapEvent(event) {
    if(event.type == "zoomend") {
        hide_vector_layer();
        }
}

但我没有看到任何类型的事件侦听器开始放大文档。有一个“movestart”,涵盖了移动、平移和缩放。不幸的是,我不能使用“movestart”,因为我不希望图层在平移过程中消失。你会认为会有一个“zoomstart”,因为有一个“zoomend”。

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

有什么建议吗?

【问题讨论】:

    标签: javascript google-maps openlayers zooming


    【解决方案1】:

    这是一个很容易将 '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”的新函数中。我们覆盖它并添加我们的条件缩放逻辑。如果我们想要缩放发生,我们只需调用新的代理函数:)

    【讨论】:

    • 这种方法有效,但为了更安全,您应该将函数内的行替换为 map.zoomToProxy.apply(this, arguments);因此,如果他们向 zoomTo 添加新参数,它们也会被传递。
    • 啊,我还忘了提到 OpenLayers API 在实际执行缩放之前调用 zoomTo,因此您可以使用第一条评论之前的代码来执行操作,就好像它是一个“缩放启动”事件一样。例如,您可以防止发生缩放。
    • 两方面都对。谢谢!
    【解决方案2】:

    “movestart”处理“zoomstart”。要检测是否缩放开始,请尝试:

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

    【讨论】:

      【解决方案3】:

      “Shaunak”的解决方案对我来说效果很好。 我想将缩放限制在 11 以下,所以将他的代码编辑为

      if (zoom > 11) {
          map.zoomToProxy(zoom, xy);
      }
      

      【讨论】:

      • 这应该作为对 Shaunak 答案的评论发布,而不是作为单独的答案。
      【解决方案4】:

      我遇到了与 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 的事件侦听器,在我的情况下,我确定地图的限制范围并根据新的缩放级别执行其他操作。

      愿你们平安。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-27
          • 1970-01-01
          • 1970-01-01
          • 2020-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-05
          相关资源
          最近更新 更多