From 6156297b332b817fbfabb45632ec1fc99592c841 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Fri, 17 Nov 2017 13:55:26 -0800 Subject: [PATCH] Include bucketIndex in queryRenderedSymbols duplicate feature filter Fixes issue #5172: items from multiple layers but sharing a common source feature would only show up in queryRenderedSymbols results for one of the layers. --- src/symbol/collision_index.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/symbol/collision_index.js b/src/symbol/collision_index.js index 375ec7a6996..4669ef69b0a 100644 --- a/src/symbol/collision_index.js +++ b/src/symbol/collision_index.js @@ -267,13 +267,18 @@ class CollisionIndex { const blocking = collisionBoxArray.get(thisTileFeatures[i]); const sourceLayer = blocking.sourceLayerIndex; const featureIndex = blocking.featureIndex; + const bucketIndex = blocking.bucketIndex; // Skip already seen features. if (sourceLayerFeatures[sourceLayer] === undefined) { sourceLayerFeatures[sourceLayer] = {}; } - if (sourceLayerFeatures[sourceLayer][featureIndex]) continue; - + if (sourceLayerFeatures[sourceLayer][featureIndex] === undefined) { + sourceLayerFeatures[sourceLayer][featureIndex] = {}; + } + if (sourceLayerFeatures[sourceLayer][featureIndex][bucketIndex]) { + continue; + } // Check if query intersects with the feature box // "Collision Circles" for line labels are treated as boxes here @@ -292,9 +297,11 @@ class CollisionIndex { new Point(x2, y2), new Point(x1, y2) ]; - if (!intersectionTests.polygonIntersectsPolygon(query, bbox)) continue; + if (!intersectionTests.polygonIntersectsPolygon(query, bbox)) { + continue; + } - sourceLayerFeatures[sourceLayer][featureIndex] = true; + sourceLayerFeatures[sourceLayer][featureIndex][bucketIndex] = true; result.push(thisTileFeatures[i]); }