@loaders.gl/pointclouds 0.0.0-stage → 5.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LAS-README.md +12 -0
- package/LICENSE +24 -0
- package/PCD-README.md +12 -0
- package/PLY-README.md +38 -0
- package/README.md +7 -2
- package/THIRD-PARTY-NOTICES.md +27 -0
- package/dist/dist.dev.js +30141 -0
- package/dist/dist.min.js +54 -0
- package/dist/index.cjs +61 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/las/bundled.cjs +72 -0
- package/dist/las/bundled.cjs.map +7 -0
- package/dist/las/bundled.d.ts +12 -0
- package/dist/las/bundled.d.ts.map +1 -0
- package/dist/las/bundled.js +12 -0
- package/dist/las/bundled.js.map +1 -0
- package/dist/las/index.cjs +78 -0
- package/dist/las/index.cjs.map +7 -0
- package/dist/las/index.d.ts +17 -0
- package/dist/las/index.d.ts.map +1 -0
- package/dist/las/index.js +15 -0
- package/dist/las/index.js.map +1 -0
- package/dist/las/las-copc-loader-types.cjs +49 -0
- package/dist/las/las-copc-loader-types.cjs.map +7 -0
- package/dist/las/las-copc-loader-types.d.ts +63 -0
- package/dist/las/las-copc-loader-types.d.ts.map +1 -0
- package/dist/las/las-copc-loader-types.js +14 -0
- package/dist/las/las-copc-loader-types.js.map +1 -0
- package/dist/las/las-copc-loader.cjs +57 -0
- package/dist/las/las-copc-loader.cjs.map +7 -0
- package/dist/las/las-copc-loader.d.ts +37 -0
- package/dist/las/las-copc-loader.d.ts.map +1 -0
- package/dist/las/las-copc-loader.js +40 -0
- package/dist/las/las-copc-loader.js.map +1 -0
- package/dist/las/las-format.cjs +44 -0
- package/dist/las/las-format.cjs.map +7 -0
- package/dist/las/las-format.d.ts +16 -0
- package/dist/las/las-format.d.ts.map +1 -0
- package/dist/las/las-format.js +19 -0
- package/dist/las/las-format.js.map +1 -0
- package/dist/las/las-loader-shared.cjs +82 -0
- package/dist/las/las-loader-shared.cjs.map +7 -0
- package/dist/las/las-loader-shared.d.ts +66 -0
- package/dist/las/las-loader-shared.d.ts.map +1 -0
- package/dist/las/las-loader-shared.js +58 -0
- package/dist/las/las-loader-shared.js.map +1 -0
- package/dist/las/las-loader-types.cjs +54 -0
- package/dist/las/las-loader-types.cjs.map +7 -0
- package/dist/las/las-loader-types.d.ts +104 -0
- package/dist/las/las-loader-types.d.ts.map +1 -0
- package/dist/las/las-loader-types.js +19 -0
- package/dist/las/las-loader-types.js.map +1 -0
- package/dist/las/las-loader.cjs +80 -0
- package/dist/las/las-loader.cjs.map +7 -0
- package/dist/las/las-loader.d.ts +45 -0
- package/dist/las/las-loader.d.ts.map +1 -0
- package/dist/las/las-loader.js +58 -0
- package/dist/las/las-loader.js.map +1 -0
- package/dist/las/las-writer.cjs +1054 -0
- package/dist/las/las-writer.cjs.map +7 -0
- package/dist/las/las-writer.d.ts +69 -0
- package/dist/las/las-writer.d.ts.map +1 -0
- package/dist/las/las-writer.js +994 -0
- package/dist/las/las-writer.js.map +1 -0
- package/dist/las/laz-rs-loader-types.cjs +49 -0
- package/dist/las/laz-rs-loader-types.cjs.map +7 -0
- package/dist/las/laz-rs-loader-types.d.ts +65 -0
- package/dist/las/laz-rs-loader-types.d.ts.map +1 -0
- package/dist/las/laz-rs-loader-types.js +16 -0
- package/dist/las/laz-rs-loader-types.js.map +1 -0
- package/dist/las/laz-rs-loader.cjs +272 -0
- package/dist/las/laz-rs-loader.cjs.map +7 -0
- package/dist/las/laz-rs-loader.d.ts +37 -0
- package/dist/las/laz-rs-loader.d.ts.map +1 -0
- package/dist/las/laz-rs-loader.js +38 -0
- package/dist/las/laz-rs-loader.js.map +1 -0
- package/dist/las/lazperf-loader-types.cjs +49 -0
- package/dist/las/lazperf-loader-types.cjs.map +7 -0
- package/dist/las/lazperf-loader-types.d.ts +67 -0
- package/dist/las/lazperf-loader-types.d.ts.map +1 -0
- package/dist/las/lazperf-loader-types.js +17 -0
- package/dist/las/lazperf-loader-types.js.map +1 -0
- package/dist/las/lazperf-loader.cjs +60 -0
- package/dist/las/lazperf-loader.cjs.map +7 -0
- package/dist/las/lazperf-loader.d.ts +39 -0
- package/dist/las/lazperf-loader.d.ts.map +1 -0
- package/dist/las/lazperf-loader.js +44 -0
- package/dist/las/lazperf-loader.js.map +1 -0
- package/dist/las/lib/copc/parse-las.cjs +177 -0
- package/dist/las/lib/copc/parse-las.cjs.map +7 -0
- package/dist/las/lib/copc/parse-las.d.ts +17 -0
- package/dist/las/lib/copc/parse-las.d.ts.map +1 -0
- package/dist/las/lib/copc/parse-las.js +215 -0
- package/dist/las/lib/copc/parse-las.js.map +1 -0
- package/dist/las/lib/get-las-schema.cjs +62 -0
- package/dist/las/lib/get-las-schema.cjs.map +7 -0
- package/dist/las/lib/get-las-schema.d.ts +16 -0
- package/dist/las/lib/get-las-schema.d.ts.map +1 -0
- package/dist/las/lib/get-las-schema.js +46 -0
- package/dist/las/lib/get-las-schema.js.map +1 -0
- package/dist/las/lib/las-compatibility.cjs +110 -0
- package/dist/las/lib/las-compatibility.cjs.map +7 -0
- package/dist/las/lib/las-compatibility.d.ts +40 -0
- package/dist/las/lib/las-compatibility.d.ts.map +1 -0
- package/dist/las/lib/las-compatibility.js +115 -0
- package/dist/las/lib/las-compatibility.js.map +1 -0
- package/dist/las/lib/las-extra-bytes.cjs +223 -0
- package/dist/las/lib/las-extra-bytes.cjs.map +7 -0
- package/dist/las/lib/las-extra-bytes.d.ts +35 -0
- package/dist/las/lib/las-extra-bytes.d.ts.map +1 -0
- package/dist/las/lib/las-extra-bytes.js +195 -0
- package/dist/las/lib/las-extra-bytes.js.map +1 -0
- package/dist/las/lib/las-types.cjs +19 -0
- package/dist/las/lib/las-types.cjs.map +7 -0
- package/dist/las/lib/las-types.d.ts +194 -0
- package/dist/las/lib/las-types.d.ts.map +1 -0
- package/dist/las/lib/las-types.js +5 -0
- package/dist/las/lib/las-types.js.map +1 -0
- package/dist/las/lib/las-waveform.cjs +196 -0
- package/dist/las/lib/las-waveform.cjs.map +7 -0
- package/dist/las/lib/las-waveform.d.ts +89 -0
- package/dist/las/lib/las-waveform.d.ts.map +1 -0
- package/dist/las/lib/las-waveform.js +193 -0
- package/dist/las/lib/las-waveform.js.map +1 -0
- package/dist/las/lib/laz-perf/laslaz-decoder.cjs +382 -0
- package/dist/las/lib/laz-perf/laslaz-decoder.cjs.map +7 -0
- package/dist/las/lib/laz-perf/laslaz-decoder.d.ts +129 -0
- package/dist/las/lib/laz-perf/laslaz-decoder.d.ts.map +1 -0
- package/dist/las/lib/laz-perf/laslaz-decoder.js +377 -0
- package/dist/las/lib/laz-perf/laslaz-decoder.js.map +1 -0
- package/dist/las/lib/laz-perf/parse-las.cjs +270 -0
- package/dist/las/lib/laz-perf/parse-las.cjs.map +7 -0
- package/dist/las/lib/laz-perf/parse-las.d.ts +24 -0
- package/dist/las/lib/laz-perf/parse-las.d.ts.map +1 -0
- package/dist/las/lib/laz-perf/parse-las.js +307 -0
- package/dist/las/lib/laz-perf/parse-las.js.map +1 -0
- package/dist/las/lib/laz-rs-wasm/laslaz-decoder.cjs +631 -0
- package/dist/las/lib/laz-rs-wasm/laslaz-decoder.cjs.map +7 -0
- package/dist/las/lib/laz-rs-wasm/laslaz-decoder.d.ts +129 -0
- package/dist/las/lib/laz-rs-wasm/laslaz-decoder.d.ts.map +1 -0
- package/dist/las/lib/laz-rs-wasm/laslaz-decoder.js +414 -0
- package/dist/las/lib/laz-rs-wasm/laslaz-decoder.js.map +1 -0
- package/dist/las/lib/laz-rs-wasm/parse-las.cjs +270 -0
- package/dist/las/lib/laz-rs-wasm/parse-las.cjs.map +7 -0
- package/dist/las/lib/laz-rs-wasm/parse-las.d.ts +24 -0
- package/dist/las/lib/laz-rs-wasm/parse-las.d.ts.map +1 -0
- package/dist/las/lib/laz-rs-wasm/parse-las.js +307 -0
- package/dist/las/lib/laz-rs-wasm/parse-las.js.map +1 -0
- package/dist/las/lib/typescript/parse-las.cjs +2767 -0
- package/dist/las/lib/typescript/parse-las.cjs.map +7 -0
- package/dist/las/lib/typescript/parse-las.d.ts +39 -0
- package/dist/las/lib/typescript/parse-las.d.ts.map +1 -0
- package/dist/las/lib/typescript/parse-las.js +2607 -0
- package/dist/las/lib/typescript/parse-las.js.map +1 -0
- package/dist/las/libs/laz-perf/laz-perf.cjs +18093 -0
- package/dist/las/libs/laz-perf/laz-perf.cjs.map +7 -0
- package/dist/las/libs/laz-perf/laz-perf.d.ts +2 -0
- package/dist/las/libs/laz-perf/laz-perf.d.ts.map +1 -0
- package/dist/las/libs/laz-perf/laz-perf.js +19003 -0
- package/dist/las/libs/laz-perf/laz-perf.js.map +1 -0
- package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts +95 -0
- package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts.map +1 -0
- package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.js +442 -0
- package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.js.map +1 -0
- package/dist/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
- package/dist/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +38 -0
- package/dist/las/unbundled.cjs +71 -0
- package/dist/las/unbundled.cjs.map +7 -0
- package/dist/las/unbundled.d.ts +11 -0
- package/dist/las/unbundled.d.ts.map +1 -0
- package/dist/las/unbundled.js +11 -0
- package/dist/las/unbundled.js.map +1 -0
- package/dist/las/workers/las-worker.cjs +23 -0
- package/dist/las/workers/las-worker.cjs.map +7 -0
- package/dist/las/workers/las-worker.d.ts +2 -0
- package/dist/las/workers/las-worker.d.ts.map +1 -0
- package/dist/las/workers/las-worker.js +23 -0
- package/dist/las/workers/las-worker.js.map +1 -0
- package/dist/las-worker.js +23058 -0
- package/dist/pcd/bundled.cjs +33 -0
- package/dist/pcd/bundled.cjs.map +7 -0
- package/dist/pcd/bundled.d.ts +3 -0
- package/dist/pcd/bundled.d.ts.map +1 -0
- package/dist/pcd/bundled.js +5 -0
- package/dist/pcd/bundled.js.map +1 -0
- package/dist/pcd/index.cjs +40 -0
- package/dist/pcd/index.cjs.map +7 -0
- package/dist/pcd/index.d.ts +8 -0
- package/dist/pcd/index.d.ts.map +1 -0
- package/dist/pcd/index.js +10 -0
- package/dist/pcd/index.js.map +1 -0
- package/dist/pcd/lib/decompress-lzf.cjs +80 -0
- package/dist/pcd/lib/decompress-lzf.cjs.map +7 -0
- package/dist/pcd/lib/decompress-lzf.d.ts +7 -0
- package/dist/pcd/lib/decompress-lzf.d.ts.map +1 -0
- package/dist/pcd/lib/decompress-lzf.js +62 -0
- package/dist/pcd/lib/decompress-lzf.js.map +1 -0
- package/dist/pcd/lib/get-pcd-schema.cjs +70 -0
- package/dist/pcd/lib/get-pcd-schema.cjs.map +7 -0
- package/dist/pcd/lib/get-pcd-schema.d.ts +10 -0
- package/dist/pcd/lib/get-pcd-schema.d.ts.map +1 -0
- package/dist/pcd/lib/get-pcd-schema.js +53 -0
- package/dist/pcd/lib/get-pcd-schema.js.map +1 -0
- package/dist/pcd/lib/parse-pcd.cjs +354 -0
- package/dist/pcd/lib/parse-pcd.cjs.map +7 -0
- package/dist/pcd/lib/parse-pcd.d.ts +20 -0
- package/dist/pcd/lib/parse-pcd.d.ts.map +1 -0
- package/dist/pcd/lib/parse-pcd.js +341 -0
- package/dist/pcd/lib/parse-pcd.js.map +1 -0
- package/dist/pcd/lib/pcd-types.cjs +19 -0
- package/dist/pcd/lib/pcd-types.cjs.map +7 -0
- package/dist/pcd/lib/pcd-types.d.ts +31 -0
- package/dist/pcd/lib/pcd-types.d.ts.map +1 -0
- package/dist/pcd/lib/pcd-types.js +5 -0
- package/dist/pcd/lib/pcd-types.js.map +1 -0
- package/dist/pcd/pcd-format.cjs +42 -0
- package/dist/pcd/pcd-format.cjs.map +7 -0
- package/dist/pcd/pcd-format.d.ts +16 -0
- package/dist/pcd/pcd-format.d.ts.map +1 -0
- package/dist/pcd/pcd-format.js +19 -0
- package/dist/pcd/pcd-format.js.map +1 -0
- package/dist/pcd/pcd-loader-types.cjs +64 -0
- package/dist/pcd/pcd-loader-types.cjs.map +7 -0
- package/dist/pcd/pcd-loader-types.d.ts +105 -0
- package/dist/pcd/pcd-loader-types.d.ts.map +1 -0
- package/dist/pcd/pcd-loader-types.js +35 -0
- package/dist/pcd/pcd-loader-types.js.map +1 -0
- package/dist/pcd/pcd-loader.cjs +144 -0
- package/dist/pcd/pcd-loader.cjs.map +7 -0
- package/dist/pcd/pcd-loader.d.ts +44 -0
- package/dist/pcd/pcd-loader.d.ts.map +1 -0
- package/dist/pcd/pcd-loader.js +128 -0
- package/dist/pcd/pcd-loader.js.map +1 -0
- package/dist/pcd/pcd-writer.cjs +134 -0
- package/dist/pcd/pcd-writer.cjs.map +7 -0
- package/dist/pcd/pcd-writer.d.ts +37 -0
- package/dist/pcd/pcd-writer.d.ts.map +1 -0
- package/dist/pcd/pcd-writer.js +115 -0
- package/dist/pcd/pcd-writer.js.map +1 -0
- package/dist/pcd/unbundled.cjs +33 -0
- package/dist/pcd/unbundled.cjs.map +7 -0
- package/dist/pcd/unbundled.d.ts +3 -0
- package/dist/pcd/unbundled.d.ts.map +1 -0
- package/dist/pcd/unbundled.js +5 -0
- package/dist/pcd/unbundled.js.map +1 -0
- package/dist/pcd/workers/pcd-worker.cjs +23 -0
- package/dist/pcd/workers/pcd-worker.cjs.map +7 -0
- package/dist/pcd/workers/pcd-worker.d.ts +2 -0
- package/dist/pcd/workers/pcd-worker.d.ts.map +1 -0
- package/dist/pcd/workers/pcd-worker.js +23 -0
- package/dist/pcd/workers/pcd-worker.js.map +1 -0
- package/dist/pcd-worker.js +17522 -0
- package/dist/ply/bundled.cjs +33 -0
- package/dist/ply/bundled.cjs.map +7 -0
- package/dist/ply/bundled.d.ts +3 -0
- package/dist/ply/bundled.d.ts.map +1 -0
- package/dist/ply/bundled.js +5 -0
- package/dist/ply/bundled.js.map +1 -0
- package/dist/ply/index.cjs +40 -0
- package/dist/ply/index.cjs.map +7 -0
- package/dist/ply/index.d.ts +8 -0
- package/dist/ply/index.d.ts.map +1 -0
- package/dist/ply/index.js +11 -0
- package/dist/ply/index.js.map +1 -0
- package/dist/ply/lib/get-ply-schema.cjs +126 -0
- package/dist/ply/lib/get-ply-schema.cjs.map +7 -0
- package/dist/ply/lib/get-ply-schema.d.ts +10 -0
- package/dist/ply/lib/get-ply-schema.d.ts.map +1 -0
- package/dist/ply/lib/get-ply-schema.js +117 -0
- package/dist/ply/lib/get-ply-schema.js.map +1 -0
- package/dist/ply/lib/normalize-ply.cjs +96 -0
- package/dist/ply/lib/normalize-ply.cjs.map +7 -0
- package/dist/ply/lib/normalize-ply.d.ts +8 -0
- package/dist/ply/lib/normalize-ply.d.ts.map +1 -0
- package/dist/ply/lib/normalize-ply.js +89 -0
- package/dist/ply/lib/normalize-ply.js.map +1 -0
- package/dist/ply/lib/parse-ply-arrow.cjs +552 -0
- package/dist/ply/lib/parse-ply-arrow.cjs.map +7 -0
- package/dist/ply/lib/parse-ply-arrow.d.ts +25 -0
- package/dist/ply/lib/parse-ply-arrow.d.ts.map +1 -0
- package/dist/ply/lib/parse-ply-arrow.js +493 -0
- package/dist/ply/lib/parse-ply-arrow.js.map +1 -0
- package/dist/ply/lib/parse-ply-in-batches.cjs +607 -0
- package/dist/ply/lib/parse-ply-in-batches.cjs.map +7 -0
- package/dist/ply/lib/parse-ply-in-batches.d.ts +9 -0
- package/dist/ply/lib/parse-ply-in-batches.d.ts.map +1 -0
- package/dist/ply/lib/parse-ply-in-batches.js +625 -0
- package/dist/ply/lib/parse-ply-in-batches.js.map +1 -0
- package/dist/ply/lib/parse-ply.cjs +755 -0
- package/dist/ply/lib/parse-ply.cjs.map +7 -0
- package/dist/ply/lib/parse-ply.d.ts +69 -0
- package/dist/ply/lib/parse-ply.d.ts.map +1 -0
- package/dist/ply/lib/parse-ply.js +851 -0
- package/dist/ply/lib/parse-ply.js.map +1 -0
- package/dist/ply/lib/ply-types.cjs +19 -0
- package/dist/ply/lib/ply-types.cjs.map +7 -0
- package/dist/ply/lib/ply-types.d.ts +37 -0
- package/dist/ply/lib/ply-types.d.ts.map +1 -0
- package/dist/ply/lib/ply-types.js +2 -0
- package/dist/ply/lib/ply-types.js.map +1 -0
- package/dist/ply/ply-format.cjs +43 -0
- package/dist/ply/ply-format.cjs.map +7 -0
- package/dist/ply/ply-format.d.ts +18 -0
- package/dist/ply/ply-format.d.ts.map +1 -0
- package/dist/ply/ply-format.js +22 -0
- package/dist/ply/ply-format.js.map +1 -0
- package/dist/ply/ply-loader-types.cjs +65 -0
- package/dist/ply/ply-loader-types.cjs.map +7 -0
- package/dist/ply/ply-loader-types.d.ts +111 -0
- package/dist/ply/ply-loader-types.d.ts.map +1 -0
- package/dist/ply/ply-loader-types.js +38 -0
- package/dist/ply/ply-loader-types.js.map +1 -0
- package/dist/ply/ply-loader.cjs +134 -0
- package/dist/ply/ply-loader.cjs.map +7 -0
- package/dist/ply/ply-loader.d.ts +44 -0
- package/dist/ply/ply-loader.d.ts.map +1 -0
- package/dist/ply/ply-loader.js +121 -0
- package/dist/ply/ply-loader.js.map +1 -0
- package/dist/ply/ply-writer.cjs +175 -0
- package/dist/ply/ply-writer.cjs.map +7 -0
- package/dist/ply/ply-writer.d.ts +37 -0
- package/dist/ply/ply-writer.d.ts.map +1 -0
- package/dist/ply/ply-writer.js +140 -0
- package/dist/ply/ply-writer.js.map +1 -0
- package/dist/ply/unbundled.cjs +33 -0
- package/dist/ply/unbundled.cjs.map +7 -0
- package/dist/ply/unbundled.d.ts +3 -0
- package/dist/ply/unbundled.d.ts.map +1 -0
- package/dist/ply/unbundled.js +5 -0
- package/dist/ply/unbundled.js.map +1 -0
- package/dist/ply/workers/ply-worker.cjs +34 -0
- package/dist/ply/workers/ply-worker.cjs.map +7 -0
- package/dist/ply/workers/ply-worker.d.ts +2 -0
- package/dist/ply/workers/ply-worker.d.ts.map +1 -0
- package/dist/ply/workers/ply-worker.js +37 -0
- package/dist/ply/workers/ply-worker.js.map +1 -0
- package/dist/ply-worker.js +19175 -0
- package/package.json +234 -4
- package/src/index.ts +19 -0
- package/src/las/bundled.ts +39 -0
- package/src/las/index.ts +70 -0
- package/src/las/las-copc-loader-types.ts +18 -0
- package/src/las/las-copc-loader.ts +61 -0
- package/src/las/las-format.ts +21 -0
- package/src/las/las-loader-shared.ts +124 -0
- package/src/las/las-loader-types.ts +27 -0
- package/src/las/las-loader.ts +109 -0
- package/src/las/las-writer.ts +1473 -0
- package/src/las/laz-rs-loader-types.ts +21 -0
- package/src/las/laz-rs-loader.ts +53 -0
- package/src/las/lazperf-loader-types.ts +22 -0
- package/src/las/lazperf-loader.ts +65 -0
- package/src/las/lib/LASZIP-LICENSE +202 -0
- package/src/las/lib/LASZIP-NOTICE +4 -0
- package/src/las/lib/copc/parse-las.ts +265 -0
- package/src/las/lib/get-las-schema.ts +50 -0
- package/src/las/lib/las-compatibility.ts +178 -0
- package/src/las/lib/las-extra-bytes.ts +274 -0
- package/src/las/lib/las-types.ts +206 -0
- package/src/las/lib/las-waveform.ts +292 -0
- package/src/las/lib/laz-perf/laslaz-decoder.ts +443 -0
- package/src/las/lib/laz-perf/parse-las.ts +412 -0
- package/src/las/lib/laz-rs-wasm/laslaz-decoder.ts +488 -0
- package/src/las/lib/laz-rs-wasm/parse-las.ts +412 -0
- package/src/las/lib/typescript/parse-las.ts +3730 -0
- package/src/las/libs/laz-perf/laz-perf.ts +20615 -0
- package/src/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts +89 -0
- package/src/las/libs/laz-rs-wasm/laz_rs_wasm.js +497 -0
- package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
- package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +38 -0
- package/src/las/libs/laz-rs-wasm/package.json +19 -0
- package/src/las/unbundled.ts +38 -0
- package/src/las/workers/las-worker.ts +24 -0
- package/src/pcd/bundled.ts +9 -0
- package/src/pcd/index.ts +13 -0
- package/src/pcd/lib/decompress-lzf.ts +68 -0
- package/src/pcd/lib/get-pcd-schema.ts +66 -0
- package/src/pcd/lib/parse-pcd.ts +474 -0
- package/src/pcd/lib/pcd-types.ts +34 -0
- package/src/pcd/pcd-format.ts +21 -0
- package/src/pcd/pcd-loader-types.ts +53 -0
- package/src/pcd/pcd-loader.ts +179 -0
- package/src/pcd/pcd-writer.ts +152 -0
- package/src/pcd/unbundled.ts +6 -0
- package/src/pcd/workers/pcd-worker.ts +24 -0
- package/src/ply/bundled.ts +9 -0
- package/src/ply/index.ts +15 -0
- package/src/ply/lib/get-ply-schema.ts +133 -0
- package/src/ply/lib/normalize-ply.ts +110 -0
- package/src/ply/lib/parse-ply-arrow.ts +676 -0
- package/src/ply/lib/parse-ply-in-batches.ts +827 -0
- package/src/ply/lib/parse-ply.ts +1081 -0
- package/src/ply/lib/ply-types.ts +47 -0
- package/src/ply/ply-format.ts +24 -0
- package/src/ply/ply-loader-types.ts +61 -0
- package/src/ply/ply-loader.ts +185 -0
- package/src/ply/ply-writer.ts +215 -0
- package/src/ply/unbundled.ts +6 -0
- package/src/ply/workers/ply-worker.ts +40 -0
- package/third-party-licenses/plasio-LICENSE +21 -0
- package/third-party-licenses/three-LICENSE +21 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {LASCompatibilityLayout} from './las-compatibility';
|
|
6
|
+
import type {Mesh} from '@loaders.gl/core/schema';
|
|
7
|
+
import type {WKTCRSDefinition} from '@math.gl/geospatial/crs';
|
|
8
|
+
|
|
9
|
+
/** LAS Variable Length Record metadata and payload. */
|
|
10
|
+
export type LASVariableLengthRecord = {
|
|
11
|
+
/** Reserved VLR field. */
|
|
12
|
+
reserved: number;
|
|
13
|
+
/** LAS VLR user id. */
|
|
14
|
+
userId: string;
|
|
15
|
+
/** LAS VLR record id. */
|
|
16
|
+
recordId: number;
|
|
17
|
+
/** VLR description string. */
|
|
18
|
+
description: string;
|
|
19
|
+
/** Byte offset of the VLR header in the source file. */
|
|
20
|
+
offset: number;
|
|
21
|
+
/** Raw VLR payload bytes. */
|
|
22
|
+
data: Uint8Array;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** LAS Extended Variable Length Record metadata and payload. */
|
|
26
|
+
export type LASExtendedVariableLengthRecord = {
|
|
27
|
+
/** Reserved EVLR field. */
|
|
28
|
+
reserved: number;
|
|
29
|
+
/** LAS EVLR user id. */
|
|
30
|
+
userId: string;
|
|
31
|
+
/** LAS EVLR record id. */
|
|
32
|
+
recordId: number;
|
|
33
|
+
/** EVLR description string. */
|
|
34
|
+
description: string;
|
|
35
|
+
/** Byte offset of the EVLR header in the source file. */
|
|
36
|
+
offset: number;
|
|
37
|
+
/** Raw EVLR payload bytes when available in memory. */
|
|
38
|
+
data?: Uint8Array;
|
|
39
|
+
/** Byte offset of the EVLR payload in the source file. */
|
|
40
|
+
dataOffset: number;
|
|
41
|
+
/** Byte length of the EVLR payload. */
|
|
42
|
+
dataLength: number;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** LAS Extra Bytes descriptor parsed from an Extra Bytes VLR. */
|
|
46
|
+
export type LASExtraBytesDescriptor = {
|
|
47
|
+
/** Extra Bytes data type code. */
|
|
48
|
+
dataType: number;
|
|
49
|
+
/** Extra Bytes options bit mask. */
|
|
50
|
+
options: number;
|
|
51
|
+
/** Extra Bytes field name. */
|
|
52
|
+
name: string;
|
|
53
|
+
/** Extra Bytes field description. */
|
|
54
|
+
description: string;
|
|
55
|
+
/** First descriptor scale value, used when option bit 3 is set. */
|
|
56
|
+
scale: number;
|
|
57
|
+
/** First descriptor offset value, used when option bit 4 is set. */
|
|
58
|
+
offset: number;
|
|
59
|
+
/** Per-component descriptor scale values for scalar and vector fields. */
|
|
60
|
+
scales: [number, number, number];
|
|
61
|
+
/** Per-component descriptor offset values for scalar and vector fields. */
|
|
62
|
+
offsets: [number, number, number];
|
|
63
|
+
/** Raw 192-byte descriptor payload. */
|
|
64
|
+
data: Uint8Array;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/** LAS waveform packet descriptor parsed from a waveform descriptor VLR. */
|
|
68
|
+
export type LASWaveformPacketDescriptor = {
|
|
69
|
+
/** Waveform descriptor record id. */
|
|
70
|
+
recordId: number;
|
|
71
|
+
/** Number of bits per waveform sample. */
|
|
72
|
+
bitsPerSample: number;
|
|
73
|
+
/** Waveform compression type. */
|
|
74
|
+
compressionType: number;
|
|
75
|
+
/** Number of samples in the waveform packet. */
|
|
76
|
+
numberOfSamples: number;
|
|
77
|
+
/** Temporal sample spacing in picoseconds. */
|
|
78
|
+
temporalSampleSpacing: number;
|
|
79
|
+
/** Digitizer gain. */
|
|
80
|
+
digitizerGain: number;
|
|
81
|
+
/** Digitizer offset. */
|
|
82
|
+
digitizerOffset: number;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** One resolved GeoTIFF GeoKey directory entry from LAS CRS metadata. */
|
|
86
|
+
export type LASGeoTIFFKey = {
|
|
87
|
+
/** GeoTIFF key identifier. */
|
|
88
|
+
keyId: number;
|
|
89
|
+
/** TIFF tag containing the value, or zero when the value is inline. */
|
|
90
|
+
tiffTagLocation: number;
|
|
91
|
+
/** Number of values referenced by this key. */
|
|
92
|
+
count: number;
|
|
93
|
+
/** Inline value or offset into the referenced GeoTIFF parameter tag. */
|
|
94
|
+
valueOffset: number;
|
|
95
|
+
/** Resolved scalar, numeric array, or ASCII value when its source tag is available. */
|
|
96
|
+
value?: number | number[] | string;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/** Parsed GeoTIFF GeoKey directory header and entries. */
|
|
100
|
+
export type LASGeoTIFFKeyDirectory = {
|
|
101
|
+
/** GeoKey directory format version. */
|
|
102
|
+
version: number;
|
|
103
|
+
/** GeoKey revision. */
|
|
104
|
+
keyRevision: number;
|
|
105
|
+
/** GeoKey minor revision. */
|
|
106
|
+
minorRevision: number;
|
|
107
|
+
/** Resolved GeoKey entries. */
|
|
108
|
+
entries: LASGeoTIFFKey[];
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/** Typed metadata parsed from a LAS file. */
|
|
112
|
+
export type LASMetadata = {
|
|
113
|
+
/** File source id from the public header. */
|
|
114
|
+
fileSourceId: number;
|
|
115
|
+
/** Global encoding bit field from the public header. */
|
|
116
|
+
globalEncoding: number;
|
|
117
|
+
/** Start of the internal waveform data packet record, preserved as an exact uint64. */
|
|
118
|
+
waveformDataOffset?: bigint;
|
|
119
|
+
/** Project identifier as a UUID string. */
|
|
120
|
+
projectId: string;
|
|
121
|
+
/** System identifier string. */
|
|
122
|
+
systemIdentifier: string;
|
|
123
|
+
/** Generating software string. */
|
|
124
|
+
generatingSoftware: string;
|
|
125
|
+
/** File creation day of year. */
|
|
126
|
+
creationDayOfYear: number;
|
|
127
|
+
/** File creation year. */
|
|
128
|
+
creationYear: number;
|
|
129
|
+
/** LAS header byte length. */
|
|
130
|
+
headerSize: number;
|
|
131
|
+
/** LAS header extension bytes after the standard 393-byte LAS 1.5 header. */
|
|
132
|
+
userHeaderData?: Uint8Array;
|
|
133
|
+
/** Number of VLRs before point data. */
|
|
134
|
+
vlrCount: number;
|
|
135
|
+
/** Offset of first EVLR, or zero when absent. */
|
|
136
|
+
evlrOffset?: number;
|
|
137
|
+
/** Number of EVLRs after point data. */
|
|
138
|
+
evlrCount?: number;
|
|
139
|
+
/** Extended point count by return. */
|
|
140
|
+
pointsByReturn?: number[];
|
|
141
|
+
/** LAS 1.5 maximum GPS time. */
|
|
142
|
+
maxGpsTime?: number;
|
|
143
|
+
/** LAS 1.5 minimum GPS time. */
|
|
144
|
+
minGpsTime?: number;
|
|
145
|
+
/** LAS 1.5 GPS time offset. */
|
|
146
|
+
timeOffset?: number;
|
|
147
|
+
/** Parsed VLR records. */
|
|
148
|
+
vlrs: LASVariableLengthRecord[];
|
|
149
|
+
/** Parsed EVLR records when available. */
|
|
150
|
+
evlrs: LASExtendedVariableLengthRecord[];
|
|
151
|
+
/** WKT coordinate reference system text when present. */
|
|
152
|
+
wkt?: WKTCRSDefinition;
|
|
153
|
+
/** WKT math transform text when present. */
|
|
154
|
+
wktMathTransform?: string;
|
|
155
|
+
/** GeoTIFF VLRs retained for legacy LAS versions. */
|
|
156
|
+
geotiff?: {
|
|
157
|
+
/** GeoKeyDirectoryTag payload. */
|
|
158
|
+
keys?: Uint16Array;
|
|
159
|
+
/** GeoDoubleParamsTag payload. */
|
|
160
|
+
doubles?: Float64Array;
|
|
161
|
+
/** GeoAsciiParamsTag payload. */
|
|
162
|
+
ascii?: string;
|
|
163
|
+
/** Parsed and resolved GeoKey directory entries. */
|
|
164
|
+
keyDirectory?: LASGeoTIFFKeyDirectory;
|
|
165
|
+
};
|
|
166
|
+
/** Validated LASzip compatibility-mode layout and logical format. */
|
|
167
|
+
compatibility?: LASCompatibilityLayout;
|
|
168
|
+
/** Extra Bytes descriptors parsed from the Extra Bytes VLR. */
|
|
169
|
+
extraBytes: LASExtraBytesDescriptor[];
|
|
170
|
+
/** Waveform packet descriptors parsed from waveform descriptor VLRs. */
|
|
171
|
+
waveformPacketDescriptors: LASWaveformPacketDescriptor[];
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Type for header of the .las file
|
|
176
|
+
*/
|
|
177
|
+
export type LASHeader = {
|
|
178
|
+
pointsOffset: number;
|
|
179
|
+
pointsFormatId: number;
|
|
180
|
+
pointsStructSize: number;
|
|
181
|
+
pointsCount: number;
|
|
182
|
+
scale: [number, number, number];
|
|
183
|
+
offset: [number, number, number];
|
|
184
|
+
maxs?: number[];
|
|
185
|
+
mins?: number[];
|
|
186
|
+
totalToRead: number;
|
|
187
|
+
totalRead: number;
|
|
188
|
+
hasColor: boolean;
|
|
189
|
+
versionAsString?: string;
|
|
190
|
+
isCompressed?: boolean;
|
|
191
|
+
headerSize?: number;
|
|
192
|
+
/** LAS header extension bytes after the standard 393-byte LAS 1.5 header. */
|
|
193
|
+
userHeaderData?: Uint8Array;
|
|
194
|
+
vlrCount?: number;
|
|
195
|
+
metadata?: LASMetadata;
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* loaders.gl Mesh with Draco specific data
|
|
200
|
+
*/
|
|
201
|
+
export type LASMesh = Mesh & {
|
|
202
|
+
loader: 'las';
|
|
203
|
+
loaderData: LASHeader; // Draco specific data
|
|
204
|
+
topology: 'point-list';
|
|
205
|
+
mode: 0;
|
|
206
|
+
};
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {ReadableFile} from '@loaders.gl/core/loader-utils';
|
|
6
|
+
import type {LASMetadata, LASWaveformPacketDescriptor} from './las-types';
|
|
7
|
+
|
|
8
|
+
const WAVEFORM_PACKET_REFERENCE_BYTE_LENGTH = 29;
|
|
9
|
+
const INTERNAL_WAVEFORM_DATA_MASK = 1 << 1;
|
|
10
|
+
const EXTERNAL_WAVEFORM_DATA_MASK = 1 << 2;
|
|
11
|
+
|
|
12
|
+
/** Location of waveform packet data selected by the LAS global-encoding field. */
|
|
13
|
+
export type LASWaveformStorage = 'internal' | 'external';
|
|
14
|
+
|
|
15
|
+
/** Lossless fields stored in one PDRF 4, 5, 9, or 10 waveform packet reference. */
|
|
16
|
+
export type LASWaveformPacketReference = {
|
|
17
|
+
/** Waveform descriptor index; descriptor VLR record id is this value plus 99. */
|
|
18
|
+
descriptorIndex: number;
|
|
19
|
+
/** Packet byte offset relative to the waveform data packet record. */
|
|
20
|
+
byteOffset: bigint;
|
|
21
|
+
/** Packet byte length. */
|
|
22
|
+
byteLength: number;
|
|
23
|
+
/** Temporal offset in picoseconds from the waveform anchor to this return. */
|
|
24
|
+
returnPointLocation: number;
|
|
25
|
+
/** Parametric XYZ offsets per picosecond. */
|
|
26
|
+
parametricOffset: [number, number, number];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Decoded waveform packet and the metadata required to interpret its samples. */
|
|
30
|
+
export type LASWaveformPacket = {
|
|
31
|
+
/** Original lossless point-record reference. */
|
|
32
|
+
reference: LASWaveformPacketReference;
|
|
33
|
+
/** Descriptor selected by the packet reference. */
|
|
34
|
+
descriptor: LASWaveformPacketDescriptor;
|
|
35
|
+
/** Absolute byte offset read from the supplied LAS or WDP source. */
|
|
36
|
+
sourceByteOffset: bigint;
|
|
37
|
+
/** Exact packet bytes read from the source. */
|
|
38
|
+
data: Uint8Array;
|
|
39
|
+
/** Unsigned integer sample values decoded from the packet. */
|
|
40
|
+
samples: Uint32Array;
|
|
41
|
+
/** Sample amplitudes after applying descriptor gain and offset. */
|
|
42
|
+
amplitudes: Float64Array;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Options for waveform packet range reads. */
|
|
46
|
+
export type LASWaveformReadOptions = {
|
|
47
|
+
/** Abort signal forwarded to the underlying range read. */
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
/** Maximum simultaneous reads used by `readLASWaveformPackets`. */
|
|
50
|
+
concurrency?: number;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Parses one fixed-width LAS waveform packet reference without losing its 64-bit offset.
|
|
55
|
+
* @param data Buffer or view containing the reference.
|
|
56
|
+
* @param byteOffset Byte offset of the reference within `data`.
|
|
57
|
+
* @returns Parsed packet reference.
|
|
58
|
+
*/
|
|
59
|
+
export function parseLASWaveformPacketReference(
|
|
60
|
+
data: ArrayBuffer | ArrayBufferView,
|
|
61
|
+
byteOffset = 0
|
|
62
|
+
): LASWaveformPacketReference {
|
|
63
|
+
const bytes = getUint8Array(data);
|
|
64
|
+
if (
|
|
65
|
+
!Number.isInteger(byteOffset) ||
|
|
66
|
+
byteOffset < 0 ||
|
|
67
|
+
byteOffset + WAVEFORM_PACKET_REFERENCE_BYTE_LENGTH > bytes.byteLength
|
|
68
|
+
) {
|
|
69
|
+
throw new Error('LAS waveform packet reference is truncated');
|
|
70
|
+
}
|
|
71
|
+
const dataView = new DataView(
|
|
72
|
+
bytes.buffer,
|
|
73
|
+
bytes.byteOffset + byteOffset,
|
|
74
|
+
WAVEFORM_PACKET_REFERENCE_BYTE_LENGTH
|
|
75
|
+
);
|
|
76
|
+
return {
|
|
77
|
+
descriptorIndex: dataView.getUint8(0),
|
|
78
|
+
byteOffset: dataView.getBigUint64(1, true),
|
|
79
|
+
byteLength: dataView.getUint32(9, true),
|
|
80
|
+
returnPointLocation: dataView.getFloat32(13, true),
|
|
81
|
+
parametricOffset: [
|
|
82
|
+
dataView.getFloat32(17, true),
|
|
83
|
+
dataView.getFloat32(21, true),
|
|
84
|
+
dataView.getFloat32(25, true)
|
|
85
|
+
]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Returns the waveform storage selected by LAS global-encoding bits.
|
|
91
|
+
* @param metadata Parsed LAS metadata.
|
|
92
|
+
* @returns Internal or external storage, or `null` when the file declares neither.
|
|
93
|
+
*/
|
|
94
|
+
export function getLASWaveformStorage(metadata: LASMetadata): LASWaveformStorage | null {
|
|
95
|
+
const hasInternalData = Boolean(metadata.globalEncoding & INTERNAL_WAVEFORM_DATA_MASK);
|
|
96
|
+
const hasExternalData = Boolean(metadata.globalEncoding & EXTERNAL_WAVEFORM_DATA_MASK);
|
|
97
|
+
if (hasInternalData && hasExternalData) {
|
|
98
|
+
throw new Error('LAS waveform data cannot be both internal and external');
|
|
99
|
+
}
|
|
100
|
+
return hasInternalData ? 'internal' : hasExternalData ? 'external' : null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Decodes uncompressed 2-32 bit LAS waveform samples.
|
|
105
|
+
* @param data Exact waveform packet bytes.
|
|
106
|
+
* @param descriptor Waveform descriptor selected by the point record.
|
|
107
|
+
* @returns Unsigned integer waveform samples.
|
|
108
|
+
*/
|
|
109
|
+
export function decodeLASWaveformSamples(
|
|
110
|
+
data: Uint8Array,
|
|
111
|
+
descriptor: LASWaveformPacketDescriptor
|
|
112
|
+
): Uint32Array {
|
|
113
|
+
const requiredByteLength = validateLASWaveformDescriptor(descriptor);
|
|
114
|
+
if (data.byteLength < requiredByteLength) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
`LAS waveform packet is truncated: expected ${requiredByteLength} bytes, received ${data.byteLength}`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const bitsPerSample = descriptor.bitsPerSample;
|
|
121
|
+
const samples = new Uint32Array(descriptor.numberOfSamples);
|
|
122
|
+
const sampleDivisor = 2 ** bitsPerSample;
|
|
123
|
+
let bitBuffer = 0;
|
|
124
|
+
let availableBitCount = 0;
|
|
125
|
+
let sourceByteIndex = 0;
|
|
126
|
+
for (let sampleIndex = 0; sampleIndex < samples.length; sampleIndex++) {
|
|
127
|
+
while (availableBitCount < bitsPerSample) {
|
|
128
|
+
bitBuffer += data[sourceByteIndex++] * 2 ** availableBitCount;
|
|
129
|
+
availableBitCount += 8;
|
|
130
|
+
}
|
|
131
|
+
samples[sampleIndex] = bitBuffer % sampleDivisor;
|
|
132
|
+
bitBuffer = Math.floor(bitBuffer / sampleDivisor);
|
|
133
|
+
availableBitCount -= bitsPerSample;
|
|
134
|
+
}
|
|
135
|
+
return samples;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Validates one waveform descriptor and returns its uncompressed packet byte length. */
|
|
139
|
+
function validateLASWaveformDescriptor(descriptor: LASWaveformPacketDescriptor): number {
|
|
140
|
+
if (descriptor.compressionType !== 0) {
|
|
141
|
+
throw new Error(`LAS waveform compression type ${descriptor.compressionType} is not supported`);
|
|
142
|
+
}
|
|
143
|
+
const bitsPerSample = descriptor.bitsPerSample;
|
|
144
|
+
if (!Number.isInteger(bitsPerSample) || bitsPerSample < 2 || bitsPerSample > 32) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
`LAS waveform bits per sample must be between 2 and 32; received ${bitsPerSample}`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
if (!Number.isInteger(descriptor.numberOfSamples) || descriptor.numberOfSamples < 0) {
|
|
150
|
+
throw new Error(`LAS waveform sample count ${descriptor.numberOfSamples} is invalid`);
|
|
151
|
+
}
|
|
152
|
+
const requiredByteLength = Math.ceil((descriptor.numberOfSamples * bitsPerSample) / 8);
|
|
153
|
+
if (!Number.isSafeInteger(requiredByteLength) || requiredByteLength < 0) {
|
|
154
|
+
throw new Error(`LAS waveform sample count ${descriptor.numberOfSamples} is invalid`);
|
|
155
|
+
}
|
|
156
|
+
return requiredByteLength;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Applies waveform descriptor gain and offset to integer samples.
|
|
161
|
+
* @param samples Unsigned integer waveform samples.
|
|
162
|
+
* @param descriptor Waveform descriptor containing gain and offset.
|
|
163
|
+
* @returns Scaled sample amplitudes.
|
|
164
|
+
*/
|
|
165
|
+
export function scaleLASWaveformSamples(
|
|
166
|
+
samples: Uint32Array,
|
|
167
|
+
descriptor: LASWaveformPacketDescriptor
|
|
168
|
+
): Float64Array {
|
|
169
|
+
const amplitudes = new Float64Array(samples.length);
|
|
170
|
+
for (let sampleIndex = 0; sampleIndex < samples.length; sampleIndex++) {
|
|
171
|
+
amplitudes[sampleIndex] =
|
|
172
|
+
descriptor.digitizerOffset + descriptor.digitizerGain * samples[sampleIndex];
|
|
173
|
+
}
|
|
174
|
+
return amplitudes;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Range-reads and decodes one internal LAS or external WDP waveform packet.
|
|
179
|
+
*
|
|
180
|
+
* Supply the LAS file when `metadata.globalEncoding` declares internal waveform data and the
|
|
181
|
+
* companion WDP file when it declares external waveform data.
|
|
182
|
+
*
|
|
183
|
+
* @param source Random-access LAS or WDP source selected by the file's global-encoding field.
|
|
184
|
+
* @param reference Lossless waveform packet reference from a point record.
|
|
185
|
+
* @param metadata Parsed metadata from the owning LAS file.
|
|
186
|
+
* @param options Range-read options.
|
|
187
|
+
* @returns Decoded waveform packet.
|
|
188
|
+
*/
|
|
189
|
+
export async function readLASWaveformPacket(
|
|
190
|
+
source: ReadableFile,
|
|
191
|
+
reference: LASWaveformPacketReference,
|
|
192
|
+
metadata: LASMetadata,
|
|
193
|
+
options: LASWaveformReadOptions = {}
|
|
194
|
+
): Promise<LASWaveformPacket> {
|
|
195
|
+
const storage = getLASWaveformStorage(metadata);
|
|
196
|
+
if (!storage) {
|
|
197
|
+
throw new Error('LAS file does not declare internal or external waveform data');
|
|
198
|
+
}
|
|
199
|
+
if (reference.descriptorIndex === 0) {
|
|
200
|
+
throw new Error('LAS waveform descriptor index 0 does not reference a waveform packet');
|
|
201
|
+
}
|
|
202
|
+
const descriptorRecordId = reference.descriptorIndex + 99;
|
|
203
|
+
const descriptor = metadata.waveformPacketDescriptors.find(
|
|
204
|
+
candidate => candidate.recordId === descriptorRecordId
|
|
205
|
+
);
|
|
206
|
+
if (!descriptor) {
|
|
207
|
+
throw new Error(`LAS waveform descriptor VLR ${descriptorRecordId} is missing`);
|
|
208
|
+
}
|
|
209
|
+
const requiredByteLength = validateLASWaveformDescriptor(descriptor);
|
|
210
|
+
if (!Number.isInteger(reference.byteLength) || reference.byteLength < requiredByteLength) {
|
|
211
|
+
throw new Error(
|
|
212
|
+
`LAS waveform packet size ${reference.byteLength} is smaller than the descriptor requires (${requiredByteLength})`
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
const sourceByteOffset =
|
|
216
|
+
storage === 'internal'
|
|
217
|
+
? getInternalWaveformSourceOffset(metadata) + reference.byteOffset
|
|
218
|
+
: reference.byteOffset;
|
|
219
|
+
const arrayBuffer = await source.read(sourceByteOffset, reference.byteLength, options.signal);
|
|
220
|
+
if (arrayBuffer.byteLength !== reference.byteLength) {
|
|
221
|
+
throw new Error(
|
|
222
|
+
`LAS waveform range read returned ${arrayBuffer.byteLength} bytes; expected ${reference.byteLength}`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
const data = new Uint8Array(arrayBuffer);
|
|
226
|
+
const samples = decodeLASWaveformSamples(data, descriptor);
|
|
227
|
+
return {
|
|
228
|
+
reference,
|
|
229
|
+
descriptor,
|
|
230
|
+
sourceByteOffset,
|
|
231
|
+
data,
|
|
232
|
+
samples,
|
|
233
|
+
amplitudes: scaleLASWaveformSamples(samples, descriptor)
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Range-reads multiple waveform packets with bounded concurrency.
|
|
239
|
+
* @param source Random-access LAS or WDP source selected by the file's global-encoding field.
|
|
240
|
+
* @param references Waveform packet references in desired result order.
|
|
241
|
+
* @param metadata Parsed metadata from the owning LAS file.
|
|
242
|
+
* @param options Range-read and concurrency options.
|
|
243
|
+
* @returns Decoded waveform packets in input order.
|
|
244
|
+
*/
|
|
245
|
+
export async function readLASWaveformPackets(
|
|
246
|
+
source: ReadableFile,
|
|
247
|
+
references: Iterable<LASWaveformPacketReference>,
|
|
248
|
+
metadata: LASMetadata,
|
|
249
|
+
options: LASWaveformReadOptions = {}
|
|
250
|
+
): Promise<LASWaveformPacket[]> {
|
|
251
|
+
const referenceArray = Array.from(references);
|
|
252
|
+
const concurrency = options.concurrency ?? 8;
|
|
253
|
+
if (!Number.isInteger(concurrency) || concurrency < 1) {
|
|
254
|
+
throw new Error(
|
|
255
|
+
`LAS waveform read concurrency must be a positive integer; received ${concurrency}`
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
const packets = new Array<LASWaveformPacket>(referenceArray.length);
|
|
259
|
+
let nextReferenceIndex = 0;
|
|
260
|
+
|
|
261
|
+
/** Reads packet references from the shared index until none remain. */
|
|
262
|
+
const readNextPackets = async (): Promise<void> => {
|
|
263
|
+
while (nextReferenceIndex < referenceArray.length) {
|
|
264
|
+
const referenceIndex = nextReferenceIndex++;
|
|
265
|
+
packets[referenceIndex] = await readLASWaveformPacket(
|
|
266
|
+
source,
|
|
267
|
+
referenceArray[referenceIndex],
|
|
268
|
+
metadata,
|
|
269
|
+
options
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
const workerCount = Math.min(concurrency, referenceArray.length);
|
|
275
|
+
await Promise.all(Array.from({length: workerCount}, () => readNextPackets()));
|
|
276
|
+
return packets;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Return the exact internal waveform packet-record base offset from the LAS public header. */
|
|
280
|
+
function getInternalWaveformSourceOffset(metadata: LASMetadata): bigint {
|
|
281
|
+
if (metadata.waveformDataOffset === undefined) {
|
|
282
|
+
throw new Error('LAS internal waveform data offset is missing from the public header');
|
|
283
|
+
}
|
|
284
|
+
return metadata.waveformDataOffset;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** Create a byte view that preserves an input view's byte offset and byte length. */
|
|
288
|
+
function getUint8Array(data: ArrayBuffer | ArrayBufferView): Uint8Array {
|
|
289
|
+
return data instanceof ArrayBuffer
|
|
290
|
+
? new Uint8Array(data)
|
|
291
|
+
: new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
292
|
+
}
|