diff --git a/js/data/feature_tree.js b/js/data/feature_tree.js index da75a94f9ea..4e80ec96175 100644 --- a/js/data/feature_tree.js +++ b/js/data/feature_tree.js @@ -14,8 +14,8 @@ function FeatureTree(getGeometry, getType) { this.toBeInserted = []; } -FeatureTree.prototype.insert = function(bbox, layer, feature) { - bbox.layer = layer; +FeatureTree.prototype.insert = function(bbox, layers, feature) { + bbox.layers = layers; bbox.feature = feature; this.toBeInserted.push(bbox); }; @@ -42,7 +42,7 @@ FeatureTree.prototype.query = function(args, callback) { var type = this.getType(feature); var geometry = this.getGeometry(feature); - if (params.layer && matching[i].layer.id !== params.layer.id) + if (params.layer && matching[i].layers.indexOf(params.layer.id) < 0) continue; if (params.$type && type !== params.$type) continue; @@ -52,7 +52,7 @@ FeatureTree.prototype.query = function(args, callback) { var props = { $type: type, properties: matching[i].feature.properties, - layer: matching[i].layer + layers: matching[i].layers }; if (params.geometry) { diff --git a/js/source/worker_tile.js b/js/source/worker_tile.js index 775fe5cb329..a5bb4e04bb1 100644 --- a/js/source/worker_tile.js +++ b/js/source/worker_tile.js @@ -56,6 +56,7 @@ WorkerTile.prototype.parse = function(data, layers, actor, callback) { continue; bucket = createBucket(layer, buffers, collision); + bucket.layers = [layer.id]; buckets[bucket.id] = bucket; bucketsInOrder.push(bucket); @@ -72,6 +73,19 @@ WorkerTile.prototype.parse = function(data, layers, actor, callback) { } } + // Index ref layers. + for (i = 0; i < layers.length; i++) { + layer = layers[i]; + + if (layer.source !== this.source) + continue; + + if (!layer.ref) + continue; + + buckets[layer.ref].layers.push(layer.id); + } + // read each layer, and sort its features into buckets if (data.layers) { // vectortile @@ -150,7 +164,7 @@ WorkerTile.prototype.parse = function(data, layers, actor, callback) { if (bucket.interactive) { for (var i = 0; i < bucket.features.length; i++) { var feature = bucket.features[i]; - tile.featureTree.insert(feature.bbox(), {id: bucket.id}, feature); + tile.featureTree.insert(feature.bbox(), bucket.layers, feature); } } if (typeof self !== 'undefined') { diff --git a/js/style/style.js b/js/style/style.js index 9935522d8fc..6b0b6a2a312 100644 --- a/js/style/style.js +++ b/js/style/style.js @@ -123,7 +123,7 @@ Style.prototype = util.inherit(Evented, { for (id in this._layers) { layer = this._layers[id]; - ordered.push(layer.transferable()); + ordered.push(layer.json()); if (layer.nested) continue; @@ -241,11 +241,9 @@ Style.prototype = util.inherit(Evented, { }, () => { if (error) return callback(error); - features.forEach((feature) => { - var layer = this._layers[feature.layer.id]; - util.extend(feature.layer, layer._layer, { - paint: layer.paint, - layout: layer.layout + features.forEach(feature => { + feature.layers = feature.layers.map(id => { + return this._layers[id].json(); }); }); diff --git a/js/style/style_layer.js b/js/style/style_layer.js index 25dc9558fec..801a31dea06 100644 --- a/js/style/style_layer.js +++ b/js/style/style_layer.js @@ -19,16 +19,6 @@ function StyleLayer(layer) { } StyleLayer.prototype = { - assign(layer) { - this.type = layer.type; - this.source = layer.source; - this['source-layer'] = layer['source-layer']; - this.minzoom = layer.minzoom; - this.maxzoom = layer.maxzoom; - this.filter = layer.filter; - this.layout = layer.layout; - }, - resolveLayout(layers, constants) { if (!this.ref) { this.layout = new LayoutProperties[this.type]( @@ -144,8 +134,20 @@ StyleLayer.prototype = { return !this.hidden; }, - transferable() { - return util.extend({}, this._layer, {layout: this.layout}); + assign(layer) { + util.extend(this, util.pick(layer, + 'type', 'source', 'source-layer', + 'minzoom', 'maxzoom', 'filter', + 'layout')); + }, + + json() { + return util.extend({}, + this._layer, + util.pick(this, + 'type', 'source', 'source-layer', + 'minzoom', 'maxzoom', 'filter', + 'layout', 'paint')); } }; diff --git a/test/js/data/feature_tree.test.js b/test/js/data/feature_tree.test.js index d6f2c225571..284bed9d1b1 100644 --- a/test/js/data/feature_tree.test.js +++ b/test/js/data/feature_tree.test.js @@ -71,7 +71,7 @@ test('featuretree query', function(t) { for (var i=0; i