无法从地图中删除所有图层

时间:2016-11-29 09:53:01

标签: javascript openlayers-3

我有一个大的地图应用程序,所以为了代表我将只提供一大块代码。所以,这就是我尝试从地图中删除所有图层的方式:

map.getLayers().forEach(function (layer) {
    map.removeLayer(layer);
});

//map.getOverlays().clear(); <-- also tried this, but to no effect

我有一些随机行为 - 有时候所有图层​​都被移除,有时候不会。它是完全随机的,因此无法保证您将能够重现此问题。所以,我可能只是在概念上知道它为什么会发生。

这显然是一个ol3错误,因为如果我循环并删除两次,那么它就会开始工作:

map.getLayers().forEach(function (layer) {
    map.removeLayer(layer);
});
//for some crazy reason I need to do it twice.
map.getLayers().forEach(function (layer) {
    map.removeLayer(layer);
});

可能它不是一个错误,并且有一些秘密方法可以清除地图。但我不知道。

4 个答案:

答案 0 :(得分:5)

这不是错误。您的代码不起作用的原因是因为您在循环遍历它时修改了图层集合。这样做会更改每个图层的索引,并会导致意外结果。

清除地图所有图层的正确方法是使用ol.Map#setLayerGroup()

map.setLayerGroup(new ol.layer.Group());

答案 1 :(得分:2)

您应该克隆数组:

const layers = [...map.getLayers().getArray()]
layers.forEach((layer) => map.removeLayer(layer))

答案 2 :(得分:0)

您可以使用while循环来执行此操作并检查图层数组的长度,因为每次删除图层时都会重新排列它们,因此这就是forEach不起作用的原因,请尝试

var layerArray, len, layer;
layerArray = map.getLayers().getArray(),
len = layerArray.length;
while (len > 0){
    layer = layerArray[len-1];
    map.removeLayer(layer);
    len = layerArray.length;
}

答案 3 :(得分:-1)

我刚才这样做了:

for(i in map._layers){
    if(map._layers[i]._path != undefined) {
        try{ map.removeLayer(map._layers[i]) }catch(e){  }
    }
}

也许有帮助