From 5084b04173ac98c9cc2c750d12c295dd348491a5 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 13 Jan 2021 20:49:29 +0100 Subject: [PATCH] Do not clip declutter executor groups --- .../source-vectortile-declutter/expected.png | Bin 0 -> 7377 bytes .../cases/source-vectortile-declutter/main.js | 60 ++++++++++++++++++ src/ol/renderer/canvas/VectorTileLayer.js | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 rendering/cases/source-vectortile-declutter/expected.png create mode 100644 rendering/cases/source-vectortile-declutter/main.js diff --git a/rendering/cases/source-vectortile-declutter/expected.png b/rendering/cases/source-vectortile-declutter/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ede79331320285f01aef216755420af0efc67a GIT binary patch literal 7377 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 literal 0 HcmV?d00001 diff --git a/rendering/cases/source-vectortile-declutter/main.js b/rendering/cases/source-vectortile-declutter/main.js new file mode 100644 index 0000000000..dac6b8b6b1 --- /dev/null +++ b/rendering/cases/source-vectortile-declutter/main.js @@ -0,0 +1,60 @@ +import Feature from '../../../src/ol/Feature.js'; +import Map from '../../../src/ol/Map.js'; +import Point from '../../../src/ol/geom/Point.js'; +import VectorTileLayer from '../../../src/ol/layer/VectorTile.js'; +import VectorTileSource from '../../../src/ol/source/VectorTile.js'; +import View from '../../../src/ol/View.js'; +import {Circle, Fill, Stroke, Style} from '../../../src/ol/style.js'; +import {createXYZ} from '../../../src/ol/tilegrid.js'; + +const points = [[0, 0]]; + +const vectorTileSource = new VectorTileSource({ + tileGrid: createXYZ({ + extent: [-20000000, -10000000, 10000000, 20000000], + tileSize: 512, + }), + tileUrlFunction: (tileCoord) => tileCoord, + tileLoadFunction(tile, tileCoord) { + const features = points.map( + (corner) => + new Feature({ + geometry: new Point(corner), + tileCoord, + }) + ); + tile.setFeatures(features); + }, +}); + +const vectorTileLayer = new VectorTileLayer({ + declutter: true, + source: vectorTileSource, + style: new Style({ + image: new Circle({ + radius: 100, + fill: new Fill({ + color: 'rgba(255, 0, 0, 0.5)', + }), + stroke: new Stroke({ + width: 1, + color: 'black', + }), + }), + }), +}); + +new Map({ + target: 'map', + layers: [vectorTileLayer], + view: new View({ + center: [0, 0], + zoom: 4, + multiWorld: true, + }), +}); + +render({ + message: + 'Vector tile source tile grid different from render tile grid, with decluttering', +}); diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 39b6676075..8afbeb1178 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -361,7 +361,7 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { tile.executorGroups[layerUid].push(renderingReplayGroup); if (declutterBuilderGroup) { const declutterExecutorGroup = new CanvasExecutorGroup( - replayExtent, + null, resolution, pixelRatio, source.getOverlaps(),