diff --git a/examples/webpack/worker-loader.cjs b/examples/webpack/worker-loader.cjs index 15128ea840..891d60bafd 100644 --- a/examples/webpack/worker-loader.cjs +++ b/examples/webpack/worker-loader.cjs @@ -9,7 +9,12 @@ module.exports = function loader() { build(this.resource, {minify}) .then((chunk) => { for (const filePath in chunk.modules) { - this.addDependency(filePath); + try { + const dependency = require.resolve(filePath); + this.addDependency(dependency); + } catch (e) { + // empty catch block + } } callback(null, chunk.code); }) diff --git a/package-lock.json b/package-lock.json index 3a67195d2f..c456334b8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,6 +63,7 @@ "pngjs": "^6.0.0", "proj4": "^2.7.5", "puppeteer": "10.2.0", + "regenerator-runtime": "^0.13.9", "rollup": "^2.42.3", "rollup-plugin-terser": "^7.0.2", "serve-static": "^1.14.0", @@ -4672,18 +4673,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -8012,9 +8001,9 @@ } }, "node_modules/observable-fns": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.5.1.tgz", - "integrity": "sha512-wf7g4Jpo1Wt2KIqZKLGeiuLOEMqpaOZ5gJn7DmSdqXgTdxRwSdBhWegQQpPteQ2gZvzCKqNNpwb853wcpA0j7A==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==" }, "node_modules/obuf": { "version": "1.1.2", @@ -9057,9 +9046,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "node_modules/regenerator-transform": { @@ -10391,14 +10380,14 @@ "dev": true }, "node_modules/threads": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/threads/-/threads-1.6.4.tgz", - "integrity": "sha512-A+9MQFAUha9W8MjIPmrvETy98qVmZFr5Unox9D95y7kvz3fBpGiFS7JOZs07B2KvTHoRNI5MrGudRVeCmv4Alw==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.6.5.tgz", + "integrity": "sha512-yL1NN4qZ25crW8wDoGn7TqbENJ69w3zCEjIGXpbqmQ4I+QHrG8+DLaZVKoX74OQUXWCI2lbbrUxDxAbr1xjDGQ==", "dependencies": { "callsites": "^3.1.0", "debug": "^4.2.0", "is-observable": "^2.1.0", - "observable-fns": "^0.5.1" + "observable-fns": "^0.6.1" }, "funding": { "url": "https://github.com/andywer/threads.js?sponsor=1" @@ -14804,12 +14793,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true } } }, @@ -17603,9 +17586,9 @@ } }, "observable-fns": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.5.1.tgz", - "integrity": "sha512-wf7g4Jpo1Wt2KIqZKLGeiuLOEMqpaOZ5gJn7DmSdqXgTdxRwSdBhWegQQpPteQ2gZvzCKqNNpwb853wcpA0j7A==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==" }, "obuf": { "version": "1.1.2", @@ -18394,9 +18377,9 @@ } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "regenerator-transform": { @@ -19448,14 +19431,14 @@ "dev": true }, "threads": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/threads/-/threads-1.6.4.tgz", - "integrity": "sha512-A+9MQFAUha9W8MjIPmrvETy98qVmZFr5Unox9D95y7kvz3fBpGiFS7JOZs07B2KvTHoRNI5MrGudRVeCmv4Alw==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.6.5.tgz", + "integrity": "sha512-yL1NN4qZ25crW8wDoGn7TqbENJ69w3zCEjIGXpbqmQ4I+QHrG8+DLaZVKoX74OQUXWCI2lbbrUxDxAbr1xjDGQ==", "requires": { "callsites": "^3.1.0", "debug": "^4.2.0", "is-observable": "^2.1.0", - "observable-fns": "^0.5.1", + "observable-fns": "^0.6.1", "tiny-worker": ">= 2" } }, diff --git a/package.json b/package.json index f51d355612..d9007a1cc6 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "pngjs": "^6.0.0", "proj4": "^2.7.5", "puppeteer": "10.2.0", + "regenerator-runtime": "^0.13.9", "rollup": "^2.42.3", "rollup-plugin-terser": "^7.0.2", "serve-static": "^1.14.0", diff --git a/src/ol/source/GeoTIFF.js b/src/ol/source/GeoTIFF.js index 9e39ac372e..272ca6ca41 100644 --- a/src/ol/source/GeoTIFF.js +++ b/src/ol/source/GeoTIFF.js @@ -4,8 +4,9 @@ import DataTile from './DataTile.js'; import State from './State.js'; import TileGrid from '../tilegrid/TileGrid.js'; +import {Pool, fromUrl as tiffFromUrl, fromUrls as tiffFromUrls} from 'geotiff'; +import {create as createDecoderWorker} from '../worker/geotiff-decoder.js'; import {get as getProjection} from '../proj.js'; -import {fromUrl as tiffFromUrl, fromUrls as tiffFromUrls} from 'geotiff'; import {toSize} from '../size.js'; /** @@ -19,6 +20,14 @@ import {toSize} from '../size.js'; * @property {number} [nodata] Values to discard. */ +let workerPool; +function getWorkerPool() { + if (!workerPool) { + workerPool = new Pool(undefined, createDecoderWorker()); + } + return workerPool; +} + /** * @param {import("geotiff/src/geotiff.js").GeoTIFF|import("geotiff/src/geotiff.js").MultiGeoTIFF} tiff A GeoTIFF. * @return {Promise>} Resolves to a list of images. @@ -317,7 +326,10 @@ class GeoTIFFSource extends DataTile { const sourceInfo = this.sourceInfo_; for (let sourceIndex = 0; sourceIndex < sourceCount; ++sourceIndex) { const image = this.sourceImagery_[sourceIndex][z]; - requests[sourceIndex] = image.readRasters({window: pixelBounds}); + requests[sourceIndex] = image.readRasters({ + window: pixelBounds, + pool: getWorkerPool(), + }); if (sourceInfo[sourceIndex].nodata !== undefined) { addAlpha = true; } diff --git a/src/ol/worker/geotiff-decoder.js b/src/ol/worker/geotiff-decoder.js new file mode 100644 index 0000000000..3dff2cce22 --- /dev/null +++ b/src/ol/worker/geotiff-decoder.js @@ -0,0 +1,5 @@ +/* eslint-disable sort-imports-es6-autofix/sort-imports-es6 */ +import 'regenerator-runtime/runtime.js'; +import 'geotiff/src/decoder.worker.js'; + +export let create;