来自LayerGroup的getLayers getLength是0?

时间:2018-02-01 13:14:23

标签: javascript openlayers

使用此函数,我获得了可以解析的LayerGroup列表,并识别出我想要的Group“Runs”。
在此之前它正在发挥作用。 但var length = layers.getLength始终返回0

function getActiveLayer(layerName, picID) {
  // get layerGroups
  var layers = map.getLayers();
  var length = layers.getLength(),
    l;
  for (var i = 0; i < length; i++) {
    l = layers.item(i);
    var lt = l.get('title');
    // check for layers within groups
    if (lt === 'Runs') { // Title of Group
      // get layers from Runs
      var layers = l.getLayers();
      //get length
      var length = layers.getLength(),
        l;
      if (length > 0) {
        for (var i = 0; i < length; i++) {

          l = layers.item(i);
          var lt = l.get('title');
          // check for Layer Title
          if (lt === layerName) { // Title if Layer
            var innerLayers = l.getSource().getFeatureById(picID).getGeometry().getCoordinates();
            return innerLayers;
          }
        }
      }
    }
  }


};

getLayers from map and LayerGroup

上面一个是来自地图的getLayers。 较低的是来自“运行”的getLauers。

有人可以解释为什么长度是实际的0?l

修改

我更新了代码:

 function getActiveLayer(layerName, picID) {
  // get layerGroups
  var layers = map.getLayers();
  var length = layers.getLength();
  for (var i = 0; i < length; i++) {
    l = layers.item(i);
    var lt = l.get('title');
    // check for layers within groups
    if (lt === 'Runs') { // Title of Group
      // get layers from Runs
      var layers = l.getLayers().getArray();
      //get length
      var length2 = layers.getLength();
      console.log(length2);
      if (length > 0) {
        for (var i = 0; i < length2; i++) {

          l = layers.item(i);
          var lt = l.get('title');
          // check for Layer Title
          if (lt === layerName) { // Title if Layer
            var innerLayers = l.getSource().getFeatureById(picID).getGeometry().getCoordinates();
            return innerLayers;
          }
        }
      }
    }
  }
};

的console.log(长度2);仍然是0。

2 个答案:

答案 0 :(得分:0)

var length = layers.getLength(), l;

这是一个可怕的代码,你很可能没有故意这样做。另见:comma separator 在这个位置,你可能只想从l:

获得长度

var length = l.getLength();

你构建了一个特别讨厌的片段。运行以下代码。你可能希望它循环3次 - 它没有。

javascript中没有块级别范围,只有功能级别范围,因此var x=y内的for不会仅为for块定义变量,但为整个函数定义变量。

查看变量阴影问题,explain the issue详细说明。 使用唯一的变量名称。永远不要尝试变量阴影,这是非常糟糕的做法!

function badpractice(number) {

  var length = number;
  console.log('length before loop', length);
  for(var i=0;i < length;i++){
    console.log('length before for assign', length);
    var length = i;
    console.log('length after for assign', length);
  }
  console.log('length after loop', length);
};

badpractice(3);

答案 1 :(得分:0)

我找到了解决方案。你走了:

   function getActiveLayer(layerName,picID) {
        var layers = map.getLayers();
            var length = layers.getLength();
            for (var i = 0; i < length; i++) {
                l = layers.item(i);
                var lt = l.get('title');
                // check for layers within groups
                if (lt === 'Runs') { // Title of Group
                  var layers = l.getLayers().getArray();
                  var length = l.getLayers().getArray().length;
                  // loop over layers
                    for (var i = 0; i < length; i++) {
                      l = layers[i];
                      var lt = l.get('title');
                      // check for Layer Title
                      if (lt === layerName) { // Title if Layer
                        var innerLayers = l.getSource().getFeatureById(picID).getGeometry().getCoordinates();
                        return innerLayers; // return coord of feature
                      }
                    }
                }
            }


      };