From fd07de39adaf27bf00ebc601dac42c9a7a5fc988 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Mon, 18 Feb 2019 11:40:52 +0100 Subject: [PATCH] Consider all tiles for hit detection when decluttering --- src/ol/renderer/canvas/VectorTileLayer.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 361a018c5d..78e3bf2f6d 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -339,14 +339,17 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { const renderedTiles = /** @type {Array} */ (this.renderedTiles); - let bufferedExtent, found; + let found; let i, ii; for (i = 0, ii = renderedTiles.length; i < ii; ++i) { const tile = renderedTiles[i]; - const tileExtent = tileGrid.getTileCoordExtent(tile.wrappedTileCoord); - bufferedExtent = buffer(tileExtent, hitTolerance * resolution, bufferedExtent); - if (!containsCoordinate(bufferedExtent, coordinate)) { - continue; + if (!this.declutterTree_) { + // When not decluttering, we only need to consider the tile that contains the given + // coordinate, because each feature will be rendered for each tile that contains it. + const tileExtent = tileGrid.getTileCoordExtent(tile.wrappedTileCoord); + if (!containsCoordinate(tileExtent, coordinate)) { + continue; + } } const executorGroups = tile.executorGroups[getUid(layer)]; for (let t = 0, tt = executorGroups.length; t < tt; ++t) { @@ -357,7 +360,10 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { * @return {?} Callback result. */ function(feature) { - const key = getUid(feature); + let key = feature.getId(); + if (key === undefined) { + key = getUid(feature); + } if (!(key in features)) { features[key] = true; return callback.call(thisArg, feature, layer);