OpenLayers 3 removeLayer 失败?
OpenLayers 3 removeLayer failure?
我一直在将 OpenLayers 2 地图应用程序转换为 OpenLayers 3。
该地图由 Javascript 代码中定义的两个图层组(基础地图和叠加层)组成。但是,当页面加载(或自动刷新)时,它会从 XML 文件中读取并动态地将要素图层加载到地图中。
那部分工作正常。我遇到的问题是例程,作为页面 auto-refresh 功能的一部分,应该删除所有 dynamically-added 层。
我的原码:
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 条目的日志来尝试解决问题。)
所以,如果我 运行 这个 as-is... "Existing layer that needs to be removed?" 的日志条目被写入 10 次,这表明有 10 层。当我查看图层 objects 时,我看到了基础地图、叠加层和其他一些图层。但实际上确实具有 "name" 属性的某些其他层完全缺失。
但是如果我 运行 这行 "map.removeLayer(layer)" 注释掉了,现在 "Existing layer" 行被写了 17 次!还有七层objects出现!
(仅供参考:短语 "title" 仍然存在,因为起初我认为问题与 'name' 属性 有关,所以我暂时尝试匹配'title' 属性 而不是...“如果标题不是 'Base maps' 或 'Overlays',则 removeLayer。但其行为方式完全相同。)
即使 .removeLayer 无法删除层,我想我不确定为什么这一切都会以某种方式中止循环 7 次迭代......到它甚至不写前两个的地步console.logs ??
谢谢!
-=戴夫=-
你可以试试
function erase_and_reload(){
map.getOverlays().clear();
map.getLayers().clear();
// reload
read_WW_xml();
}
它实际上并没有中止这 7 次迭代,它只是跳过了那些数组项。
在您的 forEach 循环中有一组对地图图层的引用。如果您获取该数组的一个元素(引用为 "layer")并按原样将其从地图中删除,则删除该引用,因此它既不在地图中也不在您的数组中,并且不小心还有另一个引用在该索引上。
所以如果你有数组:
0: layer0, 名称 "layer0"
1:layer1,名称"layer1"
2: 层 2
在这个 forEach 之后将保留
0: layer1, 名称 "layer1"
1: 层 2
因为在移除 layer0 之后,在索引 0 上有 layer1 并且在 forEach 移动之后(到索引 1),它已经找到没有名称的层。
要解决这个问题,只需使用函数 getArray()
和 slice()
(复制引用数组),例如:
var refArray = map.getLayers().getArray().slice();
ref.forEach(function(layer)
{
//your stuff
}
我一直在将 OpenLayers 2 地图应用程序转换为 OpenLayers 3。 该地图由 Javascript 代码中定义的两个图层组(基础地图和叠加层)组成。但是,当页面加载(或自动刷新)时,它会从 XML 文件中读取并动态地将要素图层加载到地图中。
那部分工作正常。我遇到的问题是例程,作为页面 auto-refresh 功能的一部分,应该删除所有 dynamically-added 层。
我的原码:
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 条目的日志来尝试解决问题。)
所以,如果我 运行 这个 as-is... "Existing layer that needs to be removed?" 的日志条目被写入 10 次,这表明有 10 层。当我查看图层 objects 时,我看到了基础地图、叠加层和其他一些图层。但实际上确实具有 "name" 属性的某些其他层完全缺失。
但是如果我 运行 这行 "map.removeLayer(layer)" 注释掉了,现在 "Existing layer" 行被写了 17 次!还有七层objects出现!
(仅供参考:短语 "title" 仍然存在,因为起初我认为问题与 'name' 属性 有关,所以我暂时尝试匹配'title' 属性 而不是...“如果标题不是 'Base maps' 或 'Overlays',则 removeLayer。但其行为方式完全相同。)
即使 .removeLayer 无法删除层,我想我不确定为什么这一切都会以某种方式中止循环 7 次迭代......到它甚至不写前两个的地步console.logs ??
谢谢!
-=戴夫=-
你可以试试
function erase_and_reload(){
map.getOverlays().clear();
map.getLayers().clear();
// reload
read_WW_xml();
}
它实际上并没有中止这 7 次迭代,它只是跳过了那些数组项。
在您的 forEach 循环中有一组对地图图层的引用。如果您获取该数组的一个元素(引用为 "layer")并按原样将其从地图中删除,则删除该引用,因此它既不在地图中也不在您的数组中,并且不小心还有另一个引用在该索引上。
所以如果你有数组:
0: layer0, 名称 "layer0"
1:layer1,名称"layer1"
2: 层 2
在这个 forEach 之后将保留
0: layer1, 名称 "layer1"
1: 层 2
因为在移除 layer0 之后,在索引 0 上有 layer1 并且在 forEach 移动之后(到索引 1),它已经找到没有名称的层。
要解决这个问题,只需使用函数 getArray()
和 slice()
(复制引用数组),例如:
var refArray = map.getLayers().getArray().slice();
ref.forEach(function(layer)
{
//your stuff
}