我正在使用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?它看起来像对象(在我的情况下是图层)缺少必需的方法,即使根据文档它应该在那里。
答案 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始终位于数组的第一个位置。