Javascript 在OpenLayers上重新绘制之前清除WMS层

Javascript 在OpenLayers上重新绘制之前清除WMS层,javascript,openlayers,layer,wms,Javascript,Openlayers,Layer,Wms,我目前正在使用OpenLayers(Vector和WMS)成功显示多个层。 我的应用程序允许用户修改一些参数,这将: *修改绑定 *修改地图中心 *修改WMS图像 我使用Ajax来避免重新加载页面,它工作得很好,但是当一些层需要一段时间才能加载时,其他尚未重新绘制的层仍然显示在背景中(但与我的新上下文完全无关)。 我想在重新向服务器请求新映像之前清除WMS层(如果可能),但还没有找到任何内容。 我通过调用removeAllFeature()在向量层上实现这一点 谢谢你的帮助 以下是用户单击按钮时

我目前正在使用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+"))");  
        }  
      }  
    }  
);  
$.getJSON(“url/updateMapConfig.php”,
{  
数据:$(this).serialize(),
阿贾克斯:“真的”,
缓存:“false”
},   
函数(j){
如果(j.result='ok'){
var layersToShow=[];
//刷新向量层
对于(var i=0;i我将使用设置一个参数,使图层为空。该方法触发图层的重画。当您的更新请求返回回调时,您将执行相反的操作,使其再次正确绘制图层

(我做过类似的事情,但目前还没有消息来源)

编辑:


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

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

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


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

在重新绘制之前,我终于在每一层上使用clearGrid()函数找到了一个圆满的结局

我还发现,如果正在运行,该函数将停止加载磁贴。 示例I有两个基本层:EmptyLayer和WhateverTiledBGLayer。 如果加载WhateverTiledBGLayer磁贴需要20秒,即使用户选择切换到空层,我也可以看到服务器对WhateverTiledBGLayer上剩余磁贴的请求

只需调用WhateverTiledBGLayer.clearGrid()将停止请求层


谢谢您的帮助。

谢谢您的回答,我没有过渡效果,但是旧图像没有被删除,我将尝试Niklas解决方案,如果它不起作用,然后再尝试您的解决方案。好的,我尝试了两种解决方案,行为没有改变,但是我发现我的问题解释不好。事实上,层是隐藏的,然后加载结束事件被触发,层重新出现。但事件发生后需要一段时间,层才会显示新图像(1000x600)。在此期间,会显示旧图像的一部分。然后,您可以尝试添加计时器,以便进行设置。在loadend触发数秒后显示(true)。类似于loadend回调内的内容-setTimeout(“this.display(true)”,3000);谢谢,我尝试过:map.layers[I].setVisibility(false);map.layers[I].setVisibility(true);但图层仍然保留,直到重新绘制为止,这已经够奇怪了。我将尝试MergeNewParams,因为在设置可见性时可能需要强制重新绘制?尽管看起来不太可能……但仔细查看代码,我看不到任何清除或隐藏光栅图层的代码。您的函数(j)是成功处理程序,但是你在哪里刷新地图配置?也许我没有得到这个…从技术上讲,我的WMS服务器使用用户会话中的数据生成,所以我发送一个Ajax请求来修改用户会话。一旦它完成了,我只需重新绘制层(“for(var I=0;iOk。但是我看不到任何代码试图在重新绘制()之前隐藏层)打电话,你在哪里做的?
  yourWmsLayer.events.on({
        "loadstart" : function(){
            this.display(false);
        },
        "loadend" : function(){
            this.display(true);
        } 
    });