Angular 方法获取给定功能的对应层:source.Vector.getSource()不是函数

Angular 方法获取给定功能的对应层:source.Vector.getSource()不是函数,angular,typescript,openlayers,openlayers-3,Angular,Typescript,Openlayers,Openlayers 3,我正在使用Angular和OpenLayers3在我的web应用程序中包含地图 我试图找出给定特征属于哪一层。我这样做是因为我想从地图中删除选定的要素。由于我有不同的层用于不同的功能,我不能太确定我必须从哪个层删除功能 以下是理解此代码摘录的几行重要内容: import VectorLayer from 'ol/layer/vector'; import VectorSource from 'ol/source/vector'; import Feature from 'ol/feature';

我正在使用Angular和OpenLayers3在我的web应用程序中包含地图

我试图找出给定特征属于哪一层。我这样做是因为我想从地图中删除选定的要素。由于我有不同的层用于不同的功能,我不能太确定我必须从哪个层删除功能

以下是理解此代码摘录的几行重要内容:

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();
它给了我以下错误:

类型“Base”上不存在属性“getSource”

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

然后我看了一下它的文档:

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

我尝试的是:

为每个循环强制转换x元素并将其保存到新变量:

let x2: VectorLayer = <VectorLayer>x;
let source: VectorSource = x2.getSource();
设x2:VectorLayer=x;
let source:VectorSource=x2.getSource();
至少在编译过程中没有抛出错误。但是,我得到以下运行时错误:

错误类型错误:source.getFeatures不是函数


问题是我没有正确地将基本对象强制转换为向量源对象吗?看起来该对象(在我的例子中是图层)缺少所需的方法,即使根据文档它应该在那里。

我的注释说明:

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;
}

我发现了问题所在:

显然,map.getLayers()方法返回绑定到映射的所有层。这意味着它还返回平铺层。此瓷砖层是一个

此类不包括getSource()方法。为了修复它,我确保该瓷砖层不包括在for each循环中:

  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;
  }
get\u LayerOfFeature(feature:feature):矢量源{
让featureArray:Feature[]=this.map.getLayers().getArray();

对于(var i=1;iSeems,比如在
VectorSource
上还应该有一个
getFeatureById(id)
函数,这意味着您应该能够跳过第二个
循环,只需执行
source.getFeatureById(feature.getId());
。如果(VectorLayer的x实例){…},可能需要执行
?编译器仍然抱怨“x.getSource()”-部分。它说:属性“getSource”在类型“Base”上不存在。@MirkoR.That's wierd.。在检查
{…}
中的
实例时,它应该知道类型。