diff --git a/js/style/style.js b/js/style/style.js index 5cfb5d1ed57..193b265f145 100644 --- a/js/style/style.js +++ b/js/style/style.js @@ -637,8 +637,17 @@ Style.prototype = util.inherit(Evented, { this._handleErrors(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, true); } + var includedSources = {}; + if (params.layers) { + for (var i = 0; i < params.layers.length; i++) { + var layerId = params.layers[i]; + includedSources[this._layers[layerId].source] = true; + } + } + var sourceResults = []; for (var id in this.sources) { + if (params.layers && !includedSources[id]) continue; var source = this.sources[id]; if (source.queryRenderedFeatures) { sourceResults.push(source.queryRenderedFeatures(queryGeometry, params, zoom, bearing)); diff --git a/test/js/style/style.test.js b/test/js/style/style.test.js index 3aab22335b0..b7955aad044 100644 --- a/test/js/style/style.test.js +++ b/test/js/style/style.test.js @@ -906,6 +906,10 @@ test('Style#queryRenderedFeatures', function(t) { "mapbox": { "type": "vector", "tiles": ["local://tiles/{z}-{x}-{y}.vector.pbf"] + }, + "other": { + "type": "vector", + "tiles": ["local://tiles/{z}-{x}-{y}.vector.pbf"] } }, "layers": [{ @@ -928,6 +932,20 @@ test('Style#queryRenderedFeatures', function(t) { "paint": { "line-color": "blue" } + }, { + "id": "land--other", + "type": "line", + "source": "other", + "source-layer": "water", + "layout": { + 'line-cap': 'round' + }, + "paint": { + "line-color": "red" + }, + "metadata": { + "something": "else" + } }] }); @@ -935,6 +953,18 @@ test('Style#queryRenderedFeatures', function(t) { style._applyClasses([]); style._recalculate(0); + style.sources.other.queryRenderedFeatures = function(position, params) { + var features = {'land--other': []}; + if (params.layers) { + for (var l in features) { + if (params.layers.indexOf(l) < 0) { + delete features[l]; + } + } + } + return features; + }; + style.sources.mapbox.queryRenderedFeatures = function(position, params) { var features = { 'land': [{ @@ -977,7 +1007,7 @@ test('Style#queryRenderedFeatures', function(t) { }); t.test('filters by `layers` option', function(t) { - var results = style.queryRenderedFeatures([{column: 1, row: 1, zoom: 1}], {layers: 'land'}, 0, 0); + var results = style.queryRenderedFeatures([{column: 1, row: 1, zoom: 1}], {layers: ['land']}, 0, 0); t.equal(results.length, 2); t.end(); }); @@ -1021,6 +1051,12 @@ test('Style#queryRenderedFeatures', function(t) { t.end(); }); + t.test('does not query sources not implicated by `layers` parameter', function (t) { + style.sources.mapbox.queryRenderedFeatures = function() { t.fail(); }; + style.queryRenderedFeatures([{column: 1, row: 1, zoom: 1}], {layers: ['land--other']}); + t.end(); + }); + t.end(); }); });