From 038f122d11602fe14f6505f75edb464b8d1cf177 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Fri, 16 Nov 2018 12:34:09 +0100 Subject: [PATCH] Clip tile layers by extent --- .../expected.png | Bin 39242 -> 0 bytes .../layer-tile-2layers-extentclip/main.js | 47 ------------------ .../cases/layer-tile-extent/expected.png | Bin 0 -> 7264 bytes rendering/cases/layer-tile-extent/main.js | 40 +++++++++++++++ src/ol/renderer/canvas/Layer.js | 33 ++++++++++++ src/ol/renderer/canvas/TileLayer.js | 12 +++-- 6 files changed, 82 insertions(+), 50 deletions(-) delete mode 100644 rendering/cases/layer-tile-2layers-extentclip/expected.png delete mode 100644 rendering/cases/layer-tile-2layers-extentclip/main.js create mode 100644 rendering/cases/layer-tile-extent/expected.png create mode 100644 rendering/cases/layer-tile-extent/main.js diff --git a/rendering/cases/layer-tile-2layers-extentclip/expected.png b/rendering/cases/layer-tile-2layers-extentclip/expected.png deleted file mode 100644 index e1e007a8a1550d630bef282e02da2cef04728a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39242 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

Gwt+=9kJ@SGyT#_0hNE@lqX7{U*$H%~v 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 literal 0 HcmV?d00001 diff --git a/rendering/cases/layer-tile-extent/main.js b/rendering/cases/layer-tile-extent/main.js new file mode 100644 index 0000000000..a678217834 --- /dev/null +++ b/rendering/cases/layer-tile-extent/main.js @@ -0,0 +1,40 @@ +/** + * Tile layers get clipped to their extent. + */ + +import Map from '../../../src/ol/Map.js'; +import View from '../../../src/ol/View.js'; +import TileLayer from '../../../src/ol/layer/Tile.js'; +import {fromLonLat} from '../../../src/ol/proj'; +import {transformExtent} from '../../../src/ol/proj.js'; +import XYZ from '../../../src/ol/source/XYZ'; + +const center = fromLonLat([7, 50]); +const extent = transformExtent([2, 47, 10, 53], 'EPSG:4326', 'EPSG:3857'); + +new Map({ + target: 'map', + view: new View({ + center: center, + zoom: 3 + }), + layers: [ + new TileLayer({ + source: new XYZ({ + url: '/data/tiles/satellite/{z}/{x}/{y}.jpg', + maxZoom: 3 + }), + extent: extent + }), + new TileLayer({ + source: new XYZ({ + url: '/data/tiles/stamen-labels/{z}/{x}/{y}.png', + minZoom: 3, + maxZoom: 5 + }), + extent: extent + }) + ] +}); + +render(); diff --git a/src/ol/renderer/canvas/Layer.js b/src/ol/renderer/canvas/Layer.js index 63b3c475ee..212ee2d995 100644 --- a/src/ol/renderer/canvas/Layer.js +++ b/src/ol/renderer/canvas/Layer.js @@ -85,6 +85,39 @@ class CanvasLayerRenderer extends LayerRenderer { rotateAtOffset(context, rotation, halfWidth, halfHeight); } + /** + * @param {CanvasRenderingContext2D} context Context. + * @param {import("../../PluggableMap.js").FrameState} frameState Frame state. + * @param {import("../../extent.js").Extent} extent Clip extent. + * @protected + */ + clipUnrotated(context, frameState, extent) { + const topLeft = getTopLeft(extent); + const topRight = getTopRight(extent); + const bottomRight = getBottomRight(extent); + const bottomLeft = getBottomLeft(extent); + + applyTransform(frameState.coordinateToPixelTransform, topLeft); + applyTransform(frameState.coordinateToPixelTransform, topRight); + applyTransform(frameState.coordinateToPixelTransform, bottomRight); + applyTransform(frameState.coordinateToPixelTransform, bottomLeft); + + const inverted = invertTransform(this.pixelTransform_.slice()); + + applyTransform(inverted, topLeft); + applyTransform(inverted, topRight); + applyTransform(inverted, bottomRight); + applyTransform(inverted, bottomLeft); + + context.save(); + context.beginPath(); + context.moveTo(Math.round(topLeft[0]), Math.round(topLeft[1])); + context.lineTo(Math.round(topRight[0]), Math.round(topRight[1])); + context.lineTo(Math.round(bottomRight[0]), Math.round(bottomRight[1])); + context.lineTo(Math.round(bottomLeft[0]), Math.round(bottomLeft[1])); + context.clip(); + } + /** * @param {import("../../render/EventType.js").default} type Event type. * @param {CanvasRenderingContext2D} context Context. diff --git a/src/ol/renderer/canvas/TileLayer.js b/src/ol/renderer/canvas/TileLayer.js index cc52886763..ca151222d3 100644 --- a/src/ol/renderer/canvas/TileLayer.js +++ b/src/ol/renderer/canvas/TileLayer.js @@ -143,12 +143,10 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { const tileResolution = tileGrid.getResolution(z); let extent = frameState.extent; - if (layerState.extent !== undefined) { + if (layerState.extent) { extent = getIntersection(extent, layerState.extent); } - // TODO: clip by layer extent - const tilePixelRatio = tileSource.getTilePixelRatio(pixelRatio); // desired dimensions of the canvas in pixels @@ -235,6 +233,10 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { context.clearRect(0, 0, width, height); } + if (layerState.extent) { + this.clipUnrotated(context, frameState, layerState.extent); + } + this.preRender(context, frameState, pixelTransform); this.renderedTiles.length = 0; @@ -285,6 +287,10 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { this.postRender(context, frameState, pixelTransform); + if (layerState.extent) { + context.restore(); + } + const opacity = layerState.opacity; if (opacity !== canvas.style.opacity) { canvas.style.opacity = opacity;