我一直在将OpenLayers 2地图应用程序转换为OpenLayers 3。 该地图由两个在Javascript代码中定义的组图层(基本地图和叠加层)组成。但是,当页面加载(或自动刷新)时,它会从XML文件中读取并动态地将多个要素加载到地图中。
那部分一切正常。我遇到的问题是,作为页面自动刷新功能的一部分,应该删除所有动态添加的图层。
我的原始代码:
function erase_and_reload(){
console.log("erase_and_reload has fired!");
map.getLayers().forEach(function(layer){
console.log("Existing layer that needs to be removed ?:");
console.log(layer);
var name = layer.get('name');
var title = layer.get('title');
console.log("layer name = " + name + " layer title = " + title);
if (name){
console.log("Found layer named = " + name);
console.log("Removing layer named: " + name);
map.removeLayer(layer);
}
});
// reload
read_WW_xml();
}
(是的,我在这里有一个console.log条目的日志,试图解决问题。)
所以,如果我按原样运行...“需要删除的现有层的日志条目?”写了10次,告诉我有10层。当我查看图层对象时,我会看到Base Maps one,Overlays one和其他几个。但实际上确实具有“名称”属性的某些其他层完全缺失。
但是如果我用“map.removeLayer(layer)”这一行注释掉,现在“现有层”行被写了17次!再出现七个图层对象!
(仅供参考:“标题”仍然在那里,因为起初我认为问题与'name'属性有关,所以我暂时尝试匹配'title'属性而不是...... “如果标题不是'Base maps'或'Overlays',那么removeLayer。但是表现完全相同。)
即使.removeLayer未能删除该层,我想我也不确定为什么这一切都会以某种方式中止循环7次迭代......直到它甚至没有写出前两个控制台。日志??
谢谢!
- = Dave = -
答案 0 :(得分:3)
它实际上并没有中止这7次迭代,它只是跳过那些数组项。
在forEach循环中,有一组对地图图层的引用。如果您获取该数组的元素(引用是"图层")并将其从地图中删除,则删除引用,因此它既不在地图中也不在数组中,并且意外地在那里是该指数的另一个参考。
所以如果你有数组:
0:layer0,name" layer0"
1:layer1,name" layer1"
2:layer2
在此之后,每个人都将保留
0:layer1,name" layer1"
1:layer2
因为在删除layer0之后,索引0上有layer1,而且forEach后移动(到索引1),它已经找到了没有名称的图层。
要解决这个问题,只需使用函数getArray()
和slice()
(复制引用数组),就像这样:
var refArray = map.getLayers().getArray().slice();
ref.forEach(function(layer)
{
//your stuff
}
答案 1 :(得分:0)
你可以尝试
function erase_and_reload(){
map.getOverlays().clear();
map.getLayers().clear();
// reload
read_WW_xml();
}