diff --git a/package-lock.json b/package-lock.json index 687ff75..0380ebb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "morgan": "1.10.0", "pbf": "4.0.1", "pmtiles": "3.0.7", + "pngjs": "^7.0.0", "proj4": "2.12.1", "sanitize-filename": "1.6.3", "sharp": "0.33.5", @@ -6887,6 +6888,14 @@ "fflate": "^0.8.0" } }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/prebuild-install": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", diff --git a/package.json b/package.json index 4c6bda2..ffd207d 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "morgan": "1.10.0", "pbf": "4.0.1", "pmtiles": "3.0.7", + "pngjs": "^7.0.0", "proj4": "2.12.1", "sanitize-filename": "1.6.3", "sharp": "0.33.5", diff --git a/src/contour.js b/src/contour.js index a84530c..10fef25 100644 --- a/src/contour.js +++ b/src/contour.js @@ -1,6 +1,7 @@ import sharp from 'sharp'; import mlcontour from '../node_modules/maplibre-contour/dist/index.mjs'; import { getPMtilesTile } from './pmtiles_adapter.js'; +import { PNG } from 'pngjs'; /** * Manages local DEM (Digital Elevation Model) data using maplibre-contour. @@ -60,27 +61,15 @@ export class LocalDemManager { */ async getImageData(blob, abortController) { try { - if (Boolean(abortController?.signal?.aborted)) return null; - const buffer = await blob.arrayBuffer(); - const image = sharp(Buffer.from(buffer)); - await image.metadata(); - - if (Boolean(abortController?.signal?.aborted)) return null; - - const { data, info } = await image - .raw() - .toBuffer({ resolveWithObject: true }); - if (Boolean(abortController?.signal?.aborted)) return null; - + const png = PNG.sync.read(Buffer.from(buffer)); const parsed = mlcontour.decodeParsedImage( - info.width, - info.height, + png.width, + png.height, this.encoding, - data, + png.data, ); if (Boolean(abortController?.signal?.aborted)) return null; - return parsed; } catch (error) { console.error('Error processing image:', error);