From 387f797f23f2a717dc90a9b6061e2a560348b46e Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 23 Jul 2019 19:24:27 +0200 Subject: [PATCH] Avoid false positives for line and polygon hit detection --- src/ol/renderer/canvas/VectorTileLayer.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 9a6ce54b54..f0e24828df 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -344,11 +344,13 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { let i, ii; for (i = 0, ii = renderedTiles.length; i < ii; ++i) { const tile = renderedTiles[i]; + const tileExtent = tileGrid.getTileCoordExtent(tile.wrappedTileCoord); + const tileContainsCoordinate = containsCoordinate(tileExtent, coordinate); + if (!declutter) { // 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)) { + if (!tileContainsCoordinate) { continue; } } @@ -361,13 +363,15 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { * @return {?} Callback result. */ function(feature) { - let key = feature.getId(); - if (key === undefined) { - key = getUid(feature); - } - if (!(key in features)) { - features[key] = true; - return callback(feature, layer); + if (tileContainsCoordinate || (declutteredFeatures && declutteredFeatures.indexOf(feature) !== -1)) { + let key = feature.getId(); + if (key === undefined) { + key = getUid(feature); + } + if (!(key in features)) { + features[key] = true; + return callback(feature, layer); + } } }, layer.getDeclutter() ? declutteredFeatures : null); }