2016-11-29 54 views
3

我有一個大的地圖應用程序,所以要有代表性,我將不得不提供一大塊代碼。所以,這是我嘗試從地圖上刪除所有圖層:無法從地圖中刪除所有圖層

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

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

而且我有一些隨機行爲 - 有時所有層被去除,有時沒有。這是一個完全的隨機性,所以沒有保證,你將能夠重現這個問題。所以,對我來說,在概念上可能就足夠了解它爲什麼會發生。

SOLUTION

這顯然是一個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); 
}); 

也許,這是不是一個錯誤,並有一些祕密方法,可以清除地圖。但我不知道。

回答

-1

我做到這一點前一陣子這樣:

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

也許它可以幫助

+0

這樣做的結果是非常相同的行爲。我看到'catch'塊內沒有錯誤信息。 – Jacobian

+0

這使用地圖的內部屬性。永遠不要這樣做! – ahocevar

2

這是不是一個錯誤。您的代碼無法正常工作的原因是您在循環播放時正在修改圖層集合。這樣做會改變每個圖層的索引,並導致意想不到的結果。

的正確方法清除的地圖的所有層是使用ol.Map#setLayerGroup()

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

如果我們得到一個條件,在forEach中,是否沒有任何模式去除某個特定的層?你的回答是有道理的,但這不是OP所需要的。 – F3L1X79

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; 
}