【问题标题】:Unable to remove all layers from a map无法从地图中删除所有图层
【发布时间】:2016-11-29 09:53:00
【问题描述】:

我有一个大型地图应用程序,因此为了具有代表性,我只需要提供一小段代码。所以,这就是我尝试从地图中删除所有图层的方式:

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

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

而且我有一些随机行为 - 有时所有图层都被删除,有时没有。这是完全随机的,因此无法保证您能够重现此问题。所以,对我来说,仅仅从概念上知道它为什么会发生就足够了。

解决方案

这显然是一个 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);
});

这可能不是错误,并且有一些秘密方法可以清除地图。但我不知道。

【问题讨论】:

    标签: javascript openlayers-3


    【解决方案1】:

    这不是错误。您的代码不起作用的原因是因为您在循环时修改了图层集合。这样做会改变每一层的索引,并会导致意想不到的结果。

    清除地图所有图层的正确方法是使用ol.Map#setLayerGroup()

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

    【讨论】:

    • 如果我们有条件,在forEach中是否有任何模式可以删除某些特定层?您的回答是有道理的,但这并不是 OP 所需要的。
    【解决方案2】:

    你应该克隆数组:

    const layers = [...map.getLayers().getArray()]
    layers.forEach((layer) => map.removeLayer(layer))
    

    【讨论】:

      【解决方案3】:

      您可以使用 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;
      }
      

      【讨论】:

        【解决方案4】:

        我不久前通过这种方式实现了这一点:

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

        也许有帮助

        【讨论】:

        • 这会导致相同的行为。我在catch 块内没有看到任何错误消息。
        • 这使用地图的内部属性。永远不要那样做!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        相关资源
        最近更新 更多