Как получить слой из объекта в Openlayers 3?

Я не могу найти способ перейти от объекта в событии выбора к слою, частью которого он может быть, не пересекая все объекты всех слоев моей карты или не сохраняя искусственный идентификатор слоя в каждом объекте при создании. Разве это еще не возможно?

ol.js 3.7.0 ол.взаимодействие.Выбор -> щелчок - > обратный вызов( событие ){ событие.избранный[0] }

в другой части моего приложения, я хотел бы перейти от функции к слою, чтобы определить стиль использовать функцию, специально ли она видна.

ol.Особенность.getStyle () / / ol.Feature - > (слой?) -> getStyle()

2 ответов


вы можете попробовать с функцией фильтра:

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

обновление

Я придумал этот метод prototypied, это делает работу:

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

В Openlayers 4 -map.forEachFeatureAtPixel может использоваться для получения родительского слоя каждого объекта.

см. фрагмент кода здесь:https://stackoverflow.com/a/50415743/2288488