Merge pull request #9230 from ahocevar/hitdetect-declutter

Consider all tiles for hit detection when decluttering
This commit is contained in:
Andreas Hocevar
2019-02-19 12:58:07 +01:00
committed by GitHub
+12 -6
View File
@@ -339,14 +339,17 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer {
const renderedTiles = /** @type {Array<import("../../VectorRenderTile.js").default>} */ (this.renderedTiles); const renderedTiles = /** @type {Array<import("../../VectorRenderTile.js").default>} */ (this.renderedTiles);
let bufferedExtent, found; let found;
let i, ii; let i, ii;
for (i = 0, ii = renderedTiles.length; i < ii; ++i) { for (i = 0, ii = renderedTiles.length; i < ii; ++i) {
const tile = renderedTiles[i]; const tile = renderedTiles[i];
const tileExtent = tileGrid.getTileCoordExtent(tile.wrappedTileCoord); if (!this.declutterTree_) {
bufferedExtent = buffer(tileExtent, hitTolerance * resolution, bufferedExtent); // When not decluttering, we only need to consider the tile that contains the given
if (!containsCoordinate(bufferedExtent, coordinate)) { // coordinate, because each feature will be rendered for each tile that contains it.
continue; const tileExtent = tileGrid.getTileCoordExtent(tile.wrappedTileCoord);
if (!containsCoordinate(tileExtent, coordinate)) {
continue;
}
} }
const executorGroups = tile.executorGroups[getUid(layer)]; const executorGroups = tile.executorGroups[getUid(layer)];
for (let t = 0, tt = executorGroups.length; t < tt; ++t) { for (let t = 0, tt = executorGroups.length; t < tt; ++t) {
@@ -357,7 +360,10 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer {
* @return {?} Callback result. * @return {?} Callback result.
*/ */
function(feature) { function(feature) {
const key = getUid(feature); let key = feature.getId();
if (key === undefined) {
key = getUid(feature);
}
if (!(key in features)) { if (!(key in features)) {
features[key] = true; features[key] = true;
return callback.call(thisArg, feature, layer); return callback.call(thisArg, feature, layer);