diff --git a/js/data/feature_tree.js b/js/data/feature_tree.js index d520bd887b8..5648b65efab 100644 --- a/js/data/feature_tree.js +++ b/js/data/feature_tree.js @@ -152,11 +152,11 @@ FeatureTree.prototype.query = function(result, args, styleLayersByID, returnGeoJ var matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius); var match = this.featureIndexArray.at(0); - this.filterMatching(result, matching, match, queryGeometry, filter, params.layerIds, styleLayersByID, args.bearing, pixelsToTileUnits, returnGeoJSON); + this.filterMatching(result, matching, match, queryGeometry, filter, params.layerIDs, styleLayersByID, args.bearing, pixelsToTileUnits, returnGeoJSON); var matchingSymbols = this.collisionTile.queryRenderedSymbols(minX, minY, maxX, maxY, args.scale); var match2 = this.collisionTile.collisionBoxArray.at(0); - this.filterMatching(result, matchingSymbols, match2, queryGeometry, filter, params.layerIds, styleLayersByID, args.bearing, pixelsToTileUnits, returnGeoJSON); + this.filterMatching(result, matchingSymbols, match2, queryGeometry, filter, params.layerIDs, styleLayersByID, args.bearing, pixelsToTileUnits, returnGeoJSON); if (!returnGeoJSON) { result = result.arrayBuffer; @@ -194,6 +194,7 @@ FeatureTree.prototype.filterMatching = function(result, matching, match, queryGe } var styleLayer = styleLayersByID[layerID]; + if (!styleLayer) continue; var translatedPolygon; if (styleLayer.type !== 'symbol') { @@ -228,7 +229,9 @@ FeatureTree.prototype.filterMatching = function(result, matching, match, queryGe if (returnGeoJSON) { var geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y); - geojsonFeature.layer = layerID; + geojsonFeature.layer = styleLayer.serialize({ + includeRefProperties: true + }); result.push(geojsonFeature); } else { result.emplaceBack(match.featureIndex, match.sourceLayerIndex, match.bucketIndex, l); @@ -237,7 +240,7 @@ FeatureTree.prototype.filterMatching = function(result, matching, match, queryGe } }; -FeatureTree.prototype.makeGeoJSON = function(result, featureIndexArray) { +FeatureTree.prototype.makeGeoJSON = function(result, featureIndexArray, styleLayers) { if (!this.vtLayers) { if (!this.rawTileData) return []; this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers; @@ -260,8 +263,14 @@ FeatureTree.prototype.makeGeoJSON = function(result, featureIndexArray) { } var feature = cachedFeatures[featureIndex] = cachedFeatures[featureIndex] || sourceLayer.feature(featureIndex); + + var styleLayer = styleLayers[this.numberToLayerIDs[indexes.bucketIndex][indexes.layerIndex]]; + if (!styleLayer) continue; + var geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y); - geojsonFeature.layer = this.numberToLayerIDs[indexes.bucketIndex][indexes.layerIndex]; + geojsonFeature.layer = styleLayer.serialize({ + includeRefProperties: true + }); result.push(geojsonFeature); } }; diff --git a/js/source/source.js b/js/source/source.js index a1ce5d670f0..20b15e9c7e7 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -101,7 +101,7 @@ exports._queryRenderedVectorFeatures = function(queryGeometry, params, classes, collisionTile: collisionTile.data, rawTileData: tileIn.tile.rawTileData.slice() }, function(err_, data) { - if (data) tileIn.tile.featureTree.makeGeoJSON(features, data); + if (data) tileIn.tile.featureTree.makeGeoJSON(features, data, styleLayers); callback(); }, tileIn.tile.workerID); }.bind(this), function() { diff --git a/js/style/style.js b/js/style/style.js index 3fdd13c283c..3727470fb4a 100644 --- a/js/style/style.js +++ b/js/style/style.js @@ -407,7 +407,7 @@ Style.prototype = util.inherit(Evented, { var error = null; if (params.layer) { - params.layerIds = Array.isArray(params.layer) ? params.layer : [params.layer]; + params.layerIDs = Array.isArray(params.layer) ? params.layer : [params.layer]; } util.asyncAll(Object.keys(this.sources), function(id, callback) { @@ -419,18 +419,8 @@ Style.prototype = util.inherit(Evented, { }); }.bind(this), function() { if (error) return callback(error); - - callback(null, features - .filter(function(feature) { - return this._layers[feature.layer] !== undefined; - }.bind(this)) - .map(function(feature) { - feature.layer = this._layers[feature.layer].serialize({ - includeRefProperties: true - }); - return feature; - }.bind(this))); - }.bind(this)); + callback(null, features); + }); }, _remove: function() {