Javascript OpenLayers 3 removeLayer失败?

Javascript OpenLayers 3 removeLayer失败?,javascript,openlayers-3,Javascript,Openlayers 3,我一直在将OpenLayers 2地图应用程序转换为OpenLayers 3。 映射由Javascript代码中定义的两个组层(基本映射和覆盖)组成。但是,当页面加载(或自动刷新)时,它会从XML文件中读取内容,并将要素层动态加载到地图中 那部分很好用。我遇到的问题是,作为页面自动刷新功能的一部分,例程应该删除所有动态添加的层 我的原始代码: 函数擦除和重新加载(){ log(“已启动擦除和重新加载!”); map.getLayers().forEach(函数(层){ log(“需要删除的现有

我一直在将OpenLayers 2地图应用程序转换为OpenLayers 3。 映射由Javascript代码中定义的两个组层(基本映射和覆盖)组成。但是,当页面加载(或自动刷新)时,它会从XML文件中读取内容,并将要素层动态加载到地图中

那部分很好用。我遇到的问题是,作为页面自动刷新功能的一部分,例程应该删除所有动态添加的层

我的原始代码:

函数擦除和重新加载(){
log(“已启动擦除和重新加载!”);
map.getLayers().forEach(函数(层){
log(“需要删除的现有层:”;
控制台日志(层);
var name=layer.get('name');
var title=layer.get('title');
console.log(“层名称=“+name+”层标题=“+title”);
如果(姓名){
console.log(“找到名为=“+name”的层);
log(“删除名为:“+name”的层);
map.removeLayer(层);
}
});
//重新装载
读取_WW_xml();
}
您可以试试

function erase_and_reload(){
   map.getOverlays().clear();
   map.getLayers().clear();

   // reload
   read_WW_xml();
}

它实际上并没有中止这7次迭代,只是跳过了那些数组项

在forEach循环中,有一个映射层的引用数组。如果您获取该数组的一个元素(引用是“层”)并按原样从映射中删除它,则会删除该引用,因此它不再位于映射中或数组中,并且意外地在该索引上存在另一个引用

因此,如果您有数组:

0:layer0,名称为“layer0”

1:第1层,名称为“第1层”

2:第2层

在这场战争之后,还将继续存在

0:layer1,名称为“layer1”

1:第2层

因为在删除layer0之后,索引0上有layer1,然后forEach移动(到索引1),在那里它已经找到了没有名称的层

要解决这个问题,只需使用函数
getArray()
slice()
(复制引用数组),类似于:

var refArray = map.getLayers().getArray().slice();
ref.forEach(function(layer)
{
  //your stuff
}

你试过使用
map.getOverlays().clear()吗
map.getLayers().clear()?如果我执行“layer.getSource().clear();”。。。。但绕过标题为“底图”和“覆盖图”的图层(因此,绕过其嵌套图层)。。。这似乎可以有效地删除每个图层的特征,以便重新绘制。但是,下一次页面刷新是否需要一个给定的动态fed层可以改变。所以,如果我运行这个程序几天,可能会有不必要的层堆积。我希望removeLayer能工作!嗯,我不想浪费资源重画底图图层组和覆盖图层组。这些都不会改变。map.getLayers().clear()似乎会擦除所有层。。。一切似乎都在运转!非常感谢你的解释!