[GIS] Remove or delete selected feature in openlayers

openlayers

Using OpenLayers 3.9.0.
I have two vector layers which are both desplayed on the map and can select any feature with a singleclick var select = new ol.interaction.Select();

Now I need to make it possible to remove selected feature with Del key.

I ended up with creating the folloing function and listener

var deleteFeature = function(e){
    if(e.keyCode == 46 && (select !== null)){
        layer.getSource().removeFeature(select.getFeatures());
    }
};
document.addEventListener('keydown', deleteFeature, false);

but the problem is that I don't know the layer of the selected feature to call the removeFeture method on.

Any suggestions how to find out the layer of the selected feature or another way of removing selected features?

Best Answer

UPDATED to achieve when layer is within a ol.layer.Group. Now you should pass map reference to method.

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

A method to get ol.layer.Vector from feature you can use like so:

/**
 * 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_;
};

Then loop through select.getFeatures() and get ol.layer.Vector:

select.getFeatures().forEach(function(feature){
    var layer = feature.getLayer(map);
    //and so on
});

Used here - https://stackoverflow.com/a/31299728/4640499