OpenLayers 3 removeLayer失败?

时间:2016-10-19 15:17:05

标签: javascript openlayers-3

我一直在将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 = -

2 个答案:

答案 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();
}