我目前正在使用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+"))");
}
}
}
);
答案 0 :(得分:1)
我会使用mergeNewParams来设置一个使图层绘制为空白的参数。该方法触发重绘图层。当您的回调从更新请求返回时,您会执行相反操作以使其再次正确地绘制图层。
(我已经做了类似的事,但我现在没有这个来源)
编辑:
或 - 当然 - 使用图层的visibility属性隐藏图层。 : - )
答案 1 :(得分:1)
在重新绘制之前,我终于在每个图层上使用clearGrid()函数找到了一个快乐的结局。
我还发现如果有任何正在运行,此函数将停止平铺加载。 示例我有两个基础层:EmptyLayer和WhateverTiledBGLayer。 如果花费20秒来加载WhateverTiledBGLayer磁贴,即使用户选择切换到空图层,我也可以在WhateverTiledBGLayer上看到对服务器的剩余磁贴请求。
简单地调用WhateverTiledBGLayer.clearGrid()将停止请求图层。
感谢您的帮助。
答案 2 :(得分:0)
您可以收听WMS图层的loadstart和loadend事件并相应地隐藏/显示图层。
快速测试表明,您无法在loadstart上将图层的可见性设置为false,因为OpenLayers将停止为图层请求新图像,并且永远不会完全加载。您可以尝试使用layer.display(false / true)并查看它是否解决了您的问题。代码看起来像这样:
yourWmsLayer.events.on({ "loadstart" : function(){ this.display(false); }, "loadend" : function(){ this.display(true); } });
顺便说一句,如果你没有在你的WMS图层上将transitionEffect设置为“resize”,那么默认行为是在加载新图像之前删除旧图像。这不是你想要的吗?