diff --git a/src/ol/map.js b/src/ol/map.js index e5922d24b3..69b3fcb5b8 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -541,7 +541,7 @@ ol.Map.prototype.disposeInternal = function() { /** * Detect features that intersect a pixel on the viewport, and execute a * callback with each intersecting feature. Layers included in the detection can - * be configured through `opt_layerFilter`. + * be configured through the `layerFilter` option in `opt_options`. * @param {ol.Pixel} pixel Pixel. * @param {function(this: S, (ol.Feature|ol.render.Feature), * ol.layer.Layer): T} callback Feature callback. The callback will be @@ -573,6 +573,25 @@ ol.Map.prototype.forEachFeatureAtPixel = function(pixel, callback, opt_options) }; +/** + * Get all features that intersect a pixel on the viewport. + * @param {ol.Pixel} pixel Pixel. + * @param {olx.AtPixelOptions=} opt_options Optional options. + * @return {Array.} The detected features or + * `null` if none were found. + * @api + */ +ol.Map.prototype.getFeaturesAtPixel = function(pixel, opt_options) { + var features = null; + this.forEachFeatureAtPixel(pixel, function(feature) { + if (!features) { + features = []; + } + features.push(feature); + }, opt_options); + return features; +}; + /** * Detect layers that have a color value at a pixel on the viewport, and * execute a callback with each matching layer. Layers included in the diff --git a/test/spec/ol/map.test.js b/test/spec/ol/map.test.js index 28d615389e..ebf772e2ec 100644 --- a/test/spec/ol/map.test.js +++ b/test/spec/ol/map.test.js @@ -183,6 +183,57 @@ describe('ol.Map', function() { }); + describe('#getFeaturesAtPixel', function() { + + var target, map; + beforeEach(function() { + target = document.createElement('div'); + target.style.width = target.style.height = '100px'; + document.body.appendChild(target); + map = new ol.Map({ + target: target, + layers: [new ol.layer.Vector({ + source: new ol.source.Vector({ + features: [new ol.Feature(new ol.geom.Point([0, 0]))] + }) + })], + view: new ol.View({ + center: [0, 0], + zoom: 2 + }) + }); + map.renderSync(); + }); + afterEach(function() { + document.body.removeChild(target); + }); + + it('returns null if no feature was found', function() { + var features = map.getFeaturesAtPixel([0, 0]); + expect(features).to.be(null); + }); + + it('returns an array of found features', function() { + var features = map.getFeaturesAtPixel([50, 50]); + expect(features).to.be.an(Array); + expect(features[0]).to.be.an(ol.Feature); + }); + + it('respects options', function() { + var otherLayer = new ol.layer.Vector({ + source: new ol.source.Vector + }); + map.addLayer(otherLayer); + var features = map.getFeaturesAtPixel([50, 50], { + layerFilter: function(layer) { + return layer == otherLayer; + } + }); + expect(features).to.be(null); + }); + + }); + describe('#forEachLayerAtPixel()', function() { var target, map, original, log;