【问题标题】:Clear WMS layer before redraw on OpenLayers在 OpenLayers 上重绘之前清除 WMS 图层
【发布时间】:2011-02-10 16:30:08
【问题描述】:

我目前正在使用 OpenLayers(Vector 和 WMS)成功显示多个图层。 我的应用程序允许用户修改一些参数,这将:
* 修改绑定
* 修改地图中心
* 修改WMS图片
我使用 Ajax 来避免页面重新加载,它工作得很好,但是当某些图层需要一段时间才能加载时,其他尚未重绘的图层仍会显示在背景中(但与我的新上下文完全无关)。 我想在重新向服务器请求新图像之前清除 WMS 图层(如果可能的话),但还没有找到任何东西。 我通过调用 removeAllFeature(); 在矢量图层上执行此操作;

感谢您的帮助!

这是我点击按钮时的伪代码:

$.getJSON("url/updateMapConfig.php",
    {  
      data: $(this).serialize() ,   
      ajax: 'true',   
      cache: 'false'  
    },   
    function(j){  
      if (j.result == 'ok') {  
        var layersToShow = [];  
        // Refresh vector layer  
        for(var i=0;i<map.layers.length;i++) {  
          if (map.layers[i].isVector) {  
            map.layers[i].removeAllFeatures();  
            map.layers[i].refresh({force:true}); // Vector layer  
          }   
        }  
        // Refresh visible layers  
        for(var i=0;i<map.layers.length;i++) {  
          if (map.layers[i].visibility && !map.layers[i].isBaseLayer && !map.layers[i].isVector) { // Refresh visible non base  
              map.layers[i].redraw(true); // Other layer  
          }  
        }  
        // Set new bounds  
        var bounds = new OpenLayers.Bounds();  
          bounds.extend(new OpenLayers.LonLat(j.bounds.xmin-100, j.bounds.ymin-100));  
          bounds.extend(new OpenLayers.LonLat(parseInt(j.bounds.xmax)+100, parseInt(j.bounds.ymax)+100));  
        map.zoomToExtent(bounds);  
        // Move to destination point  
        if (j.poiCenter != "") {  
          eval("map.setCenter(new OpenLayers.LonLat("+j.poiCenter+"))");  
        }  
      }  
    }  
);  

【问题讨论】:

    标签: javascript openlayers layer wms


    【解决方案1】:

    我会使用mergeNewParams 设置一个参数,使图层绘制为空白。该方法触发图层的重绘。当您的回调从您的更新请求返回时,您执行相反的操作以使其再次正确绘制图层。

    (我做过类似的事情,但我暂时没有源代码)

    编辑:

    或者 - 当然 - 使用图层的visibility 属性隐藏图层。 :-)

    【讨论】:

    • 谢谢,我试着做:map.layers[i].setVisibility(false); map.layers[i].setVisibility(true);然而,在重新绘制之前,该层仍然存在,这很奇怪。我会试试 mergeNewParams
    • 也许你必须在设置可见性时强制重绘?虽然看起来不太可能......
    • 更仔细地查看您的代码,我没有看到任何清除或隐藏栅格图层的代码。您的 function(j) 是成功处理程序,但是您在哪里刷新地图配置?也许我没有得到这个......
    • 从技术上讲,我的 WMS 服务器使用用户 SESSION 中的数据生成,因此我发送了一个修改用户 SESSION 的 Ajax 请求。完成后,我只需重新绘制图层 ("for(var i=0;i
    • 好的。但我看不到任何试图在 redraw() 调用之前隐藏图层的代码。你在哪里做的?
    【解决方案2】:

    在重绘它们之前,我终于在每一层上使用 clearGrid() 函数找到了一个美好的结局。

    我还发现,如果有任何正在运行的图块加载,此功能将停止。 示例我有两个基础层:EmptyLayer 和 WhatTiledBGLayer。 如果加载 WhatTiledBGLayer 切片需要 20 秒,即使用户选择切换到空图层,我也可以看到对服务器的请求已完成,以获取 WhatTiledBGLayer 上的剩余切片。

    只需调用 WhatTiledBGLayer.clearGrid() 将停止请求图层。

    感谢您的帮助。

    【讨论】:

      【解决方案3】:

      您可以监听 WMS 层的 loadstart 和 loadend 事件并相应地隐藏/显示层。

      快速测试表明,您不能在加载启动时将图层的可见性设置为 false,因为 OpenLayers 将停止为图层请求新图像,并且永远不会完全加载。您可以尝试使用 layer.display(false/true) 并查看它是否可以解决您的问题。代码应如下所示:

        yourWmsLayer.events.on({
              "loadstart" : function(){
                  this.display(false);
              },
              "loadend" : function(){
                  this.display(true);
              } 
          });
      

      顺便说一句,如果您没有在 WMS 图层上将 transitionEffect 设置为“调整大小”,则默认行为是在加载新图像之前删除旧图像。这不是你想要的吗?

      【讨论】:

      • 感谢您的回答,我没有transitionEffect,但旧图像没有被删除,我会尝试 Niklas 解决方案,然后再尝试您的解决方案,如果它不能解决问题。
      • 好的,我尝试了两种解决方案,但行为没有改变,但是我发现我的问题解释不好。实际上,图层是隐藏的,然后触发 loadend 事件,图层重新出现。但是在图层显示新图像(1000x600)之前,事件发生后需要一段时间。在此期间会显示旧图像的一部分。
      • 那么您可以尝试添加一个计时器,以便在 loadend 触发后几秒钟设置 this.display(true)。 loadend 回调中的类似内容 - setTimeout("this.display(true)", 3000);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多