获取给定特征的相应层的方法:source.Vector.getSource()不是函数

时间:2017-09-12 10:16:00

标签: angular typescript openlayers openlayers-3

我正在使用Angular和OpenLayers3在我的网络应用程序中包含一个地图。

我试图找出给定特征属于哪个层。我这样做是因为我想从地图中删除选定的特征。由于我对不同的功能有不同的层,我不能确定从哪个层移除该功能。

以下是了解此代码提取的一些重要内容:

import VectorLayer from 'ol/layer/vector';
import VectorSource from 'ol/source/vector';
import Feature from 'ol/feature';
[...]
map: ol.Map;

我的方法如下:

  get_LayerOfFeature(feature: Feature): VectorSource {
    //Iterate over all layers of the map
    for (let x of this.map.getLayers().getArray()) {
      let source: VectorSource = x.getSource();
      let features: Feature[] = source.getFeatures();
      //Iterate over all features of the vector-source
      for (let y of features) {
        if (y == feature) {
          return x;
        }
      }
    }
    //Given features does not belong to any existing vector-source
    return null;
  }

我目前的问题是编译器抱怨这一行:

let source: VectorSource = x.getSource();

它给了我以下错误:

  

财产' getSource'在' Base'

类型中不存在

问题似乎是.getLayers()返回一个Bases集合。使用.getArray()我得到一个基数数组。

然后我查看了它的文档:Openlayers Docs: Base

这个类是一个抽象类,显然不包含函数" getSource"。然而,还有子类" ol.layer.Layer"这正是我要找的。该类还包括我想要使用的getSource()方法。

我尝试了什么:

转换for-each-loop的x元素并将其保存到新变量:

let x2: VectorLayer = <VectorLayer>x;
let source: VectorSource = x2.getSource();

至少在编译期间没有抛出错误。但是,我得到以下运行时错误:

  

错误TypeError:source.getFeatures不是函数

实际问题是我没有正确地将Base-object转换为vector-source-object?它看起来像对象(在我的情况下是图层)缺少必需的方法,即使根据文档它应该在那里。

2 个答案:

答案 0 :(得分:0)

对我的评论的解释:

get_LayerOfFeature(feature: Feature): VectorSource {
  let id = feature.getId();
  for (let x of this.map.getLayers().getArray()) {
    if(x instanceof VectorLayer) {
      let source: VectorSource = x.getSource();
      let feat: Feature = source.getFeatureById(id);
      if(feat !== undefined && feat !== null) {
        return source;
      }
    }
  }
  return null;
}

答案 1 :(得分:0)

我发现了问题所在:

显然,map.getLayers() - 方法返回绑定到地图的所有图层。这意味着它也会返回tile层。此图块层为ol.layer.Tile

此类不包含getSource()方法。为了解决这个问题,我确保这个tile-layer不包含在for-each-loop中:

  get_LayerOfFeature(feature: Feature): VectorSource {

    let featureArray: Feature[] = this.map.getLayers().getArray();
    for(var i = 1; i<featureArray.length; i++ ) {
      let source = featureArray[i].getSource();
      for(let x of source.getFeatures()) {
        if(x==feature) {
          console.log(featureArray[i]);
          return featureArray[i]
        }
      }
    }
    return null;
  }

从列表的第二个条目开始可能不是一个非常好的解决方案,因为不必对返回的数组进行排序。就我而言,Tile-Layer始终位于数组的第一个位置。