From aa9d97e0e643374f936aa2e6adcd79b8af189a5f Mon Sep 17 00:00:00 2001 From: Bouillaguet Quentin Date: Tue, 20 Jun 2023 15:41:41 +0200 Subject: [PATCH] feat(LASParser): change lasparser package from loaders.gl to copc --- examples/libs/laz-perf/laz-perf.wasm | Bin 0 -> 214617 bytes src/Parser/LASLoader.js | 151 +++++++++++++++++++++++++++ src/Parser/LASParser.js | 76 ++++++++------ test/unit/lasparser.js | 67 ++++++++---- webpack.config.js | 29 +++-- 5 files changed, 257 insertions(+), 66 deletions(-) create mode 100644 examples/libs/laz-perf/laz-perf.wasm create mode 100644 src/Parser/LASLoader.js diff --git a/examples/libs/laz-perf/laz-perf.wasm b/examples/libs/laz-perf/laz-perf.wasm new file mode 100644 index 0000000000000000000000000000000000000000..17b267b01b900c1e8456389b0bd652487a0745c4 GIT binary patch literal 214617 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

d#jg$mh7OP0TE)B2 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 dJPj5a{EZzo@BypynLP_ `${this._wasmPath}/${file}`, + }); + + return this._wasmPromise; + } + + _parseView(view, options) { + const colorDepth = options.colorDepth ?? 16; + + const getPosition = ['X', 'Y', 'Z'].map(view.getter); + const getIntensity = view.getter('Intensity'); + const getReturnNumber = view.getter('ReturnNumber'); + const getNumberOfReturns = view.getter('NumberOfReturns'); + const getClassification = view.getter('Classification'); + const getPointSourceID = view.getter('PointSourceId'); + const getColor = view.dimensions.Red ? + ['Red', 'Green', 'Blue'].map(view.getter) : undefined; + + const positions = new Float32Array(view.pointCount * 3); + const intensities = new Uint16Array(view.pointCount); + const returnNumbers = new Uint8Array(view.pointCount); + const numberOfReturns = new Uint8Array(view.pointCount); + const classifications = new Uint8Array(view.pointCount); + const pointSourceIDs = new Uint16Array(view.pointCount); + const colors = getColor ? new Uint8Array(view.pointCount * 4) : undefined; + + for (let i = 0; i < view.pointCount; i++) { + // `getPosition` apply scale and offset transform to the X, Y, Z + // values. See https://github.com/connormanning/copc.js/blob/master/src/las/extractor.ts. + const [x, y, z] = getPosition.map(f => f(i)); + positions[i * 3] = x; + positions[i * 3 + 1] = y; + positions[i * 3 + 2] = z; + + intensities[i] = getIntensity(i); + returnNumbers[i] = getReturnNumber(i); + numberOfReturns[i] = getNumberOfReturns(i); + + if (getColor) { + // Note that we do not infer color depth as it is expensive + // (i.e. traverse the whole view to check if there exists a red, + // green or blue value > 255). + let [r, g, b] = getColor.map(f => f(i)); + + if (colorDepth === 16) { + r /= 256; + g /= 256; + b /= 256; + } + + colors[i * 4] = r; + colors[i * 4 + 1] = g; + colors[i * 4 + 2] = b; + colors[i * 4 + 3] = 255; + } + + classifications[i] = getClassification(i); + pointSourceIDs[i] = getPointSourceID(i); + } + + return { + position: positions, + intensity: intensities, + returnNumber: returnNumbers, + numberOfReturns, + classification: classifications, + pointSourceID: pointSourceIDs, + color: colors, + }; + } + + /** + * Set LazPerf decoder path. + * @param {string} path - path to `laz-perf.wasm` folder. + */ + set lazPerf(path) { + this._wasmPath = path; + this._wasmPromise = null; + } + + /** + * Parses a LAS or LAZ (LASZip) file. Note that this function is + * **CPU-bound** and shall be parallelised in a dedicated worker. + * @param {ArrayBuffer} data - Binary data to parse. + * @param {Object} [options] - Parsing options. + * @param {8 | 16} [options.colorDepth] - Color depth encoding (in bits). + * Either 8 or 16 bits. Defaults to 8 bits for LAS 1.2 and 16 bits for later + * versions (as mandatory by the specification) + */ + async parseFile(data, options = {}) { + const bytes = new Uint8Array(data); + + const pointData = await Las.PointData.decompressFile(bytes, this._initDecoder()); + + const header = Las.Header.parse(bytes); + const colorDepth = options.colorDepth ?? + ((header.majorVersion === 1 && header.minorVersion <= 2) ? 8 : 16); + + const getter = async (begin, end) => bytes.slice(begin, end); + const vlrs = await Las.Vlr.walk(getter, header); + const ebVlr = Las.Vlr.find(vlrs, 'LASF_Spec', 4); + const eb = ebVlr && Las.ExtraBytes.parse(await Las.Vlr.fetch(getter, ebVlr)); + + const view = Las.View.create(pointData, header, eb); + const attributes = this._parseView(view, { colorDepth }); + return { + header, + attributes, + }; + } +} + +export default LASLoader; diff --git a/src/Parser/LASParser.js b/src/Parser/LASParser.js index 17182a9b95..7142ec801a 100644 --- a/src/Parser/LASParser.js +++ b/src/Parser/LASParser.js @@ -1,66 +1,76 @@ import * as THREE from 'three'; -import { LASLoader } from '@loaders.gl/las'; +import LASLoader from 'Parser/LASLoader'; -// See this document for LAS format specification -// https://www.asprs.org/wp-content/uploads/2010/12/LAS_1_4_r13.pdf -// http://www.cs.unc.edu/~isenburg/lastools/download/laszip.pdf +const lasLoader = new LASLoader(); -/** - * The LASParser module provides a [parse]{@link module:LASParser.parse} method - * that takes a LAS file or a LAZ (LASZip) file in, and gives a - * `THREE.BufferGeometry` containing all the necessary attributes to be +/** The LASParser module provides a [parse]{@link + * module:LASParser.parse} method that takes a LAS or LAZ (LASZip) file in, and + * gives a `THREE.BufferGeometry` containing all the necessary attributes to be * displayed in iTowns. It uses the - * [LASLoader](https://loaders.gl/modules/las/docs/api-reference/las-loader) - * from `loaders.gl`. + * [copc.js](https://github.com/connormanning/copc.js/) library. * * @module LASParser */ export default { + /* + * Set the laz-perf decoder path. + * @param {string} path - path to `laz-perf.wasm` folder. + */ + enableLazPerf(path) { + if (!path) { + throw new Error('Path to laz-perf is mandatory'); + } + lasLoader.lazPerf = path; + }, /** * Parses a LAS file or a LAZ (LASZip) file and return the corresponding * `THREE.BufferGeometry`. * * @param {ArrayBuffer} data - The file content to parse. - * @param {Object} [options] - Options to give to the parser. - * @param {number|string} [options.in.colorDepth='auto'] - Does the color - * encoding is known ? Is it `8` or `16` bits ? By default it is to - * `'auto'`, but it will be more performant if a specific value is set. - * @param {number} [options.out.skip=1] - Read one point from every `skip` - * points. + * @param {Object} [options] + * @param {Object} [options.in] - Options to give to the parser. + * @param { 8 | 16 } [options.in.colorDepth] - Color depth (in bits). + * Defaults to 8 bits for LAS 1.2 and 16 bits for later versions + * (as mandatory by the specification) * * @return {Promise} A promise resolving with a `THREE.BufferGeometry`. The * header of the file is contained in `userData`. */ parse(data, options = {}) { - options.in = options.in || {}; - options.out = options.out || {}; - return LASLoader.parse(data, { - las: { - colorDepth: options.in.colorDepth || 'auto', - skip: options.out.skip || 1, - }, + if (options.out?.skip) { + console.warn("Warning: options 'skip' not supported anymore"); + } + return lasLoader.parseFile(data, { + colorDepth: options.in?.colorDepth, }).then((parsedData) => { const geometry = new THREE.BufferGeometry(); - geometry.userData = parsedData.loaderData; - geometry.userData.vertexCount = parsedData.header.vertexCount; - geometry.userData.boundingBox = parsedData.header.boundingBox; + const attributes = parsedData.attributes; + geometry.userData = parsedData.header; - const positionBuffer = new THREE.BufferAttribute(parsedData.attributes.POSITION.value, 3); + const positionBuffer = new THREE.BufferAttribute(attributes.position, 3); geometry.setAttribute('position', positionBuffer); - const intensityBuffer = new THREE.BufferAttribute(parsedData.attributes.intensity.value, 1, true); + const intensityBuffer = new THREE.BufferAttribute(attributes.intensity, 1, true); geometry.setAttribute('intensity', intensityBuffer); - const classificationBuffer = new THREE.BufferAttribute(parsedData.attributes.classification.value, 1, true); - geometry.setAttribute('classification', classificationBuffer); + const returnNumber = new THREE.BufferAttribute(attributes.returnNumber, 1); + geometry.setAttribute('returnNumber', returnNumber); + + const numberOfReturns = new THREE.BufferAttribute(attributes.numberOfReturns, 1); + geometry.setAttribute('numberOfReturns', numberOfReturns); - if (parsedData.attributes.COLOR_0) { - const colorBuffer = new THREE.BufferAttribute(parsedData.attributes.COLOR_0.value, 4, true); + const classBuffer = new THREE.BufferAttribute(attributes.classification, 1, true); + geometry.setAttribute('classification', classBuffer); + + const pointSourceID = new THREE.BufferAttribute(attributes.pointSourceID, 1); + geometry.setAttribute('pointSourceID', pointSourceID); + + if (attributes.color) { + const colorBuffer = new THREE.BufferAttribute(attributes.color, 4, true); geometry.setAttribute('color', colorBuffer); } geometry.computeBoundingBox(); - return geometry; }); }, diff --git a/test/unit/lasparser.js b/test/unit/lasparser.js index 8139bf8173..4f87dbed08 100644 --- a/test/unit/lasparser.js +++ b/test/unit/lasparser.js @@ -7,43 +7,64 @@ import { compareWithEpsilon } from './utils'; describe('LASParser', function () { let lasData; let lazData; + let lazDataV1_4; before(async () => { const networkOptions = process.env.HTTPS_PROXY ? { agent: new HttpsProxyAgent(process.env.HTTPS_PROXY) } : {}; const baseurl = 'https://raw.githubusercontent.com/iTowns/iTowns2-sample-data/master/pointclouds/'; lazData = await Fetcher.arrayBuffer(`${baseurl}data_test.laz`, networkOptions); lasData = await Fetcher.arrayBuffer(`${baseurl}data_test.las`, networkOptions); + lazDataV1_4 = await Fetcher.arrayBuffer(`${baseurl}ellipsoid-1.4.laz`, networkOptions); + LASParser.enableLazPerf('./examples/libs/laz-perf'); }); it('parses a las file to a THREE.BufferGeometry', async () => { const bufferGeometry = await LASParser.parse(lasData); - assert.strictEqual(bufferGeometry.userData.vertexCount, 106); - assert.strictEqual(bufferGeometry.attributes.position.count, bufferGeometry.userData.vertexCount); - assert.strictEqual(bufferGeometry.attributes.intensity.count, bufferGeometry.userData.vertexCount); - assert.strictEqual(bufferGeometry.attributes.classification.count, bufferGeometry.userData.vertexCount); + assert.strictEqual(bufferGeometry.userData.pointCount, 106); + assert.strictEqual(bufferGeometry.attributes.position.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.intensity.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.classification.count, bufferGeometry.userData.pointCount); assert.strictEqual(bufferGeometry.attributes.color, undefined); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.x, bufferGeometry.userData.mins[0], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.y, bufferGeometry.userData.mins[1], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.z, bufferGeometry.userData.mins[2], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.x, bufferGeometry.userData.maxs[0], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.y, bufferGeometry.userData.maxs[1], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.z, bufferGeometry.userData.maxs[2], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.x, bufferGeometry.userData.min[0], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.y, bufferGeometry.userData.min[1], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.z, bufferGeometry.userData.min[2], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.x, bufferGeometry.userData.max[0], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.y, bufferGeometry.userData.max[1], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.z, bufferGeometry.userData.max[2], 0.1)); }); - it('parses a laz file to a THREE.BufferGeometry', async () => { - const bufferGeometry = await LASParser.parse(lazData); - assert.strictEqual(bufferGeometry.userData.vertexCount, 57084); - assert.strictEqual(bufferGeometry.attributes.position.count, bufferGeometry.userData.vertexCount); - assert.strictEqual(bufferGeometry.attributes.intensity.count, bufferGeometry.userData.vertexCount); - assert.strictEqual(bufferGeometry.attributes.classification.count, bufferGeometry.userData.vertexCount); - assert.strictEqual(bufferGeometry.attributes.color, undefined); + describe('parses a laz file to a THREE.BufferGeometry', function () { + it('laz v1.2', async () => { + const bufferGeometry = await LASParser.parse(lazData); + assert.strictEqual(bufferGeometry.userData.pointCount, 57084); + assert.strictEqual(bufferGeometry.attributes.position.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.intensity.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.classification.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.color, undefined); + + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.x, bufferGeometry.userData.min[0], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.y, bufferGeometry.userData.min[1], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.z, bufferGeometry.userData.min[2], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.x, bufferGeometry.userData.max[0], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.y, bufferGeometry.userData.max[1], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.z, bufferGeometry.userData.max[2], 0.1)); + }); + + it('laz v1.4', async () => { + const bufferGeometry = await LASParser.parse(lazDataV1_4); + assert.strictEqual(bufferGeometry.userData.pointCount, 100000); + assert.strictEqual(bufferGeometry.attributes.position.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.intensity.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.classification.count, bufferGeometry.userData.pointCount); + assert.strictEqual(bufferGeometry.attributes.color.count, bufferGeometry.userData.pointCount); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.x, bufferGeometry.userData.mins[0], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.y, bufferGeometry.userData.mins[1], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.z, bufferGeometry.userData.mins[2], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.x, bufferGeometry.userData.maxs[0], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.y, bufferGeometry.userData.maxs[1], 0.1)); - assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.z, bufferGeometry.userData.maxs[2], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.x, bufferGeometry.userData.min[0], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.y, bufferGeometry.userData.min[1], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.min.z, bufferGeometry.userData.min[2], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.x, bufferGeometry.userData.max[0], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.y, bufferGeometry.userData.max[1], 0.1)); + assert.ok(compareWithEpsilon(bufferGeometry.boundingBox.max.z, bufferGeometry.userData.max[2], 0.1)); + }); }); }); diff --git a/webpack.config.js b/webpack.config.js index a20964b16f..e6386494b5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,6 @@ const fs = require('fs'); const path = require('path'); +const webpack = require('webpack'); const ESLintPlugin = require('eslint-webpack-plugin'); const mode = process.env.NODE_ENV; @@ -17,8 +18,8 @@ const debugBuild = mode === 'development'; - we also dynamise the value of __DEBUG__ according to the env var */ // Note that we don't support .babelrc in parent folders -var babelrc = fs.readFileSync(path.resolve(__dirname, '.babelrc')); -var babelConf = JSON.parse(babelrc); +const babelrc = fs.readFileSync(path.resolve(__dirname, '.babelrc')); +const babelConf = JSON.parse(babelrc); babelConf.babelrc = false; // disabel babelrc reading, as we've just done it const replacementPluginConf = babelConf.plugins.find(plugin => Array.isArray(plugin) && plugin[0] === 'minify-replace'); @@ -80,19 +81,27 @@ module.exports = () => { }, ], }, - plugins: [new ESLintPlugin({ - files: include, - })], + plugins: [ + new ESLintPlugin({ + files: include, + }), + // Prevent the generation of module fs for import on copc dependency + // See https://webpack.js.org/plugins/ignore-plugin/ + new webpack.IgnorePlugin({ + resourceRegExp: /^fs$/, + contextRegExp: /copc/, + }), + ], devServer: { devMiddleware: { publicPath: '/dist/', }, static: { - directory: path.resolve(__dirname, './'), - watch: { - ignored: path.resolve(__dirname, '.git') - } - }, + directory: path.resolve(__dirname, './'), + watch: { + ignored: path.resolve(__dirname, '.git'), + }, + }, client: { overlay: { errors: true,