From 0004b2594d78f3c6cbf5a66a3b80b48098d4931f Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 10 Jan 2022 20:37:50 +0100 Subject: [PATCH] Support multiple sources for layers --- examples/cog-pyramid.html | 5 +- examples/cog-pyramid.js | 58 ++++----- src/ol/layer/Base.js | 1 - src/ol/layer/Layer.js | 9 +- src/ol/layer/WebGLTile.js | 113 ++++++++++++++++++ src/ol/renderer/Composite.js | 8 +- src/ol/renderer/webgl/Layer.js | 2 +- src/ol/renderer/webgl/TileLayer.js | 32 +++-- src/ol/source.js | 35 ++++++ src/ol/structs/LRUCache.js | 10 ++ test/browser/spec/ol/layer/Group.test.js | 7 -- test/browser/spec/ol/layer/Layer.test.js | 3 - test/browser/spec/ol/layer/WebGLTile.test.js | 33 +++++ test/browser/spec/ol/source.test.js | 41 +++++++ .../cases/webgl-tile-multisource/expected.png | Bin 0 -> 65145 bytes .../cases/webgl-tile-multisource/main.js | 58 +++++++++ test/rendering/data/tiles/osm/1/0/0.png | Bin 0 -> 8968 bytes test/rendering/data/tiles/osm/1/0/1.png | Bin 0 -> 2982 bytes test/rendering/data/tiles/osm/1/1/0.png | Bin 0 -> 9489 bytes test/rendering/data/tiles/osm/1/1/1.png | Bin 0 -> 3603 bytes 20 files changed, 348 insertions(+), 67 deletions(-) create mode 100644 test/browser/spec/ol/source.test.js create mode 100644 test/rendering/cases/webgl-tile-multisource/expected.png create mode 100644 test/rendering/cases/webgl-tile-multisource/main.js create mode 100644 test/rendering/data/tiles/osm/1/0/0.png create mode 100644 test/rendering/data/tiles/osm/1/0/1.png create mode 100644 test/rendering/data/tiles/osm/1/1/0.png create mode 100644 test/rendering/data/tiles/osm/1/1/1.png diff --git a/examples/cog-pyramid.html b/examples/cog-pyramid.html index 3e32e650ad..c24f5155f6 100644 --- a/examples/cog-pyramid.html +++ b/examples/cog-pyramid.html @@ -4,9 +4,8 @@ title: GeoTIFF tile pyramid shortdesc: Rendering a COG tile pyramid as layer group. docs: > Data from a Cloud Optimized GeoTIFF (COG) tile pyramid can be rendered as a set of layers. In this - example, a pyramid of 3-band GeoTIFFs is used to render RGB data. For each tile of the pyramid, a - separate layer is created on demand. The lowest resolution layer serves as preview while higher resolutions are - loading. + example, a pyramid of 3-band GeoTIFFs is used to render RGB data. The `ol/source.sourcesFromTileGrid` + helper function creates sources from this pyramid on demand. tags: "cog, tilepyramid, stac" ---
diff --git a/examples/cog-pyramid.js b/examples/cog-pyramid.js index ed63732a49..65dd898e62 100644 --- a/examples/cog-pyramid.js +++ b/examples/cog-pyramid.js @@ -1,16 +1,16 @@ import GeoTIFF from '../src/ol/source/GeoTIFF.js'; -import LayerGroup from '../src/ol/layer/Group.js'; import Map from '../src/ol/Map.js'; import TileGrid from '../src/ol/tilegrid/TileGrid.js'; import View from '../src/ol/View.js'; import WebGLTileLayer from '../src/ol/layer/WebGLTile.js'; -import {getIntersection} from '../src/ol/extent.js'; +import {createXYZ} from '../src/ol/tilegrid.js'; +import {sourcesFromTileGrid} from '../src/ol/source.js'; // Metadata from https://s2downloads.eox.at/demo/EOxCloudless/2019/rgb/2019_EOxCloudless_rgb.json // Tile grid of the GeoTIFF pyramid layout const tileGrid = new TileGrid({ - origin: [-180, 90], + extent: [-180, -90, 180, 90], resolutions: [0.703125, 0.3515625, 0.17578125, 8.7890625e-2, 4.39453125e-2], tileSizes: [ [512, 256], @@ -21,30 +21,25 @@ const tileGrid = new TileGrid({ ], }); -const pyramid = new LayerGroup(); -const layerForUrl = {}; -const zs = tileGrid.getResolutions().length; - -function useLayer(z, x, y) { - const url = `https://s2downloads.eox.at/demo/EOxCloudless/2019/rgb/${z}/${y}/${x}.tif`; - if (!(url in layerForUrl)) { - pyramid.getLayers().push( - new WebGLTileLayer({ - minZoom: z, - maxZoom: z === 0 || z === zs - 1 ? undefined : z + 1, - extent: tileGrid.getTileCoordExtent([z, x, y]), - source: new GeoTIFF({ - sources: [ - { - url: url, - }, - ], +const pyramid = new WebGLTileLayer({ + sources: sourcesFromTileGrid( + tileGrid, + ([z, x, y]) => + new GeoTIFF({ + tileGrid: createXYZ({ + extent: tileGrid.getTileCoordExtent([z, x, y]), + minZoom: z, + maxZoom: + z === tileGrid.getResolutions().length - 1 ? undefined : z + 1, }), + sources: [ + { + url: `https://s2downloads.eox.at/demo/EOxCloudless/2019/rgb/${z}/${y}/${x}.tif`, + }, + ], }) - ); - layerForUrl[url] = true; - } -} + ), +}); const map = new Map({ target: 'map', @@ -56,16 +51,3 @@ const map = new Map({ showFullExtent: true, }), }); - -// Add overview layer -useLayer(0, 0, 0); - -// Add layer for specific extent on demand -map.on('moveend', () => { - const view = map.getView(); - tileGrid.forEachTileCoord( - getIntersection([-180, -90, 180, 90], view.calculateExtent()), - tileGrid.getZForResolution(view.getResolution()), - ([z, x, y]) => useLayer(z, x, y) - ); -}); diff --git a/src/ol/layer/Base.js b/src/ol/layer/Base.js index e2d6c5c1e5..6141cd84d0 100644 --- a/src/ol/layer/Base.js +++ b/src/ol/layer/Base.js @@ -163,7 +163,6 @@ class BaseLayer extends BaseObject { }); const zIndex = this.getZIndex(); state.opacity = clamp(Math.round(this.getOpacity() * 100) / 100, 0, 1); - state.sourceState = this.getSourceState(); state.visible = this.getVisible(); state.extent = this.getExtent(); state.zIndex = zIndex === undefined && !state.managed ? Infinity : zIndex; diff --git a/src/ol/layer/Layer.js b/src/ol/layer/Layer.js index 775f7eac93..87dce260ca 100644 --- a/src/ol/layer/Layer.js +++ b/src/ol/layer/Layer.js @@ -57,7 +57,7 @@ import {listen, unlistenByKey} from '../events.js'; * @typedef {Object} State * @property {import("./Layer.js").default} layer Layer. * @property {number} opacity Opacity, the value is rounded to two digits to appear after the decimal point. - * @property {import("../source/State.js").default} sourceState SourceState. + * @property {import("../source/Source.js").default|undefined} source Source being rendered (only for multi-source layers). * @property {boolean} visible Visible. * @property {boolean} managed Managed. * @property {import("../extent.js").Extent} [extent] Extent. @@ -196,6 +196,13 @@ class Layer extends BaseLayer { return /** @type {SourceType} */ (this.get(LayerProperty.SOURCE)) || null; } + /** + * @return {SourceType} The source being rendered. + */ + getRenderSource() { + return this.getSource(); + } + /** * @return {import("../source/State.js").default} Source state. */ diff --git a/src/ol/layer/WebGLTile.js b/src/ol/layer/WebGLTile.js index 1409a69ef7..c25caf417a 100644 --- a/src/ol/layer/WebGLTile.js +++ b/src/ol/layer/WebGLTile.js @@ -3,6 +3,7 @@ */ import BaseTileLayer from './BaseTile.js'; import LayerProperty from '../layer/Property.js'; +import SourceState from '../source/State.js'; import WebGLTileLayerRenderer, { Attributes, Uniforms, @@ -64,6 +65,11 @@ import {assign} from '../obj.js'; * @property {number} [preload=0] Preload. Load low-resolution tiles up to `preload` levels. `0` * means no preloading. * @property {SourceType} [source] Source for this layer. + * @property {Array|function(import("../extent.js").Extent, number):Array} [sources] Array + * of sources for this layer. Takes precedence over `source`. Can either be an array of sources, or a function that + * expects an extent and a resolution (in view projection units per pixel) and returns an array of sources. See + * {@link module:ol/source.sourcesFromTileGrid} for a helper function to generate sources that are organized in a + * pyramid following the same pattern as a tile grid. * @property {import("../PluggableMap.js").default} [map] Sets the layer as overlay on a map. The map will not manage * this layer in its layers collection, and the layer will be rendered on top. This is useful for * temporary layers. The standard way to add a layer to a map and have it managed by the map is to @@ -291,6 +297,18 @@ class WebGLTileLayer extends BaseTileLayer { super(options); + /** + * @type {Array|function(import("../extent.js").Extent, number):Array} + * @private + */ + this.sources_ = options.sources; + + /** + * @type {number} + * @private + */ + this.renderedResolution_ = NaN; + /** * @type {Style} * @private @@ -312,6 +330,41 @@ class WebGLTileLayer extends BaseTileLayer { this.addChangeListener(LayerProperty.SOURCE, this.handleSourceUpdate_); } + /** + * Gets the sources for this layer, for a given extent and resolution. + * @param {import("../extent.js").Extent} extent Extent. + * @param {number} resolution Resolution. + * @return {Array} Sources. + */ + getSources(extent, resolution) { + const source = this.getSource(); + return this.sources_ + ? typeof this.sources_ === 'function' + ? this.sources_(extent, resolution) + : this.sources_ + : source + ? [source] + : []; + } + + /** + * @return {SourceType} The source being rendered. + */ + getRenderSource() { + return ( + /** @type {SourceType} */ (this.getLayerState().source) || + this.getSource() + ); + } + + /** + * @return {import("../source/State.js").default} Source state. + */ + getSourceState() { + const source = this.getRenderSource(); + return source ? source.getState() : SourceState.UNDEFINED; + } + /** * @private */ @@ -340,6 +393,66 @@ class WebGLTileLayer extends BaseTileLayer { }); } + /** + * @param {import("../PluggableMap").FrameState} frameState Frame state. + * @param {Array} sources Sources. + * @return {HTMLElement} Canvas. + */ + renderSources(frameState, sources) { + const layerRenderer = this.getRenderer(); + let canvas; + for (let i = 0, ii = sources.length; i < ii; ++i) { + this.getLayerState().source = sources[i]; + if (layerRenderer.prepareFrame(frameState)) { + canvas = layerRenderer.renderFrame(frameState); + } + } + return canvas; + } + + /** + * @param {?import("../PluggableMap.js").FrameState} frameState Frame state. + * @param {HTMLElement} target Target which the renderer may (but need not) use + * for rendering its content. + * @return {HTMLElement} The rendered element. + */ + render(frameState, target) { + const viewState = frameState.viewState; + const sources = this.getSources(frameState.extent, viewState.resolution); + let ready = true; + for (let i = 0, ii = sources.length; i < ii; ++i) { + const source = sources[i]; + const sourceState = source.getState(); + if (sourceState == SourceState.LOADING) { + const onChange = () => { + if (source.getState() == SourceState.READY) { + source.removeEventListener('change', onChange); + this.changed(); + } + }; + source.addEventListener('change', onChange); + } + ready = ready && sourceState == SourceState.READY; + } + const canvas = this.renderSources(frameState, sources); + if (this.getRenderer().renderComplete && ready) { + // Fully rendered, done. + this.renderedResolution_ = viewState.resolution; + return canvas; + } + // Render sources from previously fully rendered frames + if (this.renderedResolution_ > 0.5 * viewState.resolution) { + const altSources = this.getSources( + frameState.extent, + this.renderedResolution_ + ).filter((source) => !sources.includes(source)); + if (altSources.length > 0) { + return this.renderSources(frameState, altSources); + } + } + return canvas; + } + /** * Update the layer style. The `updateStyleVariables` function is a more efficient * way to update layer rendering. In cases where the whole style needs to be updated, diff --git a/src/ol/renderer/Composite.js b/src/ol/renderer/Composite.js index 69d9ec3c5a..00f4d37f8c 100644 --- a/src/ol/renderer/Composite.js +++ b/src/ol/renderer/Composite.js @@ -110,15 +110,17 @@ class CompositeMapRenderer extends MapRenderer { for (let i = 0, ii = layerStatesArray.length; i < ii; ++i) { const layerState = layerStatesArray[i]; frameState.layerIndex = i; + + const layer = layerState.layer; + const sourceState = layer.getSourceState(); if ( !inView(layerState, viewState) || - (layerState.sourceState != SourceState.READY && - layerState.sourceState != SourceState.UNDEFINED) + (sourceState != SourceState.READY && + sourceState != SourceState.UNDEFINED) ) { continue; } - const layer = layerState.layer; const element = layer.render(frameState, previousElement); if (!element) { continue; diff --git a/src/ol/renderer/webgl/Layer.js b/src/ol/renderer/webgl/Layer.js index b11bf36902..00f4082db6 100644 --- a/src/ol/renderer/webgl/Layer.js +++ b/src/ol/renderer/webgl/Layer.js @@ -161,7 +161,7 @@ class WebGLLayerRenderer extends LayerRenderer { * @return {boolean} Layer is ready to be rendered. */ prepareFrame(frameState) { - if (this.getLayer().getSource()) { + if (this.getLayer().getRenderSource()) { let incrementGroup = true; let groupNumber = -1; let className; diff --git a/src/ol/renderer/webgl/TileLayer.js b/src/ol/renderer/webgl/TileLayer.js index f77b792770..2af3a33b3d 100644 --- a/src/ol/renderer/webgl/TileLayer.js +++ b/src/ol/renderer/webgl/TileLayer.js @@ -20,7 +20,6 @@ import { } from '../../vec/mat4.js'; import { createOrUpdate as createTileCoord, - getKeyZXY, getKey as getTileCoordKey, } from '../../tilecoord.js'; import {fromUserExtent} from '../../proj.js'; @@ -98,7 +97,7 @@ function getRenderExtent(frameState, extent) { ); } const source = - /** {import("../../source/Tile.js").default} */ layerState.layer.getSource(); + /** {import("../../source/Tile.js").default} */ layerState.layer.getRenderSource(); if (!source.getWrapX()) { const gridExtent = source .getTileGridForProjection(frameState.viewState.projection) @@ -110,6 +109,10 @@ function getRenderExtent(frameState, extent) { return extent; } +function getCacheKey(source, tileCoord) { + return `${source.getKey()},${getTileCoordKey(tileCoord)}`; +} + /** * @typedef {Object} Options * @property {string} vertexShader Vertex shader source. @@ -140,6 +143,12 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { uniforms: options.uniforms, }); + /** + * The last call to `renderFrame` was completed with all tiles loaded + * @type {boolean} + */ + this.renderComplete = false; + /** * This transform converts tile i, j coordinates to screen coordinates. * @type {import("../../transform.js").Transform} @@ -273,7 +282,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { */ prepareFrameInternal(frameState) { const layer = this.getLayer(); - const source = layer.getSource(); + const source = layer.getRenderSource(); if (!source) { return false; } @@ -293,7 +302,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { enqueueTiles(frameState, extent, z, tileTexturesByZ) { const viewState = frameState.viewState; const tileLayer = this.getLayer(); - const tileSource = tileLayer.getSource(); + const tileSource = tileLayer.getRenderSource(); const tileGrid = tileSource.getTileGridForProjection(viewState.projection); const tileTextureCache = this.tileTextureCache_; const tileRange = tileGrid.getTileRangeForExtentAndZ( @@ -314,7 +323,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { for (let x = tileRange.minX; x <= tileRange.maxX; ++x) { for (let y = tileRange.minY; y <= tileRange.maxY; ++y) { const tileCoord = createTileCoord(z, x, y, this.tempTileCoord_); - const tileCoordKey = getTileCoordKey(tileCoord); + const cacheKey = getCacheKey(tileSource, tileCoord); /** * @type {TileTexture} @@ -326,8 +335,8 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { */ let tile; - if (tileTextureCache.containsKey(tileCoordKey)) { - tileTexture = tileTextureCache.get(tileCoordKey); + if (tileTextureCache.containsKey(cacheKey)) { + tileTexture = tileTextureCache.get(cacheKey); tile = tileTexture.tile; } if (!tileTexture || tileTexture.tile.key !== tileSource.getKey()) { @@ -340,7 +349,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { ); if (!tileTexture) { tileTexture = new TileTexture(tile, tileGrid, this.helper); - tileTextureCache.set(tileCoordKey, tileTexture); + tileTextureCache.set(cacheKey, tileTexture); } else { if (this.isDrawableTile_(tile)) { tileTexture.setTile(tile); @@ -379,12 +388,13 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { * @return {HTMLElement} The rendered element. */ renderFrame(frameState) { + this.renderComplete = true; const gl = this.helper.getGL(); this.preRender(gl, frameState); const viewState = frameState.viewState; const tileLayer = this.getLayer(); - const tileSource = tileLayer.getSource(); + const tileSource = tileLayer.getRenderSource(); const tileGrid = tileSource.getTileGridForProjection(viewState.projection); const extent = getRenderExtent(frameState, frameState.extent); const z = tileGrid.getZForResolution( @@ -438,6 +448,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { const tileCoordKey = getTileCoordKey(tileCoord); alphaLookup[tileCoordKey] = alpha; } + this.renderComplete = false; // first look for child tiles (at z + 1) const coveredByChildren = this.findAltTiles_( @@ -635,9 +646,10 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { let covered = true; const tileTextureCache = this.tileTextureCache_; + const source = this.getLayer().getRenderSource(); for (let x = tileRange.minX; x <= tileRange.maxX; ++x) { for (let y = tileRange.minY; y <= tileRange.maxY; ++y) { - const cacheKey = getKeyZXY(altZ, x, y); + const cacheKey = getCacheKey(source, [altZ, x, y]); let loaded = false; if (tileTextureCache.containsKey(cacheKey)) { const tileTexture = tileTextureCache.get(cacheKey); diff --git a/src/ol/source.js b/src/ol/source.js index c1efbce95f..3939a2c4f5 100644 --- a/src/ol/source.js +++ b/src/ol/source.js @@ -2,6 +2,9 @@ * @module ol/source */ +import LRUCache from './structs/LRUCache.js'; +import {getIntersection} from './extent.js'; + export {default as BingMaps} from './source/BingMaps.js'; export {default as CartoDB} from './source/CartoDB.js'; export {default as Cluster} from './source/Cluster.js'; @@ -31,3 +34,35 @@ export {default as VectorTile} from './source/VectorTile.js'; export {default as WMTS} from './source/WMTS.js'; export {default as XYZ} from './source/XYZ.js'; export {default as Zoomify} from './source/Zoomify.js'; + +/** + * Creates a sources function from a tile grid. This function can be used as value for the + * `sources` property of the {@link module:ol/layer/Layer~Layer} subclasses that support it. + * @param {import("./tilegrid/TileGrid.js").default} tileGrid Tile grid. + * @param {function(import("./tilecoord.js").TileCoord): import("./source/Source.js").default} factory Source factory. + * This function takes a {@link module:ol/tilecoord~TileCoord} as argument and is expected to return a + * {@link module:ol/source/Source~Source}. + * @return {function(import("./extent.js").Extent, number): Array} Sources function. + * @api + */ +export function sourcesFromTileGrid(tileGrid, factory) { + const sourceCache = new LRUCache(32); + const tileGridExtent = tileGrid.getExtent(); + return function (extent, resolution) { + sourceCache.expireCache(); + if (tileGridExtent) { + extent = getIntersection(tileGridExtent, extent); + } + const z = tileGrid.getZForResolution(resolution); + const wantedSources = []; + tileGrid.forEachTileCoord(extent, z, (tileCoord) => { + const key = tileCoord.toString(); + if (!sourceCache.containsKey(key)) { + const source = factory(tileCoord); + sourceCache.set(key, source); + } + wantedSources.push(sourceCache.get(key)); + }); + return wantedSources; + }; +} diff --git a/src/ol/structs/LRUCache.js b/src/ol/structs/LRUCache.js index af44ad6472..f8c7e01385 100644 --- a/src/ol/structs/LRUCache.js +++ b/src/ol/structs/LRUCache.js @@ -66,6 +66,16 @@ class LRUCache { return this.highWaterMark > 0 && this.getCount() > this.highWaterMark; } + /** + * Expire the cache. + * @param {!Object} [keep] Keys to keep. To be implemented by subclasses. + */ + expireCache(keep) { + while (this.canExpireCache()) { + this.pop(); + } + } + /** * FIXME empty description for jsdoc */ diff --git a/test/browser/spec/ol/layer/Group.test.js b/test/browser/spec/ol/layer/Group.test.js index c02a0fbff2..ba361f4f43 100644 --- a/test/browser/spec/ol/layer/Group.test.js +++ b/test/browser/spec/ol/layer/Group.test.js @@ -44,7 +44,6 @@ describe('ol/layer/Group', function () { opacity: 1, visible: true, managed: true, - sourceState: 'ready', extent: undefined, zIndex: undefined, maxResolution: Infinity, @@ -161,7 +160,6 @@ describe('ol/layer/Group', function () { opacity: 0.5, visible: false, managed: true, - sourceState: 'ready', extent: undefined, zIndex: 10, maxResolution: 500, @@ -203,7 +201,6 @@ describe('ol/layer/Group', function () { opacity: 0.5, visible: false, managed: true, - sourceState: 'ready', extent: groupExtent, zIndex: undefined, maxResolution: 500, @@ -399,7 +396,6 @@ describe('ol/layer/Group', function () { opacity: 0.3, visible: false, managed: true, - sourceState: 'ready', extent: groupExtent, zIndex: 10, maxResolution: 500, @@ -417,7 +413,6 @@ describe('ol/layer/Group', function () { opacity: 0, visible: false, managed: true, - sourceState: 'ready', extent: undefined, zIndex: undefined, maxResolution: Infinity, @@ -433,7 +428,6 @@ describe('ol/layer/Group', function () { opacity: 1, visible: true, managed: true, - sourceState: 'ready', extent: undefined, zIndex: undefined, maxResolution: Infinity, @@ -599,7 +593,6 @@ describe('ol/layer/Group', function () { opacity: 0.25, visible: false, managed: true, - sourceState: 'ready', extent: undefined, zIndex: undefined, maxResolution: 150, diff --git a/test/browser/spec/ol/layer/Layer.test.js b/test/browser/spec/ol/layer/Layer.test.js index 03cf12f1e2..568c77665e 100644 --- a/test/browser/spec/ol/layer/Layer.test.js +++ b/test/browser/spec/ol/layer/Layer.test.js @@ -56,7 +56,6 @@ describe('ol/layer/Layer', function () { opacity: 1, visible: true, managed: true, - sourceState: 'ready', extent: undefined, zIndex: undefined, maxResolution: Infinity, @@ -95,7 +94,6 @@ describe('ol/layer/Layer', function () { opacity: 0.5, visible: false, managed: true, - sourceState: 'ready', extent: undefined, zIndex: 10, maxResolution: 500, @@ -430,7 +428,6 @@ describe('ol/layer/Layer', function () { opacity: 0.33, visible: false, managed: true, - sourceState: 'ready', extent: undefined, zIndex: 10, maxResolution: 500, diff --git a/test/browser/spec/ol/layer/WebGLTile.test.js b/test/browser/spec/ol/layer/WebGLTile.test.js index cd90407c0f..6d6efa7d2d 100644 --- a/test/browser/spec/ol/layer/WebGLTile.test.js +++ b/test/browser/spec/ol/layer/WebGLTile.test.js @@ -373,4 +373,37 @@ describe('ol/layer/WebGLTile', function () { done(); }); }); + + it('handles multiple sources correctly', () => { + const source = layer.getSource(); + expect(layer.getRenderSource()).to.be(source); + layer.sources_ = (extent, resolution) => { + return [ + { + getState: () => 'ready', + extent, + resolution, + id: 'source1', + }, + { + getState: () => 'ready', + extent, + resolution, + id: 'source2', + }, + ]; + }; + const sourceIds = []; + layer.getRenderer().prepareFrame = (frameState) => { + const renderedSource = layer.getRenderSource(); + expect(renderedSource.extent).to.eql([0, 0, 100, 100]); + expect(renderedSource.resolution).to.be(1); + sourceIds.push(renderedSource.id); + }; + layer.render({ + extent: [0, 0, 100, 100], + viewState: {resolution: 1}, + }); + expect(sourceIds).to.eql(['source1', 'source2']); + }); }); diff --git a/test/browser/spec/ol/source.test.js b/test/browser/spec/ol/source.test.js new file mode 100644 index 0000000000..475ef4aa0c --- /dev/null +++ b/test/browser/spec/ol/source.test.js @@ -0,0 +1,41 @@ +import TileGrid from '../../../../src/ol/tilegrid/TileGrid.js'; +import XYZ from '../../../../src/ol/source/XYZ.js'; +import {createXYZ} from '../../../../src/ol/tilegrid.js'; +import {get} from '../../../../src/ol/proj.js'; +import {sourcesFromTileGrid} from '../../../../src/ol/source.js'; + +describe('ol/source', function () { + describe('sourcesFromTileGrid()', function () { + it('returns a function that returns the correct source', function () { + const resolutions = createXYZ({maxZoom: 1}).getResolutions(); + const tileGrid = new TileGrid({ + extent: get('EPSG:3857').getExtent(), + resolutions: [resolutions[1]], + tileSizes: [[256, 512]], + }); + const factory = function (tileCoord) { + return new XYZ({ + url: tileCoord.join('-') + '/{z}/{x}/{y}.png', + tileGrid: new TileGrid({ + resolutions, + minZoom: tileCoord[0], + maxZoom: tileCoord[0] + 1, + extent: tileGrid.getTileCoordExtent(tileCoord), + origin: [-20037508.342789244, 20037508.342789244], + }), + }); + }; + const getSources = sourcesFromTileGrid(tileGrid, factory); + expect(getSources(tileGrid.getExtent(), resolutions[1]).length).to.be(2); + expect( + getSources( + [-10000, -10000, -5000, 10000], + resolutions[1] + )[0].getUrls()[0] + ).to.be('0-0-0/{z}/{x}/{y}.png'); + expect( + getSources([5000, -10000, 10000, 10000], resolutions[1])[0].getUrls()[0] + ).to.be('0-1-0/{z}/{x}/{y}.png'); + }); + }); +}); diff --git a/test/rendering/cases/webgl-tile-multisource/expected.png b/test/rendering/cases/webgl-tile-multisource/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2abb6c7fe1c2d8654d09b30dfbd89a1d392dbe GIT binary patch literal 65145 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 nz}8D8 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 O0000 { + let source; + switch (tileCoord.toString()) { + case '0,1,0': + source = new XYZ({ + url: '/data/tiles/osm/{z}/{x}/{y}.png', + tileGrid: new TileGrid({ + resolutions, + minZoom: tileCoord[0], + maxZoom: tileCoord[0] + 1, + extent: tilePyramid.getTileCoordExtent(tileCoord), + origin: [-20037508.342789244, 20037508.342789244], + }), + }); + break; + default: + source = new XYZ({ + url: '/data/tiles/satellite/{z}/{x}/{y}.jpg', + tileGrid: new TileGrid({ + resolutions, + minZoom: tileCoord[0], + maxZoom: tileCoord[0] + 1, + extent: tilePyramid.getTileCoordExtent(tileCoord), + origin: [-20037508.342789244, 20037508.342789244], + }), + }); + } + return source; + }), + }), + ], + view: new View({ + center: [0, 0], + zoom: 1, + }), +}); + +render(); diff --git a/test/rendering/data/tiles/osm/1/0/0.png b/test/rendering/data/tiles/osm/1/0/0.png new file mode 100644 index 0000000000000000000000000000000000000000..4e10306aa88cf221c4ba5d6f4d1e12ceb1da3816 GIT binary patch literal 8968 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

_{VQ#>I5 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 literal 0 HcmV?d00001 diff --git a/test/rendering/data/tiles/osm/1/1/0.png b/test/rendering/data/tiles/osm/1/1/0.png new file mode 100644 index 0000000000000000000000000000000000000000..0252154d99979a968516d4c2f4ca5706e20f814a GIT binary patch literal 9489 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 XhD60bQr7^d&!o@AZ4$t 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 literal 0 HcmV?d00001