1

我目前正在使用 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+"))");  
        }  
      }  
    }  
);  
4

3 回答 3

2

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

(我做过类似的事情,但我现在没有来源)

编辑:

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

于 2011-02-10T17:21:10.017 回答
1

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

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

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

感谢帮助。

于 2011-02-22T16:10:57.990 回答
0

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

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

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

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

于 2011-02-11T07:54:42.830 回答