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

Jac*_*ian 7 javascript openlayers-3

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

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

//map.getOverlays().clear(); <-- also tried this, but to no effect
Run Code Online (Sandbox Code Playgroud)

而且我有一些随机行为-有时删除了所有图层,有时没有删除。这是完全随机的,因此不能保证您可以重现此问题。因此,仅从概念上了解为什么会发生就足够了。

显然这是一个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);
});
Run Code Online (Sandbox Code Playgroud)

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

Yai*_*wil 8

您应该只克隆数组:

const layers = [...map.getLayers().getArray()]
layers.forEach((layer) => map.removeLayer(layer))
Run Code Online (Sandbox Code Playgroud)


aho*_*var 6

这不是错误。您的代码无法正常工作的原因是,您正在循环遍历图层集合。这样做会改变每个图层的索引,并会导致意外的结果。

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

map.setLayerGroup(new ol.layer.Group());
Run Code Online (Sandbox Code Playgroud)


nao*_*ink -1

我不久前是这样实现的:

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

也许有帮助