如何在Openlayers 3中从要素中获取图层?

14

我在选择事件的特征中找不到从中获取其所属图层的方法,而不必遍历所有地图图层的所有特征,或者在每个创建的特征中存储一个人工图层ID。这是目前不可能实现的吗?

ol.js 3.7.0 ol.interaction.Selection -> click -> callback( event ){ event.selected[0] }

在我的应用程序的另一个部分中,我希望从特征转到图层以确定正在特征上使用的样式,特别是它是否可见。

ol.Feature.getStyle() || ol.Feature -> (layer?) -> getStyle()


Jonatas提供的使用筛选器的答案有效,但需要注意的是,我必须在本地数组中存储通过“filter”函数的所有项目,并在选择事件处理程序(回调)中将所选功能与这些数组项之一匹配并清除该数组。 - ryansstack
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
12

您可以尝试使用filter函数:

var select = new ol.interaction.Select({
    condition:  ...,
    filter: function(feature, layer){
        console.info(feature);
        console.info(layer.get('name'));
    }
});

更新

我想出了这个原型方法,它可以完成任务:

http://jsfiddle.net/jonataswalker/r242y7ke/

/**
 * This is a workaround.
 * Returns the associated layer.
 * @param {ol.Map} map.
 * @return {ol.layer.Vector} Layer.
 */
ol.Feature.prototype.getLayer = function(map) {
    var this_ = this, layer_, layersToLookFor = [];
    /**
     * Populates array layersToLookFor with only
     * layers that have features
     */
    var check = function(layer){
        var source = layer.getSource();
        if(source instanceof ol.source.Vector){
            var features = source.getFeatures();
            if(features.length > 0){
                layersToLookFor.push({
                    layer: layer,
                    features: features
                });
            }
        }
    };
    //loop through map layers
    map.getLayers().forEach(function(layer){
        if (layer instanceof ol.layer.Group) {
            layer.getLayers().forEach(check);
        } else {
            check(layer);
        }
    });
    layersToLookFor.forEach(function(obj){
        var found = obj.features.some(function(feature){
            return this_ === feature;
        });
        if(found){
            //this is the layer we want
            layer_ = obj.layer;
        }
    });
    return layer_;
};

select.on('select', function(evt){
    var feature = evt.selected[0];
    if(feature){
        var layer = feature.getLayer(map);

        console.info(layer.getStyle());
        console.info(layer.get('name'));
    }
});

我注意到了,但是在我的应用的另一个部分,我想从功能转到层.. 我会在问题中添加它。但是我会尝试这个建议,如果它有效.. 现在足够好了 :) - ryansstack
如何存储一个引用以供以后使用? - Jonatas Walker
关于存储外部引用,这是一种方法,但我对这个问题感兴趣的是想知道是否有一种方法可以从框架中的一个特性转到一个图层。 - ryansstack
我还想使用 this.selection.on('select', someCallBack); 来处理选择事件,而不是过滤器调用,但无论如何。 - ryansstack
1
我正在进行一些测试,但如果没有一些hackish的话是不容易的。 - Jonatas Walker

10

在 OL 5.3.0 版本中,选择交互对象具有 getLayer() 函数,可以获取最后选定要素的相关图层。例如:

let selectClick = new Select({});
map.addInteraction(selectClick);

selectClick.on('select', function(e) {
    let featureSelected = e.selected[0];
    let layer = selectClick.getLayer(featureSelected);
    console.log(layer); // here you have the selected layer
});

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,