@loaders.gl/pointclouds 0.0.0-stage → 5.0.0-beta.10
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 +11 -2
- package/THIRD-PARTY-NOTICES.md +27 -0
- package/dist/dist.dev.js +31514 -0
- package/dist/dist.min.js +54 -0
- package/dist/index.cjs +55 -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 +69 -0
- package/dist/las/bundled.cjs.map +7 -0
- package/dist/las/bundled.d.ts +11 -0
- package/dist/las/bundled.d.ts.map +1 -0
- package/dist/las/bundled.js +11 -0
- package/dist/las/bundled.js.map +1 -0
- package/dist/las/index.cjs +75 -0
- package/dist/las/index.cjs.map +7 -0
- package/dist/las/index.d.ts +15 -0
- package/dist/las/index.d.ts.map +1 -0
- package/dist/las/index.js +12 -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 +67 -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 +60 -0
- package/dist/las/las-copc-loader.cjs.map +7 -0
- package/dist/las/las-copc-loader.d.ts +39 -0
- package/dist/las/las-copc-loader.d.ts.map +1 -0
- package/dist/las/las-copc-loader.js +45 -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 +84 -0
- package/dist/las/las-loader-shared.cjs.map +7 -0
- package/dist/las/las-loader-shared.d.ts +68 -0
- package/dist/las/las-loader-shared.d.ts.map +1 -0
- package/dist/las/las-loader-shared.js +60 -0
- package/dist/las/las-loader-shared.js.map +1 -0
- package/dist/las/las-loader-types.cjs +51 -0
- package/dist/las/las-loader-types.cjs.map +7 -0
- package/dist/las/las-loader-types.d.ts +77 -0
- package/dist/las/las-loader-types.d.ts.map +1 -0
- package/dist/las/las-loader-types.js +17 -0
- package/dist/las/las-loader-types.js.map +1 -0
- package/dist/las/las-loader.cjs +128 -0
- package/dist/las/las-loader.cjs.map +7 -0
- package/dist/las/las-loader.d.ts +91 -0
- package/dist/las/las-loader.d.ts.map +1 -0
- package/dist/las/las-loader.js +108 -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 +70 -0
- package/dist/las/las-writer.d.ts.map +1 -0
- package/dist/las/las-writer.js +992 -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 +69 -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 +275 -0
- package/dist/las/laz-rs-loader.cjs.map +7 -0
- package/dist/las/laz-rs-loader.d.ts +39 -0
- package/dist/las/laz-rs-loader.d.ts.map +1 -0
- package/dist/las/laz-rs-loader.js +43 -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 +71 -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 +63 -0
- package/dist/las/lazperf-loader.cjs.map +7 -0
- package/dist/las/lazperf-loader.d.ts +41 -0
- package/dist/las/lazperf-loader.d.ts.map +1 -0
- package/dist/las/lazperf-loader.js +49 -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 +67 -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 +52 -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 +228 -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 +197 -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 +271 -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 +308 -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 +271 -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 +308 -0
- package/dist/las/lib/laz-rs-wasm/parse-las.js.map +1 -0
- package/dist/las/lib/typescript/parse-las.cjs +2889 -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 +2703 -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 +69 -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-copc-loader-types.cjs +51 -0
- package/dist/las-copc-loader-types.cjs.map +7 -0
- package/dist/las-copc-loader-types.d.ts +2 -0
- package/dist/las-copc-loader-types.d.ts.map +1 -0
- package/dist/las-copc-loader-types.js +2 -0
- package/dist/las-copc-loader-types.js.map +1 -0
- package/dist/las-copc-loader.cjs +62 -0
- package/dist/las-copc-loader.cjs.map +7 -0
- package/dist/las-copc-loader.d.ts +2 -0
- package/dist/las-copc-loader.d.ts.map +1 -0
- package/dist/las-copc-loader.js +2 -0
- package/dist/las-copc-loader.js.map +1 -0
- package/dist/las-loader-types.cjs +53 -0
- package/dist/las-loader-types.cjs.map +7 -0
- package/dist/las-loader-types.d.ts +2 -0
- package/dist/las-loader-types.d.ts.map +1 -0
- package/dist/las-loader-types.js +2 -0
- package/dist/las-loader-types.js.map +1 -0
- package/dist/las-loader.cjs +130 -0
- package/dist/las-loader.cjs.map +7 -0
- package/dist/las-loader.d.ts +2 -0
- package/dist/las-loader.d.ts.map +1 -0
- package/dist/las-loader.js +2 -0
- package/dist/las-loader.js.map +1 -0
- package/dist/las-worker.js +24024 -0
- package/dist/las-writer.cjs +1056 -0
- package/dist/las-writer.cjs.map +7 -0
- package/dist/las-writer.d.ts +2 -0
- package/dist/las-writer.d.ts.map +1 -0
- package/dist/las-writer.js +2 -0
- package/dist/las-writer.js.map +1 -0
- package/dist/laz-rs-loader-types.cjs +51 -0
- package/dist/laz-rs-loader-types.cjs.map +7 -0
- package/dist/laz-rs-loader-types.d.ts +2 -0
- package/dist/laz-rs-loader-types.d.ts.map +1 -0
- package/dist/laz-rs-loader-types.js +2 -0
- package/dist/laz-rs-loader-types.js.map +1 -0
- package/dist/laz-rs-loader.cjs +277 -0
- package/dist/laz-rs-loader.cjs.map +7 -0
- package/dist/laz-rs-loader.d.ts +2 -0
- package/dist/laz-rs-loader.d.ts.map +1 -0
- package/dist/laz-rs-loader.js +2 -0
- package/dist/laz-rs-loader.js.map +1 -0
- package/dist/lazperf-loader-types.cjs +51 -0
- package/dist/lazperf-loader-types.cjs.map +7 -0
- package/dist/lazperf-loader-types.d.ts +2 -0
- package/dist/lazperf-loader-types.d.ts.map +1 -0
- package/dist/lazperf-loader-types.js +2 -0
- package/dist/lazperf-loader-types.js.map +1 -0
- package/dist/lazperf-loader.cjs +65 -0
- package/dist/lazperf-loader.cjs.map +7 -0
- package/dist/lazperf-loader.d.ts +2 -0
- package/dist/lazperf-loader.d.ts.map +1 -0
- package/dist/lazperf-loader.js +2 -0
- package/dist/lazperf-loader.js.map +1 -0
- package/dist/pcd/bundled.cjs +31 -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 +37 -0
- package/dist/pcd/index.cjs.map +7 -0
- package/dist/pcd/index.d.ts +6 -0
- package/dist/pcd/index.d.ts.map +1 -0
- package/dist/pcd/index.js +7 -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 +63 -0
- package/dist/pcd/pcd-loader-types.cjs.map +7 -0
- package/dist/pcd/pcd-loader-types.d.ts +82 -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 +201 -0
- package/dist/pcd/pcd-loader.cjs.map +7 -0
- package/dist/pcd/pcd-loader.d.ts +80 -0
- package/dist/pcd/pcd-loader.d.ts.map +1 -0
- package/dist/pcd/pcd-loader.js +179 -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 +38 -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 +31 -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-loader-types.cjs +65 -0
- package/dist/pcd-loader-types.cjs.map +7 -0
- package/dist/pcd-loader-types.d.ts +2 -0
- package/dist/pcd-loader-types.d.ts.map +1 -0
- package/dist/pcd-loader-types.js +2 -0
- package/dist/pcd-loader-types.js.map +1 -0
- package/dist/pcd-loader.cjs +203 -0
- package/dist/pcd-loader.cjs.map +7 -0
- package/dist/pcd-loader.d.ts +2 -0
- package/dist/pcd-loader.d.ts.map +1 -0
- package/dist/pcd-loader.js +2 -0
- package/dist/pcd-loader.js.map +1 -0
- package/dist/pcd-worker.js +18561 -0
- package/dist/pcd-writer.cjs +136 -0
- package/dist/pcd-writer.cjs.map +7 -0
- package/dist/pcd-writer.d.ts +2 -0
- package/dist/pcd-writer.d.ts.map +1 -0
- package/dist/pcd-writer.js +2 -0
- package/dist/pcd-writer.js.map +1 -0
- package/dist/ply/bundled.cjs +31 -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 +37 -0
- package/dist/ply/index.cjs.map +7 -0
- package/dist/ply/index.d.ts +6 -0
- package/dist/ply/index.d.ts.map +1 -0
- package/dist/ply/index.js +8 -0
- package/dist/ply/index.js.map +1 -0
- package/dist/ply/lib/get-ply-schema.cjs +128 -0
- package/dist/ply/lib/get-ply-schema.cjs.map +7 -0
- package/dist/ply/lib/get-ply-schema.d.ts +16 -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 +613 -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 +630 -0
- package/dist/ply/lib/parse-ply-in-batches.js.map +1 -0
- package/dist/ply/lib/parse-ply.cjs +758 -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 +855 -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 +64 -0
- package/dist/ply/ply-loader-types.cjs.map +7 -0
- package/dist/ply/ply-loader-types.d.ts +88 -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 +192 -0
- package/dist/ply/ply-loader.cjs.map +7 -0
- package/dist/ply/ply-loader.d.ts +81 -0
- package/dist/ply/ply-loader.d.ts.map +1 -0
- package/dist/ply/ply-loader.js +173 -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 +38 -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 +31 -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-loader-types.cjs +66 -0
- package/dist/ply-loader-types.cjs.map +7 -0
- package/dist/ply-loader-types.d.ts +2 -0
- package/dist/ply-loader-types.d.ts.map +1 -0
- package/dist/ply-loader-types.js +2 -0
- package/dist/ply-loader-types.js.map +1 -0
- package/dist/ply-loader.cjs +194 -0
- package/dist/ply-loader.cjs.map +7 -0
- package/dist/ply-loader.d.ts +2 -0
- package/dist/ply-loader.d.ts.map +1 -0
- package/dist/ply-loader.js +2 -0
- package/dist/ply-loader.js.map +1 -0
- package/dist/ply-worker.js +20962 -0
- package/dist/ply-writer.cjs +177 -0
- package/dist/ply-writer.cjs.map +7 -0
- package/dist/ply-writer.d.ts +2 -0
- package/dist/ply-writer.d.ts.map +1 -0
- package/dist/ply-writer.js +2 -0
- package/dist/ply-writer.js.map +1 -0
- package/package.json +238 -4
- package/src/index.ts +19 -0
- package/src/las/bundled.ts +38 -0
- package/src/las/index.ts +66 -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 +126 -0
- package/src/las/las-loader-types.ts +24 -0
- package/src/las/las-loader.ts +163 -0
- package/src/las/las-writer.ts +1477 -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 +55 -0
- package/src/las/lib/las-compatibility.ts +178 -0
- package/src/las/lib/las-extra-bytes.ts +276 -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 +411 -0
- package/src/las/lib/laz-rs-wasm/laslaz-decoder.ts +488 -0
- package/src/las/lib/laz-rs-wasm/parse-las.ts +411 -0
- package/src/las/lib/typescript/parse-las.ts +3862 -0
- package/src/las/libs/laz-perf/laz-perf.ts +20615 -0
- package/src/las/libs/laz-rs-wasm/README.md +5 -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 +25 -0
- package/src/las/unbundled.ts +38 -0
- package/src/las/workers/las-worker.ts +24 -0
- package/src/las-copc-loader-types.ts +1 -0
- package/src/las-copc-loader.ts +1 -0
- package/src/las-loader-types.ts +1 -0
- package/src/las-loader.ts +1 -0
- package/src/las-writer.ts +1 -0
- package/src/laz-rs-loader-types.ts +1 -0
- package/src/laz-rs-loader.ts +1 -0
- package/src/lazperf-loader-types.ts +1 -0
- package/src/lazperf-loader.ts +1 -0
- package/src/pcd/bundled.ts +6 -0
- package/src/pcd/index.ts +9 -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 +52 -0
- package/src/pcd/pcd-loader.ts +247 -0
- package/src/pcd/pcd-writer.ts +156 -0
- package/src/pcd/unbundled.ts +6 -0
- package/src/pcd/workers/pcd-worker.ts +24 -0
- package/src/pcd-loader-types.ts +1 -0
- package/src/pcd-loader.ts +1 -0
- package/src/pcd-writer.ts +1 -0
- package/src/ply/bundled.ts +6 -0
- package/src/ply/index.ts +11 -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 +832 -0
- package/src/ply/lib/parse-ply.ts +1084 -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 +60 -0
- package/src/ply/ply-loader.ts +255 -0
- package/src/ply/ply-writer.ts +219 -0
- package/src/ply/unbundled.ts +6 -0
- package/src/ply/workers/ply-worker.ts +40 -0
- package/src/ply-loader-types.ts +1 -0
- package/src/ply-loader.ts +1 -0
- package/src/ply-writer.ts +1 -0
- package/third-party-licenses/plasio-LICENSE +21 -0
- package/third-party-licenses/three-LICENSE +21 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/las/lib/typescript/parse-las.ts"],
|
|
4
|
+
"sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {makeArrowMetadataBatch, updateArrowTableMetadata} from '@loaders.gl/core/schema-utils';\nimport * as arrow from 'apache-arrow';\nimport {makeMetadataFromLasHeader} from '../get-las-schema';\nimport type {MeshArrowTable, MeshAttributes} from '@loaders.gl/core/schema';\nimport {makeMeshArrowTable, type MeshArrowAttributes} from '@loaders.gl/core/schema-utils';\nimport {\n BinaryChunkReader,\n createLAZChunkDecoder,\n createLAZChunkDecoderCursor,\n decodeLAZChunk,\n decodeLAZChunkTable,\n getLAZChunkDeclaredByteLength,\n getLAZChunkHeaderByteLength,\n NeedsMoreData\n} from '@loaders.gl/core/loader-utils';\nimport type {\n LAZChunkMetadata,\n LAZChunkTableEntry,\n LAZPointDataTarget\n} from '@loaders.gl/core/loader-utils';\nimport type {LASLoaderOptions} from '../../las-loader-types';\nimport {getLASSchema} from '../get-las-schema';\nimport {\n getLASCompatibilityLayout,\n populateLASCompatibilityPoint,\n type LASCompatibilityLayout\n} from '../las-compatibility';\nimport {\n createLASTypedExtraBytesAttributes,\n createLASTypedExtraBytesValue,\n parseLASExtraBytes,\n populateLASTypedExtraBytesComponent,\n type LASTypedExtraBytesAttribute\n} from '../las-extra-bytes';\nimport type {\n LASExtendedVariableLengthRecord,\n LASGeoTIFFKey,\n LASHeader,\n LASMetadata,\n LASVariableLengthRecord,\n LASWaveformPacketDescriptor\n} from '../las-types';\n\n/** Arrow table returned by the TypeScript LAS parser with LAS loader metadata attached. */\nexport type LASArrowTable = MeshArrowTable & {\n /** Loader identifier preserved for mesh compatibility conversion. */\n loader: 'las';\n /** Parsed LAS header and metadata for the batch. */\n loaderData: LASHeader;\n /** Batch parse progress in the range [0, 1]. */\n progress?: number;\n};\n\ntype LASDecodedChunk = {\n arrayBuffer: ArrayBufferLike;\n header: LASHeader;\n};\n\n/** Metadata needed to decode one standalone LAZ chunk into LAS Arrow columns. */\nexport type LAZChunkArrowTableMetadata = LAZChunkMetadata & {\n /** LAS coordinate scales applied to encoded XYZ integers. */\n scale: [number, number, number];\n /** LAS coordinate offsets applied to encoded XYZ integers. */\n offset: [number, number, number];\n};\n\nconst DEFAULT_BATCH_SIZE = 1000 * 100;\nconst LASF_SIGNATURE = 0x4653414c;\nconst LAS_14_HEADER_LENGTH = 375;\nconst COMPRESSED_POINT_FORMAT_MASK = 0x80;\nconst POINT_FORMAT_MASK = 0x3f;\nconst LASZIP_USER_ID = 'laszip encoded';\nconst LASZIP_RECORD_ID = 22204;\nconst VARIABLE_CHUNK_SIZE = 0xffffffff;\nconst LAZ_CHUNK_TABLE_POINTER_LENGTH = 8;\n/** Read-ahead block that amortizes legacy cursor feeds while keeping retained input bounded. */\nconst LEGACY_LAZ_FEED_BLOCK_SIZE = 64 * 1024;\n\n/** One compressed field item declared by the LASzip VLR. */\ntype LASZipItem = {\n /** LASzip item type identifier. */\n type: number;\n /** Uncompressed item width in bytes. */\n size: number;\n /** LASzip codec version for this item. */\n version: number;\n};\n\ntype LASZipVLR = {\n compressor: number;\n /** Entropy coder identifier declared by LASzip. */\n coder: number;\n chunkSize: number;\n variableChunks: boolean;\n /** Ordered compressed field descriptors. */\n items: LASZipItem[];\n point14ItemVersion: 2 | 3 | 4 | null;\n rgb14ItemVersion: 2 | 3 | 4 | null;\n wavePacket13ItemVersion: 1 | null;\n wavePacketItemVersion: 3 | 4 | null;\n byte14ItemVersion: 2 | 3 | 4 | null;\n};\n\n/** Build chunk metadata with the item versions declared by the LASzip VLR. */\nfunction createLAZChunkMetadata(\n header: LASHeader,\n laszip: LASZipVLR,\n pointCount: number\n): LAZChunkMetadata {\n return {\n pointDataRecordFormat: header.pointsFormatId,\n pointDataRecordLength: header.pointsStructSize,\n pointCount,\n point10ItemVersion: laszip.items.find(item => item.type === 6)?.version as 1 | 2 | undefined,\n gpsTime11ItemVersion: laszip.items.find(item => item.type === 7)?.version as 1 | 2 | undefined,\n rgb12ItemVersion: laszip.items.find(item => item.type === 8)?.version as 1 | 2 | undefined,\n byteItemVersion: laszip.items.find(item => item.type === 0)?.version as 1 | 2 | undefined,\n point14ItemVersion: laszip.point14ItemVersion ?? undefined,\n rgb14ItemVersion: laszip.rgb14ItemVersion ?? undefined,\n wavePacketItemVersion: laszip.wavePacketItemVersion ?? undefined,\n byte14ItemVersion: laszip.byte14ItemVersion ?? undefined\n };\n}\n\ntype RawPointBatchState = {\n rawBatch: Uint8Array;\n batchPointCount: number;\n totalRead: number;\n rawBatchAllocations: number;\n stats?: LAZStreamingDecodeStats;\n};\n\ntype PointDataBatchState = {\n batchCapacity: number;\n positions: Float32Array | Float64Array;\n colors: Uint8Array | null;\n rawColors: Uint16Array | null;\n intensities: Uint16Array | null;\n classifications: Uint8Array | null;\n syntheticFlags: Uint8Array | null;\n keyPointFlags: Uint8Array | null;\n withheldFlags: Uint8Array | null;\n overlapFlags: Uint8Array | null;\n gpsTimes: Float64Array | null;\n nir: Uint16Array | null;\n scanAngles: Int16Array | null;\n userData: Uint8Array | null;\n pointSourceIds: Uint16Array | null;\n returnNumbers: Uint8Array | null;\n numberOfReturns: Uint8Array | null;\n scannerChannels: Uint8Array | null;\n scanDirectionFlags: Uint8Array | null;\n edgeOfFlightLines: Uint8Array | null;\n waveforms: Uint8Array | null;\n extraBytes: Uint8Array | null;\n typedExtraBytes: LASTypedExtraBytesAttribute[] | null;\n /** Packed raw source used to project selected typed Extra Bytes without raw point records. */\n typedExtraBytesSource: Uint8Array | null;\n /** Validated modern field reconstruction layout when enabled. */\n compatibilityLayout: LASCompatibilityLayout | null;\n /** Internal packed source when compatibility reconstruction alone requires Extra Bytes. */\n compatibilityExtraBytesSource: Uint8Array | null;\n target: LAZPointDataTarget;\n batchPointCount: number;\n totalRead: number;\n};\n\ntype LAZStreamingDecodeStats = {\n copiedBytes: number;\n chunkConcatenations: number;\n rawBatchAllocations: number;\n decodedChunkAllocations: number;\n};\n\ntype LAZChunkByteLengthMetadata = {\n pointDataRecordFormat: number;\n pointDataRecordLength: number;\n pointCount: number;\n};\n\n/** Parse LAS data with the TypeScript loader variant. */\nexport function parseLAS(arrayBuffer: ArrayBuffer, options: LASLoaderOptions = {}): LASArrowTable {\n const header = parseLASHeader(arrayBuffer);\n if (header.isCompressed) {\n const bytes = new Uint8Array(arrayBuffer);\n const laszip = parseLASZipVLR(bytes, header);\n validateTypeScriptLAZSupport(header, laszip);\n if (header.pointsFormatId <= 5 || (header.pointsFormatId >= 6 && header.pointsFormatId <= 10)) {\n return parseCompleteLAZFileToArrowTable(bytes, header, laszip, options);\n }\n const rawPointData = decodeLAZFileToRawPointData(arrayBuffer, header, laszip);\n const totalPointCount = header.pointsCount;\n return parseLASArrowTableBatch(\n rawPointData,\n {\n ...header,\n pointsOffset: 0,\n pointsCount: totalPointCount,\n totalToRead: totalPointCount,\n totalRead: totalPointCount\n },\n options\n );\n }\n\n const totalPointCount = header.pointsCount;\n return parseLASArrowTableBatch(\n arrayBuffer,\n {...header, totalToRead: totalPointCount, totalRead: totalPointCount},\n options\n );\n}\n\n/** Decode one complete modern LAZ chunk directly into selected Arrow columns. */\nexport function decodeLAZChunkToArrowTable(\n compressed: ArrayBuffer | ArrayBufferView,\n metadata: LAZChunkArrowTableMetadata,\n options: LASLoaderOptions\n): LASArrowTable {\n if (metadata.pointDataRecordFormat < 6 || metadata.pointDataRecordFormat > 8) {\n throw new Error(\n `LASLoader: standalone Arrow chunk decode supports PDRF 6-8; received ${metadata.pointDataRecordFormat}`\n );\n }\n const pointCount = metadata.pointCount;\n const header: LASHeader = {\n pointsOffset: 0,\n pointsFormatId: metadata.pointDataRecordFormat,\n pointsStructSize: metadata.pointDataRecordLength,\n pointsCount: pointCount,\n scale: metadata.scale,\n offset: metadata.offset,\n maxs: [0, 0, 0],\n mins: [0, 0, 0],\n totalToRead: pointCount,\n totalRead: pointCount,\n hasColor: hasPointColor(metadata.pointDataRecordFormat),\n versionAsString: '1.4',\n isCompressed: true,\n headerSize: LAS_14_HEADER_LENGTH,\n vlrCount: 0\n };\n const state = createPointDataBatchState(pointCount, header, options);\n if (state.waveforms || state.extraBytes || state.typedExtraBytes) {\n throw new Error('LASLoader: standalone Arrow chunk decode only supports direct LAZ columns');\n }\n const cursor = createLAZChunkDecoderCursor(compressed, metadata);\n const decodedPointCount = cursor.decodeIntoPointData(state.target, pointCount);\n if (decodedPointCount !== pointCount) {\n throw new Error(\n `LASLoader: standalone LAZ chunk produced ${decodedPointCount} points; expected ${pointCount}`\n );\n }\n return makePointDataStateArrowTable(header, state, pointCount, options, true);\n}\n\n/** Decode one complete supported LAZ file directly into its represented Arrow columns. */\nfunction parseCompleteLAZFileToArrowTable(\n bytes: Uint8Array,\n header: LASHeader,\n laszip: LASZipVLR,\n options: LASLoaderOptions\n): LASArrowTable {\n const pointCount = header.pointsCount;\n const state = createPointDataBatchState(pointCount, header, options);\n const chunkTable = readLAZFileChunks(bytes, header, laszip, options);\n let decodedPointCount = 0;\n let byteOffset =\n header.pointsOffset + (laszip.compressor === 1 ? 0 : LAZ_CHUNK_TABLE_POINTER_LENGTH);\n\n for (const chunk of chunkTable) {\n decodeCompleteLAZChunkToPointData(\n bytes,\n byteOffset,\n chunk.byteLength,\n chunk.pointCount,\n header,\n laszip,\n state,\n decodedPointCount\n );\n byteOffset += chunk.byteLength;\n decodedPointCount += chunk.pointCount;\n }\n\n if (decodedPointCount !== pointCount) {\n throw new Error(`LASLoader: decoded ${decodedPointCount} LAZ points; expected ${pointCount}`);\n }\n return makePointDataStateArrowTable(header, state, pointCount, options);\n}\n\n/** Convert one fully populated point-data state into its Arrow table. */\nfunction makePointDataStateArrowTable(\n header: LASHeader,\n state: PointDataBatchState,\n pointCount: number,\n options: LASLoaderOptions,\n preserveRawColors: boolean = false\n): LASArrowTable {\n const colors =\n preserveRawColors && state.rawColors\n ? state.rawColors\n : state.colors\n ? state.colors\n : state.rawColors\n ? convertRawColorsToUint8(state.rawColors, pointCount, options)\n : null;\n return makeLASArrowTableFromAttributes(\n {...header, pointsOffset: 0, pointsCount: pointCount, totalRead: pointCount},\n state.positions,\n colors,\n state.intensities,\n state.classifications,\n state.syntheticFlags,\n state.keyPointFlags,\n state.withheldFlags,\n state.overlapFlags,\n state.gpsTimes,\n state.nir,\n state.scanAngles,\n state.userData,\n state.pointSourceIds,\n state.returnNumbers,\n state.numberOfReturns,\n state.scannerChannels,\n state.scanDirectionFlags,\n state.edgeOfFlightLines,\n state.waveforms,\n state.extraBytes,\n state.typedExtraBytes\n );\n}\n\n/** Decode one complete supported LAZ chunk into preallocated Arrow column buffers. */\nfunction decodeCompleteLAZChunkToPointData(\n bytes: Uint8Array,\n byteOffset: number,\n byteLength: number,\n pointCount: number,\n header: LASHeader,\n laszip: LASZipVLR,\n state: PointDataBatchState,\n targetPointOffset: number\n): void {\n const compressed = bytes.subarray(byteOffset, byteOffset + byteLength);\n if (compressed.byteLength !== byteLength) {\n throw new NeedsMoreData('LASLoader: truncated LAZ chunk');\n }\n const cursor = createLAZChunkDecoderCursor(\n compressed,\n createLAZChunkMetadata(header, laszip, pointCount)\n );\n state.target.pointOffset = targetPointOffset;\n const decodedPointCount = cursor.decodeIntoPointData(state.target, pointCount);\n if (decodedPointCount !== pointCount) {\n throw new Error(\n `LASLoader: decoded ${decodedPointCount} points from a ${pointCount}-point LAZ chunk`\n );\n }\n populateDecodedTypedExtraBytes(state, targetPointOffset, pointCount);\n}\n\n/** Parse LAS data from an incoming byte iterator into point batches. */\nexport async function* parseLASInBatches(\n arrayBufferIterator:\n | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n | Iterable<ArrayBufferLike | ArrayBufferView>,\n options: LASLoaderOptions = {}\n): AsyncIterable<LASArrowTable> {\n const batchSize = getBatchSize(options);\n const inputIterator = toAsyncIterator(arrayBufferIterator);\n let pending: Uint8Array<ArrayBufferLike> = new Uint8Array(0);\n let absoluteOffset = 0;\n let header: LASHeader | null = null;\n let sourcePointIndex = 0;\n let totalRead = 0;\n let lastTable: LASArrowTable | undefined;\n\n while (true) {\n const next = await inputIterator.next();\n if (next.done) {\n break;\n }\n const chunk = next.value;\n pending = concatenateUint8Arrays(pending, toUint8Array(chunk));\n if (!header) {\n header = tryParseHeader(pending, absoluteOffset);\n if (header && pending.byteLength < header.pointsOffset) header = null;\n if (header) {\n header.totalToRead = header.pointsCount;\n }\n }\n if (!header) {\n continue;\n }\n if (header.isCompressed) {\n const extendedOffset = header.metadata?.evlrOffset;\n let inputOffset = pending.byteLength;\n const extendedChunks: Uint8Array<ArrayBufferLike>[] = [];\n if (extendedOffset && extendedOffset < inputOffset) {\n extendedChunks.push(pending.subarray(extendedOffset));\n }\n const trackedIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView> = {\n async next() {\n const next = await inputIterator.next();\n if (!next.done && extendedOffset) {\n const bytes = toUint8Array(next.value);\n const start = Math.max(extendedOffset - inputOffset, 0);\n if (start < bytes.byteLength) extendedChunks.push(bytes.slice(start));\n inputOffset += bytes.byteLength;\n }\n return next;\n }\n };\n if (header.pointsCount === 0) {\n const {laszip} = await readLASZipVLRFromInput(pending, trackedIterator, header);\n validateTypeScriptLAZSupport(header, laszip);\n lastTable = makeEmptyLASBatch(header, options);\n } else {\n for await (const table of parseLAZInBatches(pending, trackedIterator, header, options)) {\n lastTable = updateArrowTableMetadata(\n table,\n makeMetadataFromLasHeader({\n ...header,\n totalRead: table.loaderData.totalRead,\n metadata: table.loaderData.metadata || header.metadata\n })\n );\n yield lastTable;\n }\n }\n if (\n extendedOffset &&\n lastTable &&\n header.metadata?.evlrCount &&\n (lastTable.loaderData.metadata?.evlrs.length ?? 0) < header.metadata.evlrCount\n ) {\n while (!(await trackedIterator.next()).done) {\n // Finish reading trailing records if the decoder stopped at its chunk table.\n }\n // The tracked iterator retains only the extended-record suffix.\n const suffix = extendedChunks.reduce<Uint8Array<ArrayBufferLike>>(\n concatenateUint8Arrays,\n new Uint8Array(0)\n );\n const update = makeLASMetadataUpdate(\n lastTable,\n header,\n suffix,\n extendedOffset,\n lastTable.loaderData.totalRead\n );\n if (update) {\n yield update;\n return;\n }\n }\n if (header.pointsCount === 0 && lastTable) yield lastTable;\n return;\n }\n\n for (const batch of readAvailablePointBatches(\n pending,\n absoluteOffset,\n header,\n sourcePointIndex,\n totalRead,\n batchSize\n )) {\n sourcePointIndex = batch.sourcePointIndex;\n totalRead = batch.totalRead;\n pending = batch.pending;\n absoluteOffset = batch.absoluteOffset;\n lastTable = updateArrowTableMetadata(\n parseLASArrowTableBatch(batch.arrayBuffer, batch.header, options),\n makeMetadataFromLasHeader({...header, totalRead})\n );\n yield lastTable;\n }\n }\n\n if (!header) {\n throw new Error('LASLoader: incomplete LAS header');\n }\n if (totalRead < header.totalToRead) {\n throw new Error('LASLoader: truncated LAS point data');\n }\n if (!lastTable) {\n lastTable = makeEmptyLASBatch(header, options);\n yield lastTable;\n }\n const update = makeLASMetadataUpdate(lastTable, header, pending, absoluteOffset, totalRead);\n if (update) yield update;\n}\n\n/** Creates the declared point schema and original header metadata for a zero-point stream. */\nfunction makeEmptyLASBatch(header: LASHeader, options: LASLoaderOptions): LASArrowTable {\n const table = parseLASArrowTableBatch(new ArrayBuffer(0), {...header, pointsOffset: 0}, options);\n return updateArrowTableMetadata(\n {...table, loaderData: header},\n makeMetadataFromLasHeader(header)\n );\n}\n\n/** Builds a schema-only batch carrying late extended records and their absolute offsets. */\nfunction makeLASMetadataUpdate(\n lastTable: LASArrowTable,\n header: LASHeader,\n pending: Uint8Array,\n absoluteOffset: number,\n totalRead: number\n): LASArrowTable | undefined {\n const metadata = header.metadata;\n if (metadata?.evlrOffset && metadata.evlrCount) {\n const relativeOffset = metadata.evlrOffset - absoluteOffset;\n const records = parseLASExtendedVariableLengthRecords(\n new DataView(pending.buffer, pending.byteOffset, pending.byteLength),\n relativeOffset,\n metadata.evlrCount\n ).map(record => ({...record, offset: record.offset + absoluteOffset}));\n const finalMetadata = {\n ...metadata,\n evlrs: records,\n extraBytes: [...metadata.extraBytes],\n waveformPacketDescriptors: [...metadata.waveformPacketDescriptors]\n };\n for (const record of records)\n parseTypedLASMetadataRecord(\n {...record, data: record.data || new Uint8Array()},\n finalMetadata\n );\n resolveLASGeoTIFFKeyDirectory(finalMetadata);\n const finalHeader = {...header, totalRead, metadata: finalMetadata};\n if (records.length > 0) {\n const data = new arrow.Table([makeArrowMetadataBatch(lastTable.data.schema)]);\n return updateArrowTableMetadata(\n {...lastTable, data, loaderData: finalHeader},\n makeMetadataFromLasHeader(finalHeader)\n );\n }\n }\n}\n\n/** Decode LAS data into raw point chunks. */\nexport function* parseLASChunkedIterator(\n arrayBuffer: ArrayBuffer,\n batchSize: number = DEFAULT_BATCH_SIZE,\n options: LASLoaderOptions = {}\n): Iterable<LASDecodedChunk> {\n const header = parseLASHeader(arrayBuffer);\n if (header.isCompressed) {\n yield* parseLAZChunkedIterator(arrayBuffer, header, batchSize, undefined, options);\n return;\n }\n\n const totalToRead = header.pointsCount;\n let sourcePointIndex = 0;\n let totalRead = 0;\n\n while (sourcePointIndex < header.pointsCount && totalRead < totalToRead) {\n const batchPointCount = Math.min(batchSize, header.pointsCount - sourcePointIndex);\n const start = header.pointsOffset + sourcePointIndex * header.pointsStructSize;\n const end = start + batchPointCount * header.pointsStructSize;\n sourcePointIndex += batchPointCount;\n totalRead += batchPointCount;\n const batchHeader = {\n ...header,\n pointsOffset: 0,\n pointsCount: batchPointCount,\n totalToRead,\n totalRead\n };\n yield {\n arrayBuffer: arrayBuffer.slice(start, end),\n header: batchHeader\n };\n }\n}\n\n/** Decode compressed LAZ file data from an incoming byte iterator into raw point chunks. */\nexport async function* decodeLAZFileInBatches(\n arrayBufferIterator:\n | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n | Iterable<ArrayBufferLike | ArrayBufferView>,\n options: LASLoaderOptions = {}\n): AsyncIterable<LASDecodedChunk> {\n const inputIterator = toAsyncIterator(arrayBufferIterator);\n let pending: Uint8Array<ArrayBufferLike> = new Uint8Array(0);\n let header: LASHeader | null = null;\n\n while (!header) {\n const next = await inputIterator.next();\n if (next.done) {\n throw new Error('LASLoader: incomplete LAS header');\n }\n pending = concatenateUint8Arrays(pending, toUint8Array(next.value));\n header = tryParseHeader(pending, 0);\n }\n if (!header.isCompressed) {\n throw new Error('LASLoader: decodeLAZFileInBatches requires compressed LAZ input');\n }\n\n yield* decodePendingLAZFileInBatches(pending, inputIterator, header, options);\n}\n\nasync function* decodePendingLAZFileInBatches(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n options: LASLoaderOptions = {}\n): AsyncIterable<LASDecodedChunk> {\n const {pending, laszip} = await readLASZipVLRFromInput(initialPending, inputIterator, header);\n validateTypeScriptLAZSupport(header, laszip);\n\n yield* decodeLAZFileWithParsedVLRInBatches(pending, inputIterator, header, laszip, options);\n}\n\nasync function* decodeLAZFileWithParsedVLRInBatches(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n laszip: LASZipVLR,\n options: LASLoaderOptions\n): AsyncIterable<LASDecodedChunk> {\n if (laszip.variableChunks) {\n const bytes = await collectRemainingInputBytes(initialPending, inputIterator);\n yield* decodeLAZFileFromCompleteBytes(bytes, header, laszip, options);\n return;\n }\n\n if (header.pointsFormatId <= 5) {\n yield* decodePendingFixedLegacyLAZFileInBatches(\n initialPending,\n inputIterator,\n header,\n laszip,\n options\n );\n return;\n }\n\n const outputHeader = {...header, totalToRead: header.pointsCount};\n const batchSize = getBatchSize(options);\n const state = createRawPointBatchState(\n batchSize,\n header.pointsStructSize,\n getLAZStreamingDecodeStats(options)\n );\n let sourcePointIndex = 0;\n const chunkByteLengths: number[] = [];\n const reader = new BinaryChunkReader();\n reader.write(initialPending);\n\n await readUntilAvailable(\n reader,\n inputIterator,\n header.pointsOffset + LAZ_CHUNK_TABLE_POINTER_LENGTH,\n 'LASLoader: incomplete compressed LAZ point data'\n );\n reader.skip(header.pointsOffset);\n const chunkTableOffset = readStreamedLAZChunkTableOffset(\n reader.getDataView(LAZ_CHUNK_TABLE_POINTER_LENGTH)!\n );\n\n while (sourcePointIndex < header.pointsCount) {\n const chunkPointCount = Math.min(laszip.chunkSize, header.pointsCount - sourcePointIndex);\n const metadata = createLAZChunkMetadata(header, laszip, chunkPointCount);\n const chunkByteLength = await readLAZChunkByteLengthFromReader(reader, inputIterator, metadata);\n chunkByteLengths.push(chunkByteLength);\n recordReadBytesStats(reader, chunkByteLength, state.stats);\n const compressedChunk = reader.readBytes(chunkByteLength);\n if (options.las?.recoverMissingChunkTable && chunkTableOffset === header.pointsOffset) {\n validateRecoveredLayeredPointCount(compressedChunk, metadata);\n }\n for (const batch of appendDecodedLAZChunk(compressedChunk, metadata, outputHeader, state)) {\n yield batch;\n }\n\n sourcePointIndex += chunkPointCount;\n }\n\n await validateStreamedFixedLAZChunkTable(\n reader,\n inputIterator,\n header,\n laszip,\n chunkTableOffset,\n chunkByteLengths,\n options\n );\n\n const finalBatch = flushRawPointBatch(outputHeader, state);\n if (finalBatch) {\n yield finalBatch;\n }\n}\n\nasync function* decodePendingFixedLegacyLAZFileInBatches(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n laszip: LASZipVLR,\n options: LASLoaderOptions = {}\n): AsyncIterable<LASDecodedChunk> {\n const outputHeader = {...header, totalToRead: header.pointsCount};\n const batchSize = getBatchSize(options);\n const state = createRawPointBatchState(\n batchSize,\n header.pointsStructSize,\n getLAZStreamingDecodeStats(options)\n );\n const chunkByteLengths: number[] = [];\n const reader = new BinaryChunkReader();\n reader.write(initialPending);\n\n await readUntilAvailable(\n reader,\n inputIterator,\n header.pointsOffset + (laszip.compressor === 1 ? 0 : LAZ_CHUNK_TABLE_POINTER_LENGTH),\n 'LASLoader: incomplete compressed LAZ point data'\n );\n reader.skip(header.pointsOffset);\n const chunkTableOffset =\n laszip.compressor === 1\n ? 0\n : readStreamedLAZChunkTableOffset(reader.getDataView(LAZ_CHUNK_TABLE_POINTER_LENGTH)!);\n\n let sourcePointIndex = 0;\n while (sourcePointIndex < header.pointsCount) {\n const chunkPointCount =\n laszip.compressor === 1\n ? header.pointsCount\n : Math.min(laszip.chunkSize, header.pointsCount - sourcePointIndex);\n const metadata = createLAZChunkMetadata(header, laszip, chunkPointCount);\n const cursor = createLAZChunkDecoderCursor(new Uint8Array(0), metadata);\n let fedByteLength = 0;\n let consumedByteLength = 0;\n let inputDone = false;\n\n while (cursor.remainingPointCount > 0) {\n const availableByteLength = reader.getAvailableByteLength();\n const requestedByteLength = getLegacyLAZFeedByteLength(\n availableByteLength,\n fedByteLength,\n cursor.requiredInputByteLength - consumedByteLength\n );\n if (requestedByteLength > fedByteLength) {\n const checkpoint = reader.checkpoint();\n reader.skip(fedByteLength);\n const addedByteLength = requestedByteLength - fedByteLength;\n recordReadBytesStats(reader, addedByteLength, state.stats);\n cursor.feed(reader.readBytes(addedByteLength));\n reader.restore(checkpoint);\n fedByteLength = requestedByteLength;\n }\n\n const availableBatchPointCount = batchSize - state.batchPointCount;\n const decodedPointCount = cursor.decodeAvailableInto(\n state.rawBatch,\n state.batchPointCount * header.pointsStructSize,\n availableBatchPointCount,\n inputDone\n );\n if (decodedPointCount > 0) {\n if (laszip.compressor === 1) {\n const decodedByteLength = cursor.compressedByteOffset - consumedByteLength;\n reader.skip(decodedByteLength);\n fedByteLength -= decodedByteLength;\n consumedByteLength = cursor.compressedByteOffset;\n cursor.discardConsumedInput();\n }\n state.batchPointCount += decodedPointCount;\n if (state.batchPointCount === batchSize) {\n const batch = flushRawPointBatch(outputHeader, state);\n if (batch) {\n yield batch;\n }\n }\n continue;\n }\n\n if (inputDone) {\n throw new NeedsMoreData(\n `LASLoader: truncated legacy LAZ chunk after ${chunkPointCount - cursor.remainingPointCount} of ${chunkPointCount} points with ${availableByteLength} bytes available`\n );\n }\n const next = await inputIterator.next();\n if (next.done) {\n inputDone = true;\n } else {\n reader.write(next.value);\n }\n }\n\n reader.skip(cursor.compressedByteOffset - consumedByteLength);\n chunkByteLengths.push(cursor.compressedByteOffset);\n\n sourcePointIndex += chunkPointCount;\n }\n\n if (laszip.compressor !== 1) {\n await validateStreamedFixedLAZChunkTable(\n reader,\n inputIterator,\n header,\n laszip,\n chunkTableOffset,\n chunkByteLengths,\n options\n );\n }\n\n const finalBatch = flushRawPointBatch(outputHeader, state);\n if (finalBatch) {\n yield finalBatch;\n }\n}\n\n/**\n * Return the queued prefix length to expose to a legacy LAZ cursor.\n *\n * Legacy arithmetic decoding can request input one point at a time. Feeding only that minimum\n * makes the streaming path repeat reader checkpoints and tiny copies for every point. Growing\n * the exposed prefix in fixed blocks amortizes that work while limiting speculative read-ahead\n * to one block beyond the cursor requirement.\n */\nfunction getLegacyLAZFeedByteLength(\n availableByteLength: number,\n fedByteLength: number,\n requiredInputByteLength: number\n): number {\n return Math.min(\n availableByteLength,\n Math.max(requiredInputByteLength, fedByteLength + LEGACY_LAZ_FEED_BLOCK_SIZE)\n );\n}\n\nasync function* parseLAZInBatches(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n options: LASLoaderOptions\n): AsyncIterable<LASArrowTable> {\n const {pending, laszip} = await readLASZipVLRFromInput(initialPending, inputIterator, header);\n validateTypeScriptLAZSupport(header, laszip);\n if (!laszip.variableChunks && header.pointsFormatId <= 5) {\n yield* parsePendingFixedLegacyLAZFileInArrowBatches(\n pending,\n inputIterator,\n header,\n laszip,\n options\n );\n return;\n }\n if (!laszip.variableChunks && header.pointsFormatId >= 6 && header.pointsFormatId <= 10) {\n yield* parsePendingLAZFileInArrowBatches(pending, inputIterator, header, laszip, options);\n return;\n }\n\n for await (const batch of decodeLAZFileWithParsedVLRInBatches(\n pending,\n inputIterator,\n header,\n laszip,\n options\n )) {\n yield parseLASArrowTableBatch(batch.arrayBuffer, batch.header, options);\n }\n}\n\n/**\n * Decode fixed-size legacy LAZ chunks directly into streaming Arrow batches.\n *\n * This path intentionally parallels the raw legacy stream loop for PDRFs 0-5. Writing into\n * Arrow-owned arrays avoids allocating and reparsing an intermediate raw LAS point-record batch,\n * while the cursor still provides point-atomic suspension when more compressed input is required.\n */\nasync function* parsePendingFixedLegacyLAZFileInArrowBatches(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n laszip: LASZipVLR,\n options: LASLoaderOptions\n): AsyncIterable<LASArrowTable> {\n const outputHeader = {...header, totalToRead: header.pointsCount};\n const state = createPointDataBatchState(getBatchSize(options), header, options);\n const stats = getLAZStreamingDecodeStats(options);\n const chunkByteLengths: number[] = [];\n const reader = new BinaryChunkReader();\n reader.write(initialPending);\n\n await readUntilAvailable(\n reader,\n inputIterator,\n header.pointsOffset + (laszip.compressor === 1 ? 0 : LAZ_CHUNK_TABLE_POINTER_LENGTH),\n 'LASLoader: incomplete compressed LAZ point data'\n );\n reader.skip(header.pointsOffset);\n const chunkTableOffset =\n laszip.compressor === 1\n ? 0\n : readStreamedLAZChunkTableOffset(reader.getDataView(LAZ_CHUNK_TABLE_POINTER_LENGTH)!);\n\n let sourcePointIndex = 0;\n while (sourcePointIndex < header.pointsCount) {\n const chunkPointCount =\n laszip.compressor === 1\n ? header.pointsCount\n : Math.min(laszip.chunkSize, header.pointsCount - sourcePointIndex);\n const metadata = createLAZChunkMetadata(header, laszip, chunkPointCount);\n const cursor = createLAZChunkDecoderCursor(new Uint8Array(0), metadata);\n let fedByteLength = 0;\n let consumedByteLength = 0;\n let inputDone = false;\n\n while (cursor.remainingPointCount > 0) {\n const availableByteLength = reader.getAvailableByteLength();\n const requestedByteLength = getLegacyLAZFeedByteLength(\n availableByteLength,\n fedByteLength,\n cursor.requiredInputByteLength - consumedByteLength\n );\n if (requestedByteLength > fedByteLength) {\n const checkpoint = reader.checkpoint();\n reader.skip(fedByteLength);\n const addedByteLength = requestedByteLength - fedByteLength;\n recordReadBytesStats(reader, addedByteLength, stats);\n cursor.feed(reader.readBytes(addedByteLength));\n reader.restore(checkpoint);\n fedByteLength = requestedByteLength;\n }\n\n state.target.pointOffset = state.batchPointCount;\n const availableBatchPointCount = state.batchCapacity - state.batchPointCount;\n const decodedPointCount = cursor.decodeAvailableIntoPointData(\n state.target,\n availableBatchPointCount,\n inputDone\n );\n if (decodedPointCount > 0) {\n if (laszip.compressor === 1) {\n const decodedByteLength = cursor.compressedByteOffset - consumedByteLength;\n reader.skip(decodedByteLength);\n fedByteLength -= decodedByteLength;\n consumedByteLength = cursor.compressedByteOffset;\n cursor.discardConsumedInput();\n }\n populateDecodedTypedExtraBytes(state, state.batchPointCount, decodedPointCount);\n state.batchPointCount += decodedPointCount;\n if (state.batchPointCount === state.batchCapacity) {\n const batch = flushPointDataBatch(outputHeader, state, options);\n if (batch) {\n yield batch;\n }\n }\n continue;\n }\n\n if (inputDone) {\n throw new NeedsMoreData(\n `LASLoader: truncated legacy LAZ chunk after ${chunkPointCount - cursor.remainingPointCount} of ${chunkPointCount} points with ${availableByteLength} bytes available`\n );\n }\n const next = await inputIterator.next();\n if (next.done) {\n inputDone = true;\n } else {\n reader.write(next.value);\n }\n }\n\n reader.skip(cursor.compressedByteOffset - consumedByteLength);\n chunkByteLengths.push(cursor.compressedByteOffset);\n sourcePointIndex += chunkPointCount;\n }\n\n if (laszip.compressor !== 1) {\n await validateStreamedFixedLAZChunkTable(\n reader,\n inputIterator,\n header,\n laszip,\n chunkTableOffset,\n chunkByteLengths,\n options\n );\n }\n\n const finalBatch = flushPointDataBatch(outputHeader, state, options);\n if (finalBatch) {\n yield finalBatch;\n }\n}\n\nasync function* parsePendingLAZFileInArrowBatches(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n laszip: LASZipVLR,\n options: LASLoaderOptions\n): AsyncIterable<LASArrowTable> {\n const outputHeader = {...header, totalToRead: header.pointsCount};\n const state = createPointDataBatchState(getBatchSize(options), header, options);\n let sourcePointIndex = 0;\n const chunkByteLengths: number[] = [];\n const reader = new BinaryChunkReader();\n reader.write(initialPending);\n\n await readUntilAvailable(\n reader,\n inputIterator,\n header.pointsOffset + LAZ_CHUNK_TABLE_POINTER_LENGTH,\n 'LASLoader: incomplete compressed LAZ point data'\n );\n reader.skip(header.pointsOffset);\n const chunkTableOffset = readStreamedLAZChunkTableOffset(\n reader.getDataView(LAZ_CHUNK_TABLE_POINTER_LENGTH)!\n );\n\n while (sourcePointIndex < header.pointsCount) {\n const chunkPointCount = Math.min(laszip.chunkSize, header.pointsCount - sourcePointIndex);\n const metadata = createLAZChunkMetadata(header, laszip, chunkPointCount);\n const chunkByteLength = yield* appendProgressiveLAZChunkToPointDataBatches(\n reader,\n inputIterator,\n metadata,\n outputHeader,\n state,\n options,\n Boolean(options.las?.recoverMissingChunkTable && chunkTableOffset === header.pointsOffset)\n );\n chunkByteLengths.push(chunkByteLength);\n\n sourcePointIndex += chunkPointCount;\n }\n\n await validateStreamedFixedLAZChunkTable(\n reader,\n inputIterator,\n header,\n laszip,\n chunkTableOffset,\n chunkByteLengths,\n options\n );\n\n const finalBatch = flushPointDataBatch(outputHeader, state, options);\n if (finalBatch) {\n yield finalBatch;\n }\n}\n\n/** Feed one layered LAZ chunk and yield requested Arrow rows before its trailing layers arrive. */\nasync function* appendProgressiveLAZChunkToPointDataBatches(\n reader: BinaryChunkReader,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n metadata: LAZChunkMetadata,\n header: LASHeader,\n state: PointDataBatchState,\n options: LASLoaderOptions,\n validateRecoveryPointCount: boolean\n): AsyncGenerator<LASArrowTable, number> {\n const headerByteLength = getLAZChunkHeaderByteLength(metadata);\n await readUntilAvailable(\n reader,\n inputIterator,\n headerByteLength,\n 'LASLoader: incomplete layered LAZ chunk header'\n );\n const compressedHeader = reader.readBytes(headerByteLength);\n if (validateRecoveryPointCount) validateRecoveredLayeredPointCount(compressedHeader, metadata);\n const chunkByteLength = getLAZChunkDeclaredByteLength(compressedHeader, metadata);\n const decoder = createLAZChunkDecoder(metadata);\n decoder.feed(compressedHeader);\n let fedByteLength = headerByteLength;\n\n while (fedByteLength < chunkByteLength) {\n yield* readAvailableLAZPointDataBatches(decoder, header, state, options);\n if (reader.getAvailableByteLength() === 0) {\n const next = await inputIterator.next();\n if (next.done) {\n throw new NeedsMoreData('LASLoader: incomplete layered LAZ chunk payload');\n }\n reader.write(next.value);\n }\n const byteLength = Math.min(reader.getAvailableByteLength(), chunkByteLength - fedByteLength);\n decoder.feed(reader.readBytes(byteLength));\n fedByteLength += byteLength;\n }\n\n decoder.close();\n yield* readAvailableLAZPointDataBatches(decoder, header, state, options);\n if (decoder.remainingPointCount !== 0) {\n throw new NeedsMoreData(\n `LASLoader: layered LAZ chunk produced ${metadata.pointCount - decoder.remainingPointCount} of ${metadata.pointCount} points`\n );\n }\n return chunkByteLength;\n}\n\n/** Drain all currently decodable rows from one feedable layered LAZ chunk. */\nfunction* readAvailableLAZPointDataBatches(\n decoder: ReturnType<typeof createLAZChunkDecoder>,\n header: LASHeader,\n state: PointDataBatchState,\n options: LASLoaderOptions\n): Iterable<LASArrowTable> {\n while (decoder.remainingPointCount > 0) {\n const batchRemainingPointCount = state.batchCapacity - state.batchPointCount;\n state.target.pointOffset = state.batchPointCount;\n const pointsDecoded = decoder.readPointDataBatch(state.target, batchRemainingPointCount);\n if (!pointsDecoded) {\n return;\n }\n populateDecodedTypedExtraBytes(state, state.batchPointCount, pointsDecoded);\n state.batchPointCount += pointsDecoded;\n if (state.batchPointCount === state.batchCapacity) {\n const batch = flushPointDataBatch(header, state, options);\n if (batch) {\n yield batch;\n }\n }\n }\n}\n\nfunction* parseLAZChunkedIterator(\n arrayBuffer: ArrayBuffer,\n header: LASHeader,\n batchSize: number,\n parsedLASZipVLR?: LASZipVLR,\n options: LASLoaderOptions = {}\n): Iterable<LASDecodedChunk> {\n const laszip = parsedLASZipVLR || parseLASZipVLR(new Uint8Array(arrayBuffer), header);\n validateTypeScriptLAZSupport(header, laszip);\n\n if (header.pointsFormatId <= 5 || laszip.variableChunks) {\n yield* decodeLAZFileFromCompleteBytes(new Uint8Array(arrayBuffer), header, laszip, {\n ...options,\n core: {...options.core, batchSize}\n });\n return;\n }\n\n const outputHeader = {...header, totalToRead: header.pointsCount};\n const state = createRawPointBatchState(batchSize, header.pointsStructSize);\n const bytes = new Uint8Array(arrayBuffer);\n const chunkTable = readLAZFileChunks(bytes, header, laszip, options);\n let byteOffset =\n header.pointsOffset + (laszip.compressor === 1 ? 0 : LAZ_CHUNK_TABLE_POINTER_LENGTH);\n\n for (const chunk of chunkTable) {\n const metadata = createLAZChunkMetadata(header, laszip, chunk.pointCount);\n const compressed = bytes.subarray(byteOffset, byteOffset + chunk.byteLength);\n for (const batch of appendDecodedLAZChunk(compressed, metadata, outputHeader, state)) {\n yield batch;\n }\n\n byteOffset += chunk.byteLength;\n }\n\n const finalBatch = flushRawPointBatch(outputHeader, state);\n if (finalBatch) {\n yield finalBatch;\n }\n}\n\nfunction* decodeLAZFileFromCompleteBytes(\n bytes: Uint8Array,\n header: LASHeader,\n laszip: LASZipVLR,\n options: LASLoaderOptions = {}\n): Iterable<LASDecodedChunk> {\n const batchSize = getBatchSize(options);\n const outputHeader = {\n ...header,\n metadata: parseLASMetadata(bytes, header),\n totalToRead: header.pointsCount\n };\n const state = createRawPointBatchState(\n batchSize,\n header.pointsStructSize,\n getLAZStreamingDecodeStats(options)\n );\n const chunkTable = readLAZFileChunks(bytes, header, laszip, options);\n let byteOffset =\n header.pointsOffset + (laszip.compressor === 1 ? 0 : LAZ_CHUNK_TABLE_POINTER_LENGTH);\n\n for (const chunk of chunkTable) {\n const compressedChunk = bytes.subarray(byteOffset, byteOffset + chunk.byteLength);\n if (compressedChunk.byteLength < chunk.byteLength) {\n throw new NeedsMoreData('LASLoader: truncated legacy LAZ chunk');\n }\n const metadata = createLAZChunkMetadata(header, laszip, chunk.pointCount);\n if (laszip.compressor === 1) {\n yield* appendDecodedLAZChunk(compressedChunk, metadata, outputHeader, state);\n } else {\n const rawChunk = decodeLAZChunk(compressedChunk, metadata);\n recordDecodedChunkAllocation(rawChunk.byteLength, state.stats);\n yield* appendRawPointChunk(rawChunk, outputHeader, state);\n }\n byteOffset += chunk.byteLength;\n }\n\n const finalBatch = flushRawPointBatch(outputHeader, state);\n if (finalBatch) {\n yield finalBatch;\n }\n}\n\nfunction decodeLAZFileToRawPointData(\n arrayBuffer: ArrayBuffer,\n header: LASHeader,\n laszip: LASZipVLR\n): Uint8Array {\n const totalPointCount = header.pointsCount;\n const rawPointData = new Uint8Array(totalPointCount * header.pointsStructSize);\n let byteOffset = 0;\n\n for (const batch of parseLAZChunkedIterator(arrayBuffer, header, DEFAULT_BATCH_SIZE, laszip)) {\n const source = new Uint8Array(batch.arrayBuffer);\n rawPointData.set(source, byteOffset);\n byteOffset += source.byteLength;\n }\n\n return rawPointData;\n}\n\n/** Parse the public LAS header block. */\nexport function parseLASHeader(arrayBuffer: ArrayBufferLike): LASHeader {\n const dataView = new DataView(arrayBuffer);\n if (arrayBuffer.byteLength < 227 || dataView.getUint32(0, true) !== LASF_SIGNATURE) {\n throw new Error('LASLoader: invalid LAS header');\n }\n\n const versionMajor = dataView.getUint8(24);\n const versionMinor = dataView.getUint8(25);\n if (versionMajor !== 1 || versionMinor > 5) {\n throw new Error(`LASLoader: unsupported LAS version ${versionMajor}.${versionMinor}`);\n }\n const headerSize = dataView.getUint16(94, true);\n const globalEncoding = dataView.getUint16(6, true);\n const vlrCount = dataView.getUint32(100, true);\n const pointFormatByte = dataView.getUint8(104);\n const pointsFormatId = pointFormatByte & POINT_FORMAT_MASK;\n const isCompressed = Boolean(pointFormatByte & COMPRESSED_POINT_FORMAT_MASK);\n const legacyPointCount = dataView.getUint32(107, true);\n const extendedPointCount =\n versionMajor > 1 || versionMinor >= 4 ? readUint64(dataView, 247) : legacyPointCount;\n const pointsCount = extendedPointCount || legacyPointCount;\n const pointsOffset = dataView.getUint32(96, true);\n const pointsStructSize = dataView.getUint16(105, true);\n if (versionMinor === 5) {\n if (headerSize < 393) {\n throw new Error('LASLoader: LAS 1.5 header must be at least 393 bytes');\n }\n if (pointsFormatId < 6 || pointsFormatId > 10) {\n throw new Error(\n `LASLoader: LAS 1.5 requires point data record formats 6-10; received ${pointsFormatId}`\n );\n }\n if ((globalEncoding & 0x10) === 0) {\n throw new Error('LASLoader: LAS 1.5 requires the WKT global encoding flag');\n }\n if ((globalEncoding & 0xffa0) !== 0) {\n throw new Error('LASLoader: LAS 1.5 Global Encoding contains reserved bits');\n }\n if ((globalEncoding & 0x40) !== 0 && (globalEncoding & 0x01) === 0) {\n throw new Error('LASLoader: LAS 1.5 Time Offset Flag requires GPS Time Type');\n }\n const maxGpsTime = dataView.getFloat64(375, true);\n const minGpsTime = dataView.getFloat64(383, true);\n if (\n !Number.isFinite(maxGpsTime) ||\n !Number.isFinite(minGpsTime) ||\n (maxGpsTime !== 0 && minGpsTime !== 0 && maxGpsTime < minGpsTime)\n ) {\n throw new Error('LASLoader: LAS 1.5 GPS time range is invalid');\n }\n }\n const scale: [number, number, number] = [\n dataView.getFloat64(131, true),\n dataView.getFloat64(139, true),\n dataView.getFloat64(147, true)\n ];\n const offset: [number, number, number] = [\n dataView.getFloat64(155, true),\n dataView.getFloat64(163, true),\n dataView.getFloat64(171, true)\n ];\n const maxs = [\n dataView.getFloat64(179, true),\n dataView.getFloat64(195, true),\n dataView.getFloat64(211, true)\n ];\n const mins = [\n dataView.getFloat64(187, true),\n dataView.getFloat64(203, true),\n dataView.getFloat64(219, true)\n ];\n\n const header: LASHeader = {\n pointsOffset,\n pointsFormatId,\n pointsStructSize,\n pointsCount,\n scale,\n offset,\n maxs,\n mins,\n totalToRead: pointsCount,\n totalRead: 0,\n hasColor: hasPointColor(pointsFormatId),\n versionAsString: `${versionMajor}.${versionMinor}`,\n isCompressed,\n headerSize,\n vlrCount,\n userHeaderData:\n versionMinor === 5 && headerSize > 393\n ? new Uint8Array(arrayBuffer, 393, headerSize - 393).slice()\n : undefined\n };\n if (hasCompleteLASMetadata(arrayBuffer, header)) {\n header.metadata = parseLASMetadata(arrayBuffer, header);\n }\n return header;\n}\n\nfunction hasCompleteLASMetadata(arrayBuffer: ArrayBufferLike, header: LASHeader): boolean {\n const vlrEnd = header.headerSize! + header.vlrCount! * 54;\n return arrayBuffer.byteLength >= Math.max(vlrEnd, header.pointsOffset);\n}\n\nfunction parseLASMetadata(\n arrayBuffer: ArrayBufferLike | ArrayBufferView,\n header: LASHeader\n): LASMetadata {\n const dataView = makeDataView(arrayBuffer);\n const bytes = new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength);\n const version = header.versionAsString || '1.0';\n const versionParts = version.split('.').map(Number);\n const isAtLeast14 = versionParts[0] > 1 || (versionParts[0] === 1 && versionParts[1] >= 4);\n const vlrs = parseLASVariableLengthRecords(dataView, header);\n const evlrOffset = isAtLeast14 ? readUint64(dataView, 235) : 0;\n const evlrCount = isAtLeast14 ? dataView.getUint32(243, true) : 0;\n const evlrs = parseLASExtendedVariableLengthRecords(dataView, evlrOffset, evlrCount);\n const metadata: LASMetadata = {\n fileSourceId: dataView.getUint16(4, true),\n globalEncoding: dataView.getUint16(6, true),\n waveformDataOffset:\n versionParts[0] > 1 || (versionParts[0] === 1 && versionParts[1] >= 3)\n ? dataView.getBigUint64(227, true)\n : undefined,\n projectId: formatLASProjectId(bytes.subarray(8, 24)),\n systemIdentifier: readLASString(bytes, 26, 32),\n generatingSoftware: readLASString(bytes, 58, 32),\n creationDayOfYear: dataView.getUint16(90, true),\n creationYear: dataView.getUint16(92, true),\n headerSize: header.headerSize!,\n userHeaderData: header.userHeaderData,\n vlrCount: header.vlrCount!,\n evlrOffset: evlrOffset || undefined,\n evlrCount: evlrCount || undefined,\n maxGpsTime: versionParts[1] === 5 ? dataView.getFloat64(375, true) : undefined,\n minGpsTime: versionParts[1] === 5 ? dataView.getFloat64(383, true) : undefined,\n timeOffset: versionParts[1] === 5 ? dataView.getUint16(391, true) : undefined,\n pointsByReturn: parsePointsByReturn(dataView, isAtLeast14),\n vlrs,\n evlrs,\n extraBytes: [],\n waveformPacketDescriptors: []\n };\n\n for (const record of vlrs.concat(\n evlrs.map(evlr => ({...evlr, data: evlr.data || new Uint8Array()}))\n )) {\n parseTypedLASMetadataRecord(record, metadata);\n }\n metadata.compatibility = getLASCompatibilityLayout(header, metadata);\n resolveLASGeoTIFFKeyDirectory(metadata);\n return metadata;\n}\n\nfunction parseLASVariableLengthRecords(\n dataView: DataView,\n header: LASHeader\n): LASVariableLengthRecord[] {\n const bytes = new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength);\n const records: LASVariableLengthRecord[] = [];\n let offset = header.headerSize!;\n for (let index = 0; index < header.vlrCount!; index++) {\n if (offset + 54 > bytes.byteLength) {\n break;\n }\n const dataLength = dataView.getUint16(offset + 20, true);\n const dataOffset = offset + 54;\n if (dataOffset + dataLength > bytes.byteLength) {\n break;\n }\n records.push({\n reserved: dataView.getUint16(offset, true),\n userId: readLASString(bytes, offset + 2, 16),\n recordId: dataView.getUint16(offset + 18, true),\n description: readLASString(bytes, offset + 22, 32),\n offset,\n data: bytes.slice(dataOffset, dataOffset + dataLength)\n });\n offset = dataOffset + dataLength;\n }\n return records;\n}\n\nfunction parseLASExtendedVariableLengthRecords(\n dataView: DataView,\n evlrOffset: number,\n evlrCount: number\n): LASExtendedVariableLengthRecord[] {\n if (evlrOffset < 0 || !evlrCount || evlrOffset >= dataView.byteLength) {\n return [];\n }\n const bytes = new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength);\n const records: LASExtendedVariableLengthRecord[] = [];\n let offset = evlrOffset;\n for (let index = 0; index < evlrCount; index++) {\n if (offset + 60 > bytes.byteLength) {\n break;\n }\n const dataLength = readUint64(dataView, offset + 20);\n const dataOffset = offset + 60;\n if (dataLength > bytes.byteLength - dataOffset) {\n break;\n }\n records.push({\n reserved: dataView.getUint16(offset, true),\n userId: readLASString(bytes, offset + 2, 16),\n recordId: dataView.getUint16(offset + 18, true),\n description: readLASString(bytes, offset + 28, 32),\n offset,\n data: bytes.slice(dataOffset, dataOffset + dataLength),\n dataOffset,\n dataLength\n });\n offset = dataOffset + dataLength;\n }\n return records;\n}\n\nfunction parseTypedLASMetadataRecord(\n record: LASVariableLengthRecord | LASExtendedVariableLengthRecord,\n metadata: LASMetadata\n): void {\n const data = record.data;\n if (!data) {\n return;\n }\n if (record.userId === 'LASF_Spec' && record.recordId === 4) {\n metadata.extraBytes.push(...parseLASExtraBytes(data));\n } else if (record.userId === 'LASF_Spec' && record.recordId >= 100 && record.recordId <= 354) {\n metadata.waveformPacketDescriptors.push(parseLASWaveformDescriptor(record.recordId, data));\n } else if (record.userId === 'LASF_Projection' && record.recordId === 2111) {\n metadata.wktMathTransform = decodeLASString(data);\n } else if (record.userId === 'LASF_Projection' && record.recordId === 2112) {\n metadata.wkt = decodeLASString(data);\n } else if (record.userId === 'LASF_Projection' && record.recordId === 34735) {\n metadata.geotiff = {...metadata.geotiff, keys: readUint16Array(data)};\n } else if (record.userId === 'LASF_Projection' && record.recordId === 34736) {\n metadata.geotiff = {...metadata.geotiff, doubles: readFloat64Array(data)};\n } else if (record.userId === 'LASF_Projection' && record.recordId === 34737) {\n metadata.geotiff = {...metadata.geotiff, ascii: decodeLASString(data)};\n }\n}\n\n/** Resolve GeoKey directory entries against their companion LAS GeoTIFF records. */\nfunction resolveLASGeoTIFFKeyDirectory(metadata: LASMetadata): void {\n const geotiff = metadata.geotiff;\n const keys = geotiff?.keys;\n if (!geotiff || !keys || keys.length < 4) {\n return;\n }\n const declaredEntryCount = keys[3];\n if (keys.length < 4 + declaredEntryCount * 4) {\n return;\n }\n const entries: LASGeoTIFFKey[] = [];\n for (let entryIndex = 0; entryIndex < declaredEntryCount; entryIndex++) {\n const entryOffset = 4 + entryIndex * 4;\n const entry: LASGeoTIFFKey = {\n keyId: keys[entryOffset],\n tiffTagLocation: keys[entryOffset + 1],\n count: keys[entryOffset + 2],\n valueOffset: keys[entryOffset + 3]\n };\n entry.value = resolveLASGeoTIFFKeyValue(entry, geotiff);\n if (entry.value === undefined) {\n delete entry.value;\n }\n entries.push(entry);\n }\n geotiff.keyDirectory = {\n version: keys[0],\n keyRevision: keys[1],\n minorRevision: keys[2],\n entries\n };\n}\n\n/** Resolve one GeoKey value from its TIFF-tag location. */\nfunction resolveLASGeoTIFFKeyValue(\n entry: LASGeoTIFFKey,\n geotiff: NonNullable<LASMetadata['geotiff']>\n): number | number[] | string | undefined {\n if (entry.tiffTagLocation === 0) {\n return entry.valueOffset;\n }\n if (entry.tiffTagLocation === 34735 && geotiff.keys) {\n const values = geotiff.keys.slice(entry.valueOffset, entry.valueOffset + entry.count);\n return values.length === entry.count ? Array.from(values) : undefined;\n }\n if (entry.tiffTagLocation === 34736 && geotiff.doubles) {\n const values = geotiff.doubles.slice(entry.valueOffset, entry.valueOffset + entry.count);\n if (values.length !== entry.count) {\n return undefined;\n }\n return entry.count === 1 ? values[0] : Array.from(values);\n }\n if (entry.tiffTagLocation === 34737 && geotiff.ascii !== undefined) {\n const end = entry.valueOffset + entry.count;\n if (end > geotiff.ascii.length) {\n return undefined;\n }\n return geotiff.ascii.slice(entry.valueOffset, end).replace(/\\|$/, '');\n }\n return undefined;\n}\n\nfunction parseLASWaveformDescriptor(\n recordId: number,\n data: Uint8Array\n): LASWaveformPacketDescriptor {\n if (data.byteLength < 28) {\n throw new Error(`LASLoader: waveform descriptor VLR ${recordId} is truncated`);\n }\n const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return {\n recordId,\n bitsPerSample: dataView.getUint8(2),\n compressionType: dataView.getUint8(3),\n numberOfSamples: dataView.getUint32(4, true),\n temporalSampleSpacing: dataView.getUint32(8, true),\n digitizerGain: dataView.getFloat64(12, true),\n digitizerOffset: dataView.getFloat64(20, true)\n };\n}\n\nfunction parsePointsByReturn(dataView: DataView, isAtLeast14: boolean): number[] {\n const count = isAtLeast14 ? 15 : 5;\n const offset = isAtLeast14 ? 255 : 111;\n const values: number[] = [];\n for (let index = 0; index < count; index++) {\n values.push(\n isAtLeast14\n ? readUint64(dataView, offset + index * 8)\n : dataView.getUint32(offset + index * 4, true)\n );\n }\n return values;\n}\n\nfunction readLASString(bytes: Uint8Array, offset: number, length: number): string {\n return decodeLASString(bytes.subarray(offset, offset + length));\n}\n\nfunction decodeLASString(bytes: Uint8Array): string {\n let end = bytes.length;\n while (end > 0 && bytes[end - 1] === 0) {\n end--;\n }\n return new TextDecoder().decode(bytes.subarray(0, end)).trim();\n}\n\nfunction formatLASProjectId(bytes: Uint8Array): string {\n const formatLittleEndian = (start: number, length: number): string =>\n Array.from(bytes.subarray(start, start + length), byte => byte.toString(16).padStart(2, '0'))\n .reverse()\n .join('');\n const formatBigEndian = (start: number, length: number): string =>\n Array.from(bytes.subarray(start, start + length), byte =>\n byte.toString(16).padStart(2, '0')\n ).join('');\n return `${formatLittleEndian(0, 4)}-${formatLittleEndian(4, 2)}-${formatLittleEndian(6, 2)}-${formatBigEndian(8, 2)}${formatBigEndian(10, 6)}`;\n}\n\nfunction readUint16Array(bytes: Uint8Array): Uint16Array {\n const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const values = new Uint16Array(Math.floor(bytes.byteLength / 2));\n for (let index = 0; index < values.length; index++) {\n values[index] = dataView.getUint16(index * 2, true);\n }\n return values;\n}\n\nfunction readFloat64Array(bytes: Uint8Array): Float64Array {\n const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const values = new Float64Array(Math.floor(bytes.byteLength / 8));\n for (let index = 0; index < values.length; index++) {\n values[index] = dataView.getFloat64(index * 8, true);\n }\n return values;\n}\n\n/**\n * Parse raw LAS point records into a MeshArrowTable batch.\n * @param arrayBuffer Raw point record data or a complete LAS file buffer.\n * @param lasHeader LAS header describing the point record layout.\n * @param options LAS loader options.\n * @returns Arrow table batch populated directly from LAS point records.\n */\nfunction parseLASArrowTableBatch(\n arrayBuffer: ArrayBufferLike | ArrayBufferView,\n lasHeader: LASHeader,\n options: LASLoaderOptions = {}\n): LASArrowTable {\n const batchSize = lasHeader.pointsCount;\n const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;\n const positions = new PositionsType(batchSize * 3);\n const selection = getLASColumnSelection(options);\n const colors = lasHeader.hasColor && selection.color ? new Uint8Array(batchSize * 4) : null;\n const intensities = selection.intensity ? new Uint16Array(batchSize) : null;\n const classifications = selection.classification ? new Uint8Array(batchSize) : null;\n const syntheticFlags = selection.synthetic ? new Uint8Array(batchSize) : null;\n const keyPointFlags = selection.keyPoint ? new Uint8Array(batchSize) : null;\n const withheldFlags = selection.withheld ? new Uint8Array(batchSize) : null;\n const overlapFlags = selection.overlap ? new Uint8Array(batchSize) : null;\n const gpsTimes =\n selection.gpsTime && getGpsTimeOffset(lasHeader.pointsFormatId) >= 0\n ? new Float64Array(batchSize)\n : null;\n const nir =\n selection.nir &&\n (getNirOffset(lasHeader.pointsFormatId) >= 0 ||\n (options.las?.compatibilityMode !== 'raw' &&\n lasHeader.metadata?.compatibility?.nirByteOffset !== undefined))\n ? new Uint16Array(batchSize)\n : null;\n const scanAngles = selection.scanAngle ? new Int16Array(batchSize) : null;\n const userData = selection.userData ? new Uint8Array(batchSize) : null;\n const pointSourceIds = selection.pointSourceId ? new Uint16Array(batchSize) : null;\n const returnNumbers = selection.returnNumber ? new Uint8Array(batchSize) : null;\n const numberOfReturns = selection.numberOfReturns ? new Uint8Array(batchSize) : null;\n const scannerChannels = selection.scannerChannel ? new Uint8Array(batchSize) : null;\n const scanDirectionFlags = selection.scanDirectionFlag ? new Uint8Array(batchSize) : null;\n const edgeOfFlightLines = selection.edgeOfFlightLine ? new Uint8Array(batchSize) : null;\n const waveforms =\n selection.waveform && getWaveformOffset(lasHeader.pointsFormatId) >= 0\n ? new Uint8Array(batchSize * 29)\n : null;\n const extraByteCount = Math.max(\n 0,\n lasHeader.pointsStructSize - getLAZPointDataRecordBaseLength(lasHeader.pointsFormatId)\n );\n const extraBytes =\n selection.extraBytes && options.las?.extraBytes !== 'typed' && extraByteCount\n ? new Uint8Array(batchSize * extraByteCount)\n : null;\n const typedExtraBytes =\n selection.extraBytes && options.las?.extraBytes === 'typed'\n ? createTypedExtraBytesAttributes(batchSize, lasHeader)\n : null;\n\n populateLASAttributesFromDataView(makeDataView(arrayBuffer), lasHeader, options, {\n positions,\n colors,\n intensities,\n classifications,\n syntheticFlags,\n keyPointFlags,\n withheldFlags,\n overlapFlags,\n gpsTimes,\n nir,\n scanAngles,\n userData,\n pointSourceIds,\n returnNumbers,\n numberOfReturns,\n scannerChannels,\n scanDirectionFlags,\n edgeOfFlightLines,\n waveforms,\n extraBytes,\n typedExtraBytes,\n pointOffset: 0,\n sourcePointIndex: 0,\n pointCount: batchSize\n });\n\n return makeLASArrowTableFromAttributes(\n lasHeader,\n positions,\n colors,\n intensities,\n classifications,\n syntheticFlags,\n keyPointFlags,\n withheldFlags,\n overlapFlags,\n gpsTimes,\n nir,\n scanAngles,\n userData,\n pointSourceIds,\n returnNumbers,\n numberOfReturns,\n scannerChannels,\n scanDirectionFlags,\n edgeOfFlightLines,\n waveforms,\n extraBytes,\n typedExtraBytes\n );\n}\n\nfunction makeLASArrowTableFromAttributes(\n lasHeader: LASHeader,\n positions: Float32Array | Float64Array,\n colors: Uint8Array | Uint16Array | null,\n intensities: Uint16Array | null,\n classifications: Uint8Array | null,\n syntheticFlags: Uint8Array | null,\n keyPointFlags: Uint8Array | null,\n withheldFlags: Uint8Array | null,\n overlapFlags: Uint8Array | null,\n gpsTimes: Float64Array | null,\n nir: Uint16Array | null,\n scanAngles: Int16Array | null,\n userData: Uint8Array | null,\n pointSourceIds: Uint16Array | null,\n returnNumbers: Uint8Array | null,\n numberOfReturns: Uint8Array | null,\n scannerChannels: Uint8Array | null,\n scanDirectionFlags: Uint8Array | null,\n edgeOfFlightLines: Uint8Array | null,\n waveforms: Uint8Array | null,\n extraBytes: Uint8Array | null,\n typedExtraBytes: LASTypedExtraBytesAttribute[] | null\n): LASArrowTable {\n const attributes: MeshArrowAttributes = {\n POSITION: {value: positions, size: 3}\n };\n if (intensities) {\n attributes.intensity = {value: intensities, size: 1};\n }\n if (classifications) {\n attributes.classification = {value: classifications, size: 1};\n }\n if (syntheticFlags) {\n attributes.synthetic = {value: syntheticFlags, size: 1};\n }\n if (keyPointFlags) {\n attributes.keyPoint = {value: keyPointFlags, size: 1};\n }\n if (withheldFlags) {\n attributes.withheld = {value: withheldFlags, size: 1};\n }\n if (overlapFlags) {\n attributes.overlap = {value: overlapFlags, size: 1};\n }\n if (colors) {\n attributes.COLOR_0 = {value: colors, size: colors instanceof Uint16Array ? 3 : 4};\n }\n if (gpsTimes) {\n attributes.GPS_TIME = {value: gpsTimes, size: 1};\n }\n if (nir) {\n attributes.NIR = {value: nir, size: 1};\n }\n if (scanAngles) {\n attributes.scanAngle = {value: scanAngles, size: 1};\n }\n if (userData) {\n attributes.userData = {value: userData, size: 1};\n }\n if (pointSourceIds) {\n attributes.pointSourceId = {value: pointSourceIds, size: 1};\n }\n if (returnNumbers) {\n attributes.returnNumber = {value: returnNumbers, size: 1};\n }\n if (numberOfReturns) {\n attributes.numberOfReturns = {value: numberOfReturns, size: 1};\n }\n if (scannerChannels) {\n attributes.scannerChannel = {value: scannerChannels, size: 1};\n }\n if (scanDirectionFlags) {\n attributes.scanDirectionFlag = {value: scanDirectionFlags, size: 1};\n }\n if (edgeOfFlightLines) {\n attributes.edgeOfFlightLine = {value: edgeOfFlightLines, size: 1};\n }\n if (waveforms) {\n attributes.WAVEFORM = {value: waveforms, size: 29};\n }\n if (extraBytes) {\n attributes.EXTRA_BYTES = {\n value: extraBytes,\n size: extraBytes.length / Math.max(lasHeader.pointsCount, 1)\n };\n }\n if (typedExtraBytes) {\n for (const attribute of typedExtraBytes) {\n attributes[attribute.name] = {value: attribute.value, size: attribute.size};\n }\n }\n\n const numericAttributes: MeshAttributes = {};\n for (const [name, attribute] of Object.entries(attributes)) {\n if (\n !(attribute.value instanceof BigInt64Array) &&\n !(attribute.value instanceof BigUint64Array)\n ) {\n numericAttributes[name] = {...attribute, value: attribute.value};\n }\n }\n const schema = getLASSchema(lasHeader, numericAttributes);\n return {\n ...makeMeshArrowTable(attributes, {\n schema,\n topology: 'point-list',\n mode: 0,\n boundingBox: getHeaderBoundingBox(lasHeader)\n }),\n loader: 'las',\n loaderData: lasHeader,\n progress: lasHeader.totalRead / lasHeader.totalToRead\n };\n}\n\n/** Create a DataView with exact offsets for ArrayBufferView inputs. */\nfunction makeDataView(arrayBuffer: ArrayBufferLike | ArrayBufferView): DataView {\n if (ArrayBuffer.isView(arrayBuffer)) {\n return new DataView(arrayBuffer.buffer, arrayBuffer.byteOffset, arrayBuffer.byteLength);\n }\n return new DataView(arrayBuffer);\n}\n\nfunction populateLASAttributesFromDataView(\n dataView: DataView,\n lasHeader: LASHeader,\n options: LASLoaderOptions,\n target: {\n positions: Float32Array | Float64Array;\n colors: Uint8Array | null;\n intensities: Uint16Array | null;\n classifications: Uint8Array | null;\n syntheticFlags: Uint8Array | null;\n keyPointFlags: Uint8Array | null;\n withheldFlags: Uint8Array | null;\n overlapFlags: Uint8Array | null;\n gpsTimes: Float64Array | null;\n nir: Uint16Array | null;\n scanAngles: Int16Array | null;\n userData: Uint8Array | null;\n pointSourceIds: Uint16Array | null;\n returnNumbers: Uint8Array | null;\n numberOfReturns: Uint8Array | null;\n scannerChannels: Uint8Array | null;\n scanDirectionFlags: Uint8Array | null;\n edgeOfFlightLines: Uint8Array | null;\n waveforms: Uint8Array | null;\n extraBytes: Uint8Array | null;\n typedExtraBytes: LASTypedExtraBytesAttribute[] | null;\n pointOffset: number;\n sourcePointIndex: number;\n pointCount: number;\n }\n): void {\n const {\n scale: [scaleX, scaleY, scaleZ],\n offset: [offsetX, offsetY, offsetZ]\n } = lasHeader;\n const pointsFormatId = lasHeader.pointsFormatId;\n const pointRecordLength = lasHeader.pointsStructSize;\n const colorOffset = target.colors ? getColorOffset(pointsFormatId) : -1;\n const twoByteColor =\n colorOffset >= 0\n ? detectTwoByteColors(\n dataView,\n lasHeader,\n target.sourcePointIndex,\n target.pointCount,\n options.las?.colorDepth\n )\n : false;\n const intensities = target.intensities;\n const classifications = target.classifications;\n const syntheticFlags = target.syntheticFlags;\n const keyPointFlags = target.keyPointFlags;\n const withheldFlags = target.withheldFlags;\n const overlapFlags = target.overlapFlags;\n const gpsTimes = target.gpsTimes;\n const nir = target.nir;\n const scanAngles = target.scanAngles;\n const userData = target.userData;\n const pointSourceIds = target.pointSourceIds;\n const returnNumbers = target.returnNumbers;\n const numberOfReturns = target.numberOfReturns;\n const scannerChannels = target.scannerChannels;\n const scanDirectionFlags = target.scanDirectionFlags;\n const edgeOfFlightLines = target.edgeOfFlightLines;\n const waveforms = target.waveforms;\n const extraBytes = target.extraBytes;\n const typedExtraBytes = target.typedExtraBytes;\n const gpsTimeOffset = gpsTimes ? getGpsTimeOffset(pointsFormatId) : -1;\n const nirOffset = nir ? getNirOffset(pointsFormatId) : -1;\n\n for (let pointIndex = 0; pointIndex < target.pointCount; pointIndex++) {\n const sourcePointIndex = target.sourcePointIndex + pointIndex;\n const pointOffset = lasHeader.pointsOffset + sourcePointIndex * pointRecordLength;\n const targetPointIndex = target.pointOffset + pointIndex;\n target.positions[targetPointIndex * 3] =\n dataView.getInt32(pointOffset, true) * scaleX + offsetX;\n target.positions[targetPointIndex * 3 + 1] =\n dataView.getInt32(pointOffset + 4, true) * scaleY + offsetY;\n target.positions[targetPointIndex * 3 + 2] =\n dataView.getInt32(pointOffset + 8, true) * scaleZ + offsetZ;\n if (intensities) {\n intensities[targetPointIndex] = dataView.getUint16(pointOffset + 12, true);\n }\n if (classifications) {\n classifications[targetPointIndex] = readClassification(dataView, pointOffset, pointsFormatId);\n }\n if (gpsTimes && gpsTimeOffset >= 0) {\n gpsTimes[targetPointIndex] = dataView.getFloat64(pointOffset + gpsTimeOffset, true);\n }\n if (nir && nirOffset >= 0) {\n nir[targetPointIndex] = dataView.getUint16(pointOffset + nirOffset, true);\n }\n if (scanAngles) {\n scanAngles[targetPointIndex] =\n pointsFormatId <= 5\n ? dataView.getInt8(pointOffset + 16)\n : dataView.getInt16(pointOffset + 18, true);\n }\n if (userData) {\n userData[targetPointIndex] = dataView.getUint8(pointOffset + 17);\n }\n if (pointSourceIds) {\n pointSourceIds[targetPointIndex] = dataView.getUint16(\n pointOffset + (pointsFormatId <= 5 ? 18 : 20),\n true\n );\n }\n const returnFlags = dataView.getUint8(pointOffset + 14);\n const scanFlags = dataView.getUint8(pointOffset + 15);\n const classificationFlags = pointsFormatId <= 5 ? scanFlags >> 5 : scanFlags;\n if (syntheticFlags) {\n syntheticFlags[targetPointIndex] = classificationFlags & 1;\n }\n if (keyPointFlags) {\n keyPointFlags[targetPointIndex] = (classificationFlags >> 1) & 1;\n }\n if (withheldFlags) {\n withheldFlags[targetPointIndex] = (classificationFlags >> 2) & 1;\n }\n if (overlapFlags) {\n overlapFlags[targetPointIndex] = pointsFormatId <= 5 ? 0 : (classificationFlags >> 3) & 1;\n }\n if (returnNumbers) {\n returnNumbers[targetPointIndex] =\n pointsFormatId <= 5 ? returnFlags & 0x07 : returnFlags & 0x0f;\n }\n if (numberOfReturns) {\n numberOfReturns[targetPointIndex] =\n pointsFormatId <= 5 ? (returnFlags >> 3) & 0x07 : returnFlags >> 4;\n }\n if (scannerChannels) {\n scannerChannels[targetPointIndex] = pointsFormatId <= 5 ? 0 : (scanFlags >> 4) & 0x03;\n }\n if (scanDirectionFlags) {\n scanDirectionFlags[targetPointIndex] =\n pointsFormatId <= 5 ? (returnFlags >> 6) & 1 : (scanFlags >> 6) & 1;\n }\n if (edgeOfFlightLines) {\n edgeOfFlightLines[targetPointIndex] =\n pointsFormatId <= 5 ? (returnFlags >> 7) & 1 : (scanFlags >> 7) & 1;\n }\n if (waveforms) {\n const waveformOffset = getWaveformOffset(pointsFormatId);\n if (waveformOffset >= 0) {\n const waveformBytes = new Uint8Array(\n dataView.buffer,\n dataView.byteOffset + pointOffset + waveformOffset,\n 29\n );\n waveforms.set(waveformBytes, targetPointIndex * 29);\n }\n }\n if (extraBytes) {\n const extraByteOffset = getLAZPointDataRecordBaseLength(pointsFormatId);\n const extraByteCount = lasHeader.pointsStructSize - extraByteOffset;\n if (extraByteCount > 0) {\n extraBytes.set(\n new Uint8Array(\n dataView.buffer,\n dataView.byteOffset + pointOffset + extraByteOffset,\n extraByteCount\n ),\n targetPointIndex * extraByteCount\n );\n }\n }\n if (typedExtraBytes) {\n populateTypedExtraBytesFromDataView(\n dataView,\n pointOffset,\n pointsFormatId,\n targetPointIndex,\n typedExtraBytes\n );\n }\n\n if (options.las?.compatibilityMode !== 'raw' && lasHeader.metadata?.compatibility) {\n populateLASCompatibilityPoint(\n dataView,\n pointOffset + getLAZPointDataRecordBaseLength(pointsFormatId),\n targetPointIndex,\n lasHeader.metadata.compatibility,\n target\n );\n }\n\n if (colorOffset >= 0 && target.colors) {\n const red = dataView.getUint16(pointOffset + colorOffset, true);\n const green = dataView.getUint16(pointOffset + colorOffset + 2, true);\n const blue = dataView.getUint16(pointOffset + colorOffset + 4, true);\n target.colors[targetPointIndex * 4] = twoByteColor ? red / 256 : red;\n target.colors[targetPointIndex * 4 + 1] = twoByteColor ? green / 256 : green;\n target.colors[targetPointIndex * 4 + 2] = twoByteColor ? blue / 256 : blue;\n target.colors[targetPointIndex * 4 + 3] = 255;\n }\n }\n}\n\nfunction readClassification(\n dataView: DataView,\n pointOffset: number,\n pointsFormatId: number\n): number {\n return pointsFormatId <= 5\n ? dataView.getUint8(pointOffset + 15) & 0x1f\n : dataView.getUint8(pointOffset + 16);\n}\n\nfunction hasPointColor(pointsFormatId: number): boolean {\n return getColorOffset(pointsFormatId) >= 0;\n}\n\nfunction getColorOffset(pointsFormatId: number): number {\n switch (pointsFormatId) {\n case 2:\n return 20;\n case 3:\n return 28;\n case 5:\n return 28;\n case 7:\n case 8:\n case 10:\n return 30;\n default:\n return -1;\n }\n}\n\n/** Return the fixed LAS waveform packet reference offset for a point format. */\nfunction getWaveformOffset(pointsFormatId: number): number {\n switch (pointsFormatId) {\n case 4:\n return 28;\n case 5:\n return 34;\n case 9:\n return 30;\n case 10:\n return 38;\n default:\n return -1;\n }\n}\n\nfunction getGpsTimeOffset(pointsFormatId: number): number {\n return pointsFormatId === 1 ||\n pointsFormatId === 3 ||\n pointsFormatId === 4 ||\n pointsFormatId === 5\n ? 20\n : pointsFormatId >= 6 && pointsFormatId <= 10\n ? 22\n : -1;\n}\n\nfunction getNirOffset(pointsFormatId: number): number {\n return pointsFormatId === 8 || pointsFormatId === 10 ? 36 : -1;\n}\n\nfunction detectTwoByteColors(\n dataView: DataView,\n lasHeader: LASHeader,\n sourcePointIndex: number,\n batchSize: number,\n colorDepth?: number | string\n): boolean {\n if (colorDepth === 8) {\n return false;\n }\n if (colorDepth === 16) {\n return true;\n }\n if (colorDepth !== 'auto') {\n return false;\n }\n const colorOffset = getColorOffset(lasHeader.pointsFormatId);\n if (colorOffset < 0) {\n return false;\n }\n for (let pointIndex = 0; pointIndex < batchSize; pointIndex++) {\n const pointOffset =\n lasHeader.pointsOffset + (sourcePointIndex + pointIndex) * lasHeader.pointsStructSize;\n if (\n dataView.getUint16(pointOffset + colorOffset, true) > 255 ||\n dataView.getUint16(pointOffset + colorOffset + 2, true) > 255 ||\n dataView.getUint16(pointOffset + colorOffset + 4, true) > 255\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction getBatchSize(options: LASLoaderOptions): number {\n const batchSize = options.core?.batchSize;\n return typeof batchSize === 'number' ? batchSize : DEFAULT_BATCH_SIZE;\n}\n\nfunction parseLASZipVLR(bytes: Uint8Array, header: LASHeader): LASZipVLR {\n const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let offset = header.headerSize || LAS_14_HEADER_LENGTH;\n const vlrCount = header.vlrCount || 0;\n\n for (let index = 0; index < vlrCount; index++) {\n if (offset + 54 > bytes.byteLength) {\n throw new NeedsMoreData('LASLoader: incomplete VLR header');\n }\n const userId = readNullTerminatedAscii(bytes, offset + 2, 16);\n const recordId = dataView.getUint16(offset + 18, true);\n const recordLength = dataView.getUint16(offset + 20, true);\n const dataOffset = offset + 54;\n\n if (dataOffset + recordLength > bytes.byteLength) {\n throw new NeedsMoreData('LASLoader: incomplete VLR data');\n }\n if (userId === LASZIP_USER_ID && recordId === LASZIP_RECORD_ID) {\n if (recordLength < 34) {\n throw new Error('LASLoader: malformed LASzip VLR');\n }\n const chunkSize = dataView.getUint32(dataOffset + 12, true);\n const itemCount = dataView.getUint16(dataOffset + 32, true);\n const itemDataByteLength = 34 + itemCount * 6;\n if (itemDataByteLength > recordLength) {\n throw new Error('LASLoader: malformed LASzip VLR item table');\n }\n let point14ItemVersion: 2 | 3 | 4 | null = null;\n let rgb14ItemVersion: 2 | 3 | 4 | null = null;\n let wavePacket13ItemVersion: 1 | null = null;\n let wavePacketItemVersion: 3 | 4 | null = null;\n let byte14ItemVersion: 2 | 3 | 4 | null = null;\n const items: LASZipItem[] = [];\n for (let itemIndex = 0; itemIndex < itemCount; itemIndex++) {\n const itemOffset = dataOffset + 34 + itemIndex * 6;\n const itemType = dataView.getUint16(itemOffset, true);\n const itemSize = dataView.getUint16(itemOffset + 2, true);\n const itemVersion = dataView.getUint16(itemOffset + 4, true);\n items.push({type: itemType, size: itemSize, version: itemVersion});\n if ([0, 6, 7, 8].includes(itemType)) {\n if (itemVersion !== 1 && itemVersion !== 2) {\n throw new Error(\n `LASLoader: unsupported legacy LASzip item type ${itemType} version ${itemVersion}`\n );\n }\n } else if (itemType === 9) {\n if (itemVersion !== 1) {\n throw new Error(`LASLoader: unsupported WavePacket13 item version ${itemVersion}`);\n }\n wavePacket13ItemVersion = itemVersion;\n } else if ([10, 11, 12, 14].includes(itemType)) {\n if (itemVersion !== 2 && itemVersion !== 3 && itemVersion !== 4) {\n throw new Error(\n `LASLoader: unsupported LAS 1.4 item type ${itemType} version ${itemVersion}`\n );\n }\n if (itemType === 10) {\n point14ItemVersion = itemVersion;\n } else if (itemType === 11 || itemType === 12) {\n rgb14ItemVersion = itemVersion;\n } else {\n byte14ItemVersion = itemVersion;\n }\n } else if (itemType === 13) {\n if (itemVersion !== 3 && itemVersion !== 4) {\n throw new Error(`LASLoader: unsupported WavePacket14 item version ${itemVersion}`);\n }\n wavePacketItemVersion = itemVersion;\n }\n }\n return {\n compressor: dataView.getUint16(dataOffset, true),\n coder: dataView.getUint16(dataOffset + 2, true),\n chunkSize,\n variableChunks:\n dataView.getUint16(dataOffset, true) !== 1 &&\n (chunkSize === 0 || chunkSize === VARIABLE_CHUNK_SIZE),\n items,\n point14ItemVersion,\n rgb14ItemVersion,\n wavePacket13ItemVersion,\n wavePacketItemVersion,\n byte14ItemVersion\n };\n }\n offset = dataOffset + recordLength;\n }\n\n throw new Error('LASLoader: compressed LAZ file does not contain a LASzip VLR');\n}\n\nfunction validateTypeScriptLAZSupport(header: LASHeader, laszip: LASZipVLR): void {\n if (![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].includes(header.pointsFormatId)) {\n throw new Error(\n `LASLoader: TypeScript LAZ streaming only supports point formats 0-10; received ${header.pointsFormatId}`\n );\n }\n if (header.pointsFormatId <= 5 && laszip.compressor !== 1 && laszip.compressor !== 2) {\n throw new Error(\n `LASLoader: legacy TypeScript LAZ decoding requires LASzip compressor 1 or 2; received ${laszip.compressor}`\n );\n }\n if (header.pointsFormatId >= 6 && laszip.compressor !== 3) {\n throw new Error(\n `LASLoader: LAS 1.4 TypeScript LAZ decoding requires LASzip compressor 3; received ${laszip.compressor}`\n );\n }\n if (laszip.coder !== 0) {\n throw new Error(\n `LASLoader: TypeScript LAZ decoding requires LASzip arithmetic coder 0; received ${laszip.coder}`\n );\n }\n validateLASZipItemLayout(header, laszip.items);\n if (header.pointsFormatId >= 6 && !laszip.point14ItemVersion) {\n throw new Error(\n `LASLoader: point format ${header.pointsFormatId} requires a Point14 LASzip item`\n );\n }\n if (\n (header.pointsFormatId === 4 || header.pointsFormatId === 5) &&\n !laszip.wavePacket13ItemVersion\n ) {\n throw new Error(\n `LASLoader: point format ${header.pointsFormatId} requires a WavePacket13 LASzip item`\n );\n }\n if (\n (header.pointsFormatId === 7 || header.pointsFormatId === 8 || header.pointsFormatId === 10) &&\n !laszip.rgb14ItemVersion\n ) {\n throw new Error(\n `LASLoader: point format ${header.pointsFormatId} requires an RGB14 or RGBNIR14 LASzip item`\n );\n }\n if (\n header.pointsFormatId >= 6 &&\n header.pointsStructSize > getLAZPointDataRecordBaseLength(header.pointsFormatId) &&\n !laszip.byte14ItemVersion\n ) {\n throw new Error(\n `LASLoader: point format ${header.pointsFormatId} with Extra Bytes requires a Byte14 LASzip item`\n );\n }\n if (\n (header.pointsFormatId === 9 || header.pointsFormatId === 10) &&\n !laszip.wavePacketItemVersion\n ) {\n throw new Error(\n `LASLoader: point format ${header.pointsFormatId} requires a WavePacket14 LASzip item`\n );\n }\n}\n\n/** Validate the LASzip item sequence assumed by the point-format decoder. */\nfunction validateLASZipItemLayout(header: LASHeader, actualItems: LASZipItem[]): void {\n const pointDataRecordFormat = header.pointsFormatId;\n const baseLength = getLAZPointDataRecordBaseLength(pointDataRecordFormat);\n const extraByteCount = header.pointsStructSize - baseLength;\n if (extraByteCount < 0) {\n throw new Error(\n `LASLoader: point format ${pointDataRecordFormat} record length ${header.pointsStructSize} is smaller than ${baseLength}`\n );\n }\n\n const expectedItems: Array<{type: number; size: number}> = [];\n switch (pointDataRecordFormat) {\n case 0:\n expectedItems.push({type: 6, size: 20});\n break;\n case 1:\n expectedItems.push({type: 6, size: 20}, {type: 7, size: 8});\n break;\n case 2:\n expectedItems.push({type: 6, size: 20}, {type: 8, size: 6});\n break;\n case 3:\n expectedItems.push({type: 6, size: 20}, {type: 7, size: 8}, {type: 8, size: 6});\n break;\n case 4:\n expectedItems.push({type: 6, size: 20}, {type: 7, size: 8}, {type: 9, size: 29});\n break;\n case 5:\n expectedItems.push(\n {type: 6, size: 20},\n {type: 7, size: 8},\n {type: 8, size: 6},\n {type: 9, size: 29}\n );\n break;\n case 6:\n expectedItems.push({type: 10, size: 30});\n break;\n case 7:\n expectedItems.push({type: 10, size: 30}, {type: 11, size: 6});\n break;\n case 8:\n expectedItems.push({type: 10, size: 30}, {type: 12, size: 8});\n break;\n case 9:\n expectedItems.push({type: 10, size: 30}, {type: 13, size: 29});\n break;\n case 10:\n expectedItems.push({type: 10, size: 30}, {type: 12, size: 8}, {type: 13, size: 29});\n break;\n default:\n return;\n }\n if (extraByteCount > 0) {\n expectedItems.push({type: pointDataRecordFormat <= 5 ? 0 : 14, size: extraByteCount});\n }\n\n if (actualItems.length !== expectedItems.length) {\n throw new Error(\n `LASLoader: point format ${pointDataRecordFormat} has ${actualItems.length} LASzip items; expected ${expectedItems.length}`\n );\n }\n for (let itemIndex = 0; itemIndex < expectedItems.length; itemIndex++) {\n const actualItem = actualItems[itemIndex];\n const expectedItem = expectedItems[itemIndex];\n if (actualItem.type !== expectedItem.type) {\n throw new Error(\n `LASLoader: LASzip item ${itemIndex} has type ${actualItem.type}; expected ${expectedItem.type} for point format ${pointDataRecordFormat}`\n );\n }\n if (actualItem.size !== expectedItem.size) {\n throw new Error(\n `LASLoader: LASzip item ${itemIndex} has size ${actualItem.size}; expected ${expectedItem.size} for point format ${pointDataRecordFormat}`\n );\n }\n }\n}\n\n/** Read enough input to parse the LASzip VLR without assuming VLR alignment. */\nasync function readLASZipVLRFromInput(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader\n): Promise<{pending: Uint8Array<ArrayBufferLike>; laszip: LASZipVLR}> {\n let pending = initialPending;\n while (true) {\n try {\n return {pending, laszip: parseLASZipVLR(pending, header)};\n } catch (error) {\n if (!(error instanceof NeedsMoreData)) {\n throw error;\n }\n }\n\n const next = await inputIterator.next();\n if (next.done) {\n throw new NeedsMoreData('LASLoader: incomplete LASzip VLR');\n }\n pending = concatenateUint8Arrays(pending, toUint8Array(next.value));\n }\n}\n\n/** Collect a forward-only input once when metadata at EOF is required before decoding. */\nasync function collectRemainingInputBytes(\n initialPending: Uint8Array<ArrayBufferLike>,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>\n): Promise<Uint8Array<ArrayBufferLike>> {\n const chunks: Uint8Array<ArrayBufferLike>[] = [initialPending];\n let totalByteLength = initialPending.byteLength;\n\n while (true) {\n const next = await inputIterator.next();\n if (next.done) {\n break;\n }\n const chunk = toUint8Array(next.value);\n chunks.push(chunk);\n totalByteLength += chunk.byteLength;\n }\n\n if (chunks.length === 1) {\n return initialPending;\n }\n const bytes = new Uint8Array(totalByteLength);\n let byteOffset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, byteOffset);\n byteOffset += chunk.byteLength;\n }\n return bytes;\n}\n\n/** Validate the trailing chunk table after progressively decoding a fixed-chunk LAZ file. */\nasync function validateStreamedFixedLAZChunkTable(\n reader: BinaryChunkReader,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n laszip: LASZipVLR,\n chunkTableOffset: number,\n decodedChunkByteLengths: readonly number[],\n options: LASLoaderOptions\n): Promise<void> {\n if (options.las?.recoverMissingChunkTable && chunkTableOffset === header.pointsOffset) {\n if (laszip.variableChunks)\n throw new Error('LASLoader: cannot recover a missing variable-size LAZ chunk table');\n while (true) {\n if (reader.getAvailableByteLength())\n throw new Error('LASLoader: unexpected bytes after recovered LAZ chunks');\n const next = await inputIterator.next();\n if (next.done) return;\n reader.write(next.value);\n }\n }\n const decodedPointDataByteLength = decodedChunkByteLengths.reduce(\n (total, byteLength) => total + byteLength,\n 0\n );\n const decodedPointDataEnd =\n header.pointsOffset + LAZ_CHUNK_TABLE_POINTER_LENGTH + decodedPointDataByteLength;\n const effectiveChunkTableOffset =\n chunkTableOffset === -1 ? decodedPointDataEnd : chunkTableOffset;\n if (\n !Number.isSafeInteger(effectiveChunkTableOffset) ||\n effectiveChunkTableOffset < decodedPointDataEnd\n ) {\n throw new Error('LASLoader: LAZ chunk table byte lengths overlap the chunk table');\n }\n\n const gapByteLength = effectiveChunkTableOffset - decodedPointDataEnd;\n await readUntilAvailable(\n reader,\n inputIterator,\n gapByteLength,\n 'LASLoader: incomplete LAZ chunk table'\n );\n reader.skip(gapByteLength);\n const chunks = await readStreamedLAZChunkTable(reader, inputIterator, header, laszip);\n\n if (chunks.length !== decodedChunkByteLengths.length) {\n throw new Error(\n `LASLoader: LAZ chunk table contains ${chunks.length} chunks; decoded ${decodedChunkByteLengths.length}`\n );\n }\n for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {\n if (chunks[chunkIndex].byteLength !== decodedChunkByteLengths[chunkIndex]) {\n throw new Error(\n `LASLoader: LAZ chunk ${chunkIndex} has ${chunks[chunkIndex].byteLength} table bytes; decoded ${decodedChunkByteLengths[chunkIndex]}`\n );\n }\n }\n if (chunkTableOffset === -1) {\n await validateStreamedLAZChunkTableFooter(reader, inputIterator, effectiveChunkTableOffset);\n }\n}\n\n/** Validate the trailing table pointer emitted by non-seekable LASzip writers. */\nasync function validateStreamedLAZChunkTableFooter(\n reader: BinaryChunkReader,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n expectedChunkTableOffset: number\n): Promise<void> {\n const footer = new Uint8Array(LAZ_CHUNK_TABLE_POINTER_LENGTH);\n let byteLength = 0;\n while (true) {\n const availableByteLength = reader.getAvailableByteLength();\n if (availableByteLength > 0) {\n const bytes = reader.readBytes(Math.min(availableByteLength, 64 * 1024));\n appendTrailingBytes(footer, bytes);\n byteLength += bytes.byteLength;\n continue;\n }\n const next = await inputIterator.next();\n if (next.done) {\n break;\n }\n reader.write(next.value);\n }\n if (byteLength < LAZ_CHUNK_TABLE_POINTER_LENGTH) {\n throw new NeedsMoreData('LASLoader: incomplete non-seekable LAZ chunk-table footer');\n }\n const footerOffset = readUint64(new DataView(footer.buffer), 0);\n if (!Number.isSafeInteger(footerOffset) || footerOffset !== expectedChunkTableOffset) {\n throw new Error(\n `LASLoader: non-seekable LAZ footer points to ${footerOffset}; expected ${expectedChunkTableOffset}`\n );\n }\n}\n\n/** Retain only the final bytes from a forward-only input stream. */\nfunction appendTrailingBytes(target: Uint8Array, bytes: Uint8Array): void {\n if (bytes.byteLength >= target.byteLength) {\n target.set(bytes.subarray(bytes.byteLength - target.byteLength));\n return;\n }\n target.copyWithin(0, bytes.byteLength);\n target.set(bytes, target.byteLength - bytes.byteLength);\n}\n\n/** Read only as much trailing input as the compressed chunk table requires. */\nasync function readStreamedLAZChunkTable(\n reader: BinaryChunkReader,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n header: LASHeader,\n laszip: LASZipVLR\n): Promise<LAZChunkTableEntry[]> {\n let candidateByteLength = 64;\n while (true) {\n const availableByteLength = reader.getAvailableByteLength();\n if (availableByteLength >= 8) {\n const checkpoint = reader.checkpoint();\n try {\n const bytes = reader.readBytes(Math.min(availableByteLength, candidateByteLength));\n const chunks = decodeAndValidateLAZChunkTable(bytes, header, laszip);\n reader.restore(checkpoint);\n return chunks;\n } catch (error) {\n reader.restore(checkpoint);\n if (!(error instanceof NeedsMoreData)) {\n throw error;\n }\n candidateByteLength *= 2;\n if (candidateByteLength <= availableByteLength) {\n continue;\n }\n }\n }\n\n const next = await inputIterator.next();\n if (next.done) {\n throw new NeedsMoreData('LASLoader: incomplete LAZ chunk table');\n }\n reader.write(next.value);\n }\n}\n\nasync function readUntilAvailable(\n reader: BinaryChunkReader,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n byteLength: number,\n errorMessage: string\n): Promise<void> {\n while (!reader.hasAvailableBytes(byteLength)) {\n const next = await inputIterator.next();\n if (next.done) {\n throw new NeedsMoreData(errorMessage);\n }\n reader.write(next.value);\n }\n}\n\nasync function readLAZChunkByteLengthFromReader(\n reader: BinaryChunkReader,\n inputIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView>,\n metadata: LAZChunkByteLengthMetadata\n): Promise<number> {\n while (true) {\n const checkpoint = reader.checkpoint();\n let chunkByteLength: number | null;\n try {\n chunkByteLength = tryReadLAZChunkByteLengthFromReader(reader, metadata);\n } finally {\n reader.restore(checkpoint);\n }\n\n if (chunkByteLength !== null) {\n await readUntilAvailable(\n reader,\n inputIterator,\n chunkByteLength,\n 'LASLoader: truncated LAZ chunk'\n );\n return chunkByteLength;\n }\n\n const next = await inputIterator.next();\n if (next.done) {\n throw new NeedsMoreData('LASLoader: truncated LAZ chunk');\n }\n reader.write(next.value);\n }\n}\n\nfunction tryReadLAZChunkByteLengthFromReader(\n reader: BinaryChunkReader,\n metadata: LAZChunkByteLengthMetadata\n): number | null {\n if (metadata.pointDataRecordFormat < 6 || metadata.pointDataRecordFormat > 10) {\n return null;\n }\n\n const extraByteCount =\n metadata.pointDataRecordLength -\n getLAZPointDataRecordBaseLength(metadata.pointDataRecordFormat);\n if (extraByteCount < 0) {\n throw new Error(`Invalid point record length ${metadata.pointDataRecordLength}`);\n }\n const sizeHeaderCount =\n getLAZChunkSizeHeaderBaseCount(metadata.pointDataRecordFormat) + extraByteCount;\n const sizeHeaderOffset = metadata.pointDataRecordLength + 4;\n const sizeHeaderByteLength = sizeHeaderCount * 4;\n const minimumByteLength = sizeHeaderOffset + sizeHeaderByteLength;\n if (!reader.hasAvailableBytes(minimumByteLength)) {\n return null;\n }\n\n reader.skip(sizeHeaderOffset);\n let chunkByteLength = minimumByteLength;\n for (let index = 0; index < sizeHeaderCount; index++) {\n chunkByteLength += reader.readUint32LE();\n }\n return chunkByteLength;\n}\n\nfunction getLAZPointDataRecordBaseLength(pointDataRecordFormat: number): number {\n switch (pointDataRecordFormat) {\n case 0:\n return 20;\n case 1:\n return 28;\n case 2:\n return 26;\n case 3:\n return 34;\n case 4:\n return 57;\n case 5:\n return 63;\n case 6:\n return 30;\n case 7:\n return 36;\n case 8:\n return 38;\n case 9:\n return 59;\n case 10:\n return 67;\n default:\n throw new Error(`Unsupported LAS point format ${pointDataRecordFormat}`);\n }\n}\n\nfunction getLAZChunkSizeHeaderBaseCount(pointDataRecordFormat: number): number {\n switch (pointDataRecordFormat) {\n case 6:\n return 9;\n case 7:\n return 10;\n case 8:\n return 11;\n case 9:\n return 10;\n case 10:\n return 12;\n default:\n throw new Error(`Unsupported LAS 1.4 point format ${pointDataRecordFormat}`);\n }\n}\n\n/** Describe a pointwise stream as one chunk, or read the compressed chunk table. */\nfunction readLAZFileChunks(\n bytes: Uint8Array,\n header: LASHeader,\n laszip: LASZipVLR,\n options: LASLoaderOptions\n): LAZChunkTableEntry[] {\n if (laszip.compressor === 1) {\n return [{pointCount: header.pointsCount, byteLength: bytes.byteLength - header.pointsOffset}];\n }\n const chunkTableOffset = readLAZChunkTableOffset(\n new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength),\n header.pointsOffset\n );\n return readLAZChunkTable(bytes, header, laszip, chunkTableOffset, options);\n}\n\nfunction readLAZChunkTable(\n bytes: Uint8Array,\n header: LASHeader,\n laszip: LASZipVLR,\n chunkTableOffset: number,\n options: LASLoaderOptions\n): LAZChunkTableEntry[] {\n if (options.las?.recoverMissingChunkTable && chunkTableOffset === header.pointsOffset) {\n return recoverFixedLAZChunkTable(bytes, header, laszip);\n }\n if (\n !Number.isSafeInteger(chunkTableOffset) ||\n chunkTableOffset < 0 ||\n chunkTableOffset + 8 > bytes.byteLength\n ) {\n throw new NeedsMoreData('LASLoader: incomplete LAZ chunk table');\n }\n const chunks = decodeAndValidateLAZChunkTable(bytes.subarray(chunkTableOffset), header, laszip);\n const decodedByteLength = chunks.reduce((total, chunk) => total + chunk.byteLength, 0);\n if (header.pointsOffset + LAZ_CHUNK_TABLE_POINTER_LENGTH + decodedByteLength > chunkTableOffset) {\n throw new Error('LASLoader: LAZ chunk table byte lengths overlap the chunk table');\n }\n return chunks;\n}\n\n/** Recover fixed chunks only when LASzip explicitly marks an interrupted writer. */\nfunction recoverFixedLAZChunkTable(\n bytes: Uint8Array,\n header: LASHeader,\n laszip: LASZipVLR\n): LAZChunkTableEntry[] {\n if (laszip.variableChunks || !laszip.chunkSize) {\n throw new Error('LASLoader: cannot recover a missing variable-size LAZ chunk table');\n }\n const chunks: LAZChunkTableEntry[] = [];\n let byteOffset = header.pointsOffset + LAZ_CHUNK_TABLE_POINTER_LENGTH;\n let pointOffset = 0;\n while (pointOffset < header.pointsCount) {\n const pointCount = Math.min(laszip.chunkSize, header.pointsCount - pointOffset);\n const metadata = createLAZChunkMetadata(header, laszip, pointCount);\n const compressed = bytes.subarray(byteOffset);\n let byteLength: number;\n if (header.pointsFormatId <= 5) {\n const cursor = createLAZChunkDecoderCursor(compressed, metadata);\n const scratch = new Uint8Array(Math.min(pointCount, 256) * header.pointsStructSize);\n while (cursor.remainingPointCount) {\n cursor.decodeInto(scratch, 0, Math.min(cursor.remainingPointCount, 256));\n }\n byteLength = cursor.compressedByteOffset;\n } else {\n validateRecoveredLayeredPointCount(compressed, metadata);\n byteLength = getLAZChunkDeclaredByteLength(compressed, metadata);\n }\n if (!byteLength || byteOffset + byteLength > bytes.byteLength) {\n throw new NeedsMoreData('LASLoader: truncated LAZ chunk during table recovery');\n }\n chunks.push({pointCount, byteLength});\n byteOffset += byteLength;\n pointOffset += pointCount;\n }\n if (byteOffset !== bytes.byteLength) {\n throw new Error('LASLoader: unexpected bytes after recovered LAZ chunks');\n }\n return chunks;\n}\n\n/** Require recovered layered chunks to agree with the inferred header point count. */\nfunction validateRecoveredLayeredPointCount(\n compressed: Uint8Array,\n metadata: LAZChunkMetadata\n): void {\n if (compressed.byteLength < metadata.pointDataRecordLength + 4) {\n throw new NeedsMoreData('LASLoader: truncated recovered layered LAZ chunk header');\n }\n const view = new DataView(compressed.buffer, compressed.byteOffset, compressed.byteLength);\n const pointCount = view.getUint32(metadata.pointDataRecordLength, true);\n if (pointCount !== metadata.pointCount) {\n throw new Error(\n `LASLoader: recovered layered LAZ chunk contains ${pointCount} points; expected ${metadata.pointCount}`\n );\n }\n}\n\n/** Decode and validate a LAZ chunk table whose first byte is the table version. */\nfunction decodeAndValidateLAZChunkTable(\n chunkTableBytes: Uint8Array,\n header: LASHeader,\n laszip: LASZipVLR\n): LAZChunkTableEntry[] {\n if (chunkTableBytes.byteLength < 8) {\n throw new NeedsMoreData('LASLoader: incomplete LAZ chunk table');\n }\n const dataView = new DataView(\n chunkTableBytes.buffer,\n chunkTableBytes.byteOffset,\n chunkTableBytes.byteLength\n );\n const version = dataView.getUint32(0, true);\n const chunkCount = dataView.getUint32(4, true);\n if (version !== 0) {\n throw new Error(`LASLoader: unsupported LAZ chunk table version ${version}`);\n }\n if (chunkCount === 0) {\n if (header.pointsCount !== 0) {\n throw new Error('LASLoader: missing LAZ chunk table');\n }\n return [];\n }\n const chunks = decodeLAZChunkTable(chunkTableBytes.subarray(8), {\n chunkCount,\n pointCount: header.pointsCount,\n chunkSize: laszip.chunkSize,\n variable: laszip.variableChunks\n });\n let decodedPointCount = 0;\n for (const chunk of chunks) {\n if (chunk.pointCount === 0 || chunk.byteLength === 0) {\n throw new Error('LASLoader: invalid empty LAZ chunk-table entry');\n }\n decodedPointCount += chunk.pointCount;\n }\n if (decodedPointCount !== header.pointsCount) {\n throw new Error(\n `LASLoader: LAZ chunk table contains ${decodedPointCount} points; expected ${header.pointsCount}`\n );\n }\n return chunks;\n}\n\nfunction createRawPointBatchState(\n batchSize: number,\n pointRecordLength: number,\n stats?: LAZStreamingDecodeStats\n): RawPointBatchState {\n if (stats) {\n stats.rawBatchAllocations++;\n }\n return {\n rawBatch: new Uint8Array(batchSize * pointRecordLength),\n batchPointCount: 0,\n totalRead: 0,\n rawBatchAllocations: 1,\n stats\n };\n}\n\nfunction createPointDataBatchState(\n batchSize: number,\n header: LASHeader,\n options: LASLoaderOptions\n): PointDataBatchState {\n const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;\n const positions = new PositionsType(batchSize * 3);\n const selection = getLASColumnSelection(options);\n const useRawColors =\n header.hasColor &&\n selection.color &&\n (options.las?.colorDepth === 16 || options.las?.colorDepth === 'auto');\n const colors =\n header.hasColor && selection.color && !useRawColors ? new Uint8Array(batchSize * 4) : null;\n const rawColors = useRawColors ? new Uint16Array(batchSize * 3) : null;\n const intensities = selection.intensity ? new Uint16Array(batchSize) : null;\n const classifications = selection.classification ? new Uint8Array(batchSize) : null;\n const syntheticFlags = selection.synthetic ? new Uint8Array(batchSize) : null;\n const keyPointFlags = selection.keyPoint ? new Uint8Array(batchSize) : null;\n const withheldFlags = selection.withheld ? new Uint8Array(batchSize) : null;\n const overlapFlags = selection.overlap ? new Uint8Array(batchSize) : null;\n const gpsTimes =\n selection.gpsTime && getGpsTimeOffset(header.pointsFormatId) >= 0\n ? new Float64Array(batchSize)\n : null;\n const nir =\n selection.nir &&\n (getNirOffset(header.pointsFormatId) >= 0 ||\n (options.las?.compatibilityMode !== 'raw' &&\n header.metadata?.compatibility?.nirByteOffset !== undefined))\n ? new Uint16Array(batchSize)\n : null;\n const scanAngles = selection.scanAngle ? new Int16Array(batchSize) : null;\n const userData = selection.userData ? new Uint8Array(batchSize) : null;\n const pointSourceIds = selection.pointSourceId ? new Uint16Array(batchSize) : null;\n const returnNumbers = selection.returnNumber ? new Uint8Array(batchSize) : null;\n const numberOfReturns = selection.numberOfReturns ? new Uint8Array(batchSize) : null;\n const scannerChannels = selection.scannerChannel ? new Uint8Array(batchSize) : null;\n const scanDirectionFlags = selection.scanDirectionFlag ? new Uint8Array(batchSize) : null;\n const edgeOfFlightLines = selection.edgeOfFlightLine ? new Uint8Array(batchSize) : null;\n const waveforms =\n selection.waveform && getWaveformOffset(header.pointsFormatId) >= 0\n ? new Uint8Array(batchSize * 29)\n : null;\n const extraByteCount = Math.max(\n 0,\n header.pointsStructSize - getLAZPointDataRecordBaseLength(header.pointsFormatId)\n );\n const extraBytes =\n selection.extraBytes && options.las?.extraBytes !== 'typed' && extraByteCount\n ? new Uint8Array(batchSize * extraByteCount)\n : null;\n const typedExtraBytes =\n selection.extraBytes && options.las?.extraBytes === 'typed'\n ? createTypedExtraBytesAttributes(batchSize, header)\n : null;\n const typedExtraBytesSource =\n typedExtraBytes?.length && extraByteCount ? new Uint8Array(batchSize * extraByteCount) : null;\n const reconstructColumns =\n selection.classification ||\n selection.returnNumber ||\n selection.numberOfReturns ||\n selection.scanAngle ||\n selection.overlap ||\n selection.scannerChannel ||\n selection.nir;\n const compatibilityLayout =\n options.las?.compatibilityMode === 'raw' || !reconstructColumns\n ? null\n : header.metadata?.compatibility || null;\n const compatibilityExtraBytesSource =\n compatibilityLayout && !extraBytes && !typedExtraBytesSource\n ? new Uint8Array(batchSize * extraByteCount)\n : null;\n return {\n batchCapacity: batchSize,\n positions,\n colors,\n rawColors,\n intensities,\n classifications,\n syntheticFlags,\n keyPointFlags,\n withheldFlags,\n overlapFlags,\n gpsTimes,\n nir,\n scanAngles,\n userData,\n pointSourceIds,\n returnNumbers,\n numberOfReturns,\n scannerChannels,\n scanDirectionFlags,\n edgeOfFlightLines,\n waveforms,\n extraBytes,\n typedExtraBytes,\n typedExtraBytesSource,\n compatibilityLayout,\n compatibilityExtraBytesSource,\n target: {\n positions,\n intensities,\n classifications,\n syntheticFlags,\n keyPointFlags,\n withheldFlags,\n overlapFlags,\n gpsTimes,\n nir,\n scanAngles,\n userData,\n pointSourceIds,\n returnNumbers,\n numberOfReturns,\n scannerChannels,\n scanDirectionFlags,\n edgeOfFlightLines,\n waveforms,\n extraBytes: extraBytes || typedExtraBytesSource || compatibilityExtraBytesSource,\n colors,\n rawColors,\n pointOffset: 0,\n scale: header.scale,\n offset: header.offset\n },\n batchPointCount: 0,\n totalRead: 0\n };\n}\n\n/** Create typed Extra Bytes output buffers from the descriptors in a LAS header. */\nfunction createTypedExtraBytesAttributes(\n batchSize: number,\n header: LASHeader\n): LASTypedExtraBytesAttribute[] {\n const extraByteCount =\n header.pointsStructSize - getLAZPointDataRecordBaseLength(header.pointsFormatId);\n return createLASTypedExtraBytesAttributes(\n batchSize,\n header.metadata?.extraBytes || [],\n extraByteCount\n );\n}\n\n/** Return the byte width of one scalar Extra Bytes value. */\nfunction getExtraBytesScalarByteLength(dataType: number): number {\n if (dataType <= 2) return 1;\n if (dataType <= 4) return 2;\n if (dataType <= 6 || dataType === 9) return 4;\n if (dataType === 7 || dataType === 8 || dataType === 10) return 8;\n return 0;\n}\n\n/** Decode typed Extra Bytes directly from uncompressed LAS point records. */\nfunction populateTypedExtraBytesFromDataView(\n dataView: DataView,\n pointOffset: number,\n pointDataRecordFormat: number,\n targetPointIndex: number,\n attributes: LASTypedExtraBytesAttribute[]\n): void {\n const extraByteBaseOffset = pointOffset + getLAZPointDataRecordBaseLength(pointDataRecordFormat);\n for (const attribute of attributes) {\n const targetOffset = targetPointIndex * attribute.size;\n const sourceOffset = extraByteBaseOffset + attribute.byteOffset;\n for (let componentIndex = 0; componentIndex < attribute.size; componentIndex++) {\n populateLASTypedExtraBytesComponent(\n dataView,\n sourceOffset + componentIndex * getExtraBytesScalarByteLength(attribute.scalarDataType),\n attribute,\n targetOffset + componentIndex,\n componentIndex\n );\n }\n }\n}\n\n/** Project packed direct-decoder Extra Bytes into descriptor-defined typed columns. */\nfunction populateTypedExtraBytesFromPacked(\n packedExtraBytes: Uint8Array,\n extraByteCount: number,\n pointOffset: number,\n pointCount: number,\n attributes: LASTypedExtraBytesAttribute[]\n): void {\n const dataView = new DataView(\n packedExtraBytes.buffer,\n packedExtraBytes.byteOffset,\n packedExtraBytes.byteLength\n );\n for (let pointIndex = 0; pointIndex < pointCount; pointIndex++) {\n const targetPointIndex = pointOffset + pointIndex;\n const sourceOffset = targetPointIndex * extraByteCount;\n for (const attribute of attributes) {\n const targetOffset = targetPointIndex * attribute.size;\n const scalarByteLength = getExtraBytesScalarByteLength(attribute.scalarDataType);\n for (let componentIndex = 0; componentIndex < attribute.size; componentIndex++) {\n populateLASTypedExtraBytesComponent(\n dataView,\n sourceOffset + attribute.byteOffset + componentIndex * scalarByteLength,\n attribute,\n targetOffset + componentIndex,\n componentIndex\n );\n }\n }\n }\n}\n\n/** Populate typed Extra Bytes produced by the direct LAZ target for newly decoded points. */\nfunction populateDecodedTypedExtraBytes(\n state: PointDataBatchState,\n pointOffset: number,\n pointCount: number\n): void {\n const compatibilityBytes =\n state.extraBytes || state.typedExtraBytesSource || state.compatibilityExtraBytesSource;\n if (state.compatibilityLayout && compatibilityBytes && pointCount) {\n const view = new DataView(\n compatibilityBytes.buffer,\n compatibilityBytes.byteOffset,\n compatibilityBytes.byteLength\n );\n const extraByteCount = compatibilityBytes.length / state.batchCapacity;\n for (let pointIndex = pointOffset; pointIndex < pointOffset + pointCount; pointIndex++) {\n populateLASCompatibilityPoint(\n view,\n pointIndex * extraByteCount,\n pointIndex,\n state.compatibilityLayout,\n state\n );\n }\n }\n if (!state.typedExtraBytesSource || !state.typedExtraBytes?.length || pointCount === 0) {\n return;\n }\n populateTypedExtraBytesFromPacked(\n state.typedExtraBytesSource,\n state.typedExtraBytesSource.length / state.batchCapacity,\n pointOffset,\n pointCount,\n state.typedExtraBytes\n );\n}\n\nfunction getLAZStreamingDecodeStats(\n options: LASLoaderOptions\n): LAZStreamingDecodeStats | undefined {\n return (options.las as {lazStreamingStats?: LAZStreamingDecodeStats} | undefined)\n ?.lazStreamingStats;\n}\n\nfunction recordReadBytesStats(\n reader: BinaryChunkReader,\n byteLength: number,\n stats?: LAZStreamingDecodeStats\n): void {\n if (!stats) {\n return;\n }\n const bufferOffsets = reader.findBufferOffsets(byteLength);\n if (bufferOffsets && bufferOffsets.length > 1) {\n stats.copiedBytes += byteLength;\n stats.chunkConcatenations++;\n }\n}\n\nfunction recordDecodedChunkAllocation(byteLength: number, stats?: LAZStreamingDecodeStats): void {\n if (stats) {\n stats.copiedBytes += byteLength;\n stats.decodedChunkAllocations++;\n }\n}\n\nfunction* appendDecodedLAZChunk(\n compressedChunk: Uint8Array,\n metadata: LAZChunkByteLengthMetadata,\n header: LASHeader,\n state: RawPointBatchState\n): Iterable<LASDecodedChunk> {\n const pointRecordLength = header.pointsStructSize;\n const decoder = createLAZChunkDecoderCursor(compressedChunk, metadata);\n\n while (decoder.remainingPointCount > 0) {\n const batchCapacity = state.rawBatch.byteLength / pointRecordLength;\n const batchRemainingPointCount = batchCapacity - state.batchPointCount;\n const pointsDecoded = decoder.decodeInto(\n state.rawBatch,\n state.batchPointCount * pointRecordLength,\n batchRemainingPointCount\n );\n state.batchPointCount += pointsDecoded;\n\n if (state.batchPointCount === batchCapacity) {\n const batch = flushRawPointBatch(header, state);\n if (batch) {\n yield batch;\n }\n }\n }\n}\n\nfunction* appendRawPointChunk(\n rawChunk: Uint8Array,\n header: LASHeader,\n state: RawPointBatchState\n): Iterable<LASDecodedChunk> {\n const pointRecordLength = header.pointsStructSize;\n const chunkPointCount = rawChunk.byteLength / pointRecordLength;\n\n for (let chunkPointIndex = 0; chunkPointIndex < chunkPointCount; chunkPointIndex++) {\n const sourceOffset = chunkPointIndex * pointRecordLength;\n const targetOffset = state.batchPointCount * pointRecordLength;\n state.rawBatch.set(\n rawChunk.subarray(sourceOffset, sourceOffset + pointRecordLength),\n targetOffset\n );\n state.batchPointCount++;\n\n if (state.batchPointCount === state.rawBatch.byteLength / pointRecordLength) {\n const batch = flushRawPointBatch(header, state);\n if (batch) {\n yield batch;\n }\n }\n }\n}\n\nfunction flushRawPointBatch(header: LASHeader, state: RawPointBatchState): LASDecodedChunk | null {\n if (state.batchPointCount === 0) {\n return null;\n }\n\n const byteLength = state.batchPointCount * header.pointsStructSize;\n const fullBatch = byteLength === state.rawBatch.byteLength;\n const arrayBuffer = fullBatch\n ? state.rawBatch.buffer\n : state.rawBatch.buffer.slice(0, byteLength);\n state.totalRead += state.batchPointCount;\n const batchHeader = {\n ...header,\n pointsOffset: 0,\n pointsCount: state.batchPointCount,\n totalRead: state.totalRead\n };\n state.batchPointCount = 0;\n if (fullBatch) {\n state.rawBatch = new Uint8Array(state.rawBatch.byteLength);\n state.rawBatchAllocations++;\n if (state.stats) {\n state.stats.rawBatchAllocations++;\n }\n }\n return {arrayBuffer, header: batchHeader};\n}\n\nfunction flushPointDataBatch(\n header: LASHeader,\n state: PointDataBatchState,\n options: LASLoaderOptions\n): LASArrowTable | null {\n if (state.batchPointCount === 0) {\n return null;\n }\n\n state.totalRead += state.batchPointCount;\n const batchHeader = {\n ...header,\n pointsOffset: 0,\n pointsCount: state.batchPointCount,\n totalRead: state.totalRead\n };\n const batchPointCount = state.batchPointCount;\n const fullBatch = batchPointCount === state.batchCapacity;\n const positions = fullBatch ? state.positions : state.positions.subarray(0, batchPointCount * 3);\n const intensities = state.intensities\n ? fullBatch\n ? state.intensities\n : state.intensities.subarray(0, batchPointCount)\n : null;\n const classifications = state.classifications\n ? fullBatch\n ? state.classifications\n : state.classifications.subarray(0, batchPointCount)\n : null;\n const syntheticFlags = state.syntheticFlags\n ? fullBatch\n ? state.syntheticFlags\n : state.syntheticFlags.subarray(0, batchPointCount)\n : null;\n const keyPointFlags = state.keyPointFlags\n ? fullBatch\n ? state.keyPointFlags\n : state.keyPointFlags.subarray(0, batchPointCount)\n : null;\n const withheldFlags = state.withheldFlags\n ? fullBatch\n ? state.withheldFlags\n : state.withheldFlags.subarray(0, batchPointCount)\n : null;\n const overlapFlags = state.overlapFlags\n ? fullBatch\n ? state.overlapFlags\n : state.overlapFlags.subarray(0, batchPointCount)\n : null;\n const colors = state.colors\n ? fullBatch\n ? state.colors\n : state.colors.subarray(0, batchPointCount * 4)\n : state.rawColors\n ? convertRawColorsToUint8(state.rawColors, batchPointCount, options)\n : null;\n const gpsTimes = state.gpsTimes\n ? fullBatch\n ? state.gpsTimes\n : state.gpsTimes.subarray(0, batchPointCount)\n : null;\n const nir = state.nir ? (fullBatch ? state.nir : state.nir.subarray(0, batchPointCount)) : null;\n const scanAngles = state.scanAngles\n ? fullBatch\n ? state.scanAngles\n : state.scanAngles.subarray(0, batchPointCount)\n : null;\n const userData = state.userData\n ? fullBatch\n ? state.userData\n : state.userData.subarray(0, batchPointCount)\n : null;\n const pointSourceIds = state.pointSourceIds\n ? fullBatch\n ? state.pointSourceIds\n : state.pointSourceIds.subarray(0, batchPointCount)\n : null;\n const returnNumbers = state.returnNumbers\n ? fullBatch\n ? state.returnNumbers\n : state.returnNumbers.subarray(0, batchPointCount)\n : null;\n const numberOfReturns = state.numberOfReturns\n ? fullBatch\n ? state.numberOfReturns\n : state.numberOfReturns.subarray(0, batchPointCount)\n : null;\n const scannerChannels = state.scannerChannels\n ? fullBatch\n ? state.scannerChannels\n : state.scannerChannels.subarray(0, batchPointCount)\n : null;\n const scanDirectionFlags = state.scanDirectionFlags\n ? fullBatch\n ? state.scanDirectionFlags\n : state.scanDirectionFlags.subarray(0, batchPointCount)\n : null;\n const edgeOfFlightLines = state.edgeOfFlightLines\n ? fullBatch\n ? state.edgeOfFlightLines\n : state.edgeOfFlightLines.subarray(0, batchPointCount)\n : null;\n const waveforms = state.waveforms\n ? fullBatch\n ? state.waveforms\n : state.waveforms.subarray(0, batchPointCount * 29)\n : null;\n const extraByteCount = state.extraBytes ? state.extraBytes.length / state.batchCapacity : 0;\n const extraBytes = state.extraBytes\n ? fullBatch\n ? state.extraBytes\n : state.extraBytes.subarray(0, batchPointCount * extraByteCount)\n : null;\n const typedExtraBytes = state.typedExtraBytes\n ? state.typedExtraBytes.map(attribute => ({\n ...attribute,\n value: fullBatch\n ? attribute.value\n : attribute.value.subarray(0, batchPointCount * attribute.size)\n }))\n : null;\n const table = makeLASArrowTableFromAttributes(\n batchHeader,\n positions,\n colors,\n intensities,\n classifications,\n syntheticFlags,\n keyPointFlags,\n withheldFlags,\n overlapFlags,\n gpsTimes,\n nir,\n scanAngles,\n userData,\n pointSourceIds,\n returnNumbers,\n numberOfReturns,\n scannerChannels,\n scanDirectionFlags,\n edgeOfFlightLines,\n waveforms,\n extraBytes,\n typedExtraBytes\n );\n\n state.batchPointCount = 0;\n if (fullBatch) {\n const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;\n state.positions = new PositionsType(state.positions.length);\n state.colors = state.colors ? new Uint8Array(state.colors.length) : null;\n state.rawColors = state.rawColors ? new Uint16Array(state.rawColors.length) : null;\n state.intensities = state.intensities ? new Uint16Array(state.intensities.length) : null;\n state.classifications = state.classifications\n ? new Uint8Array(state.classifications.length)\n : null;\n state.syntheticFlags = state.syntheticFlags\n ? new Uint8Array(state.syntheticFlags.length)\n : null;\n state.keyPointFlags = state.keyPointFlags ? new Uint8Array(state.keyPointFlags.length) : null;\n state.withheldFlags = state.withheldFlags ? new Uint8Array(state.withheldFlags.length) : null;\n state.overlapFlags = state.overlapFlags ? new Uint8Array(state.overlapFlags.length) : null;\n state.gpsTimes = state.gpsTimes ? new Float64Array(state.gpsTimes.length) : null;\n state.nir = state.nir ? new Uint16Array(state.nir.length) : null;\n state.scanAngles = state.scanAngles ? new Int16Array(state.scanAngles.length) : null;\n state.userData = state.userData ? new Uint8Array(state.userData.length) : null;\n state.pointSourceIds = state.pointSourceIds\n ? new Uint16Array(state.pointSourceIds.length)\n : null;\n state.returnNumbers = state.returnNumbers ? new Uint8Array(state.returnNumbers.length) : null;\n state.numberOfReturns = state.numberOfReturns\n ? new Uint8Array(state.numberOfReturns.length)\n : null;\n state.scannerChannels = state.scannerChannels\n ? new Uint8Array(state.scannerChannels.length)\n : null;\n state.scanDirectionFlags = state.scanDirectionFlags\n ? new Uint8Array(state.scanDirectionFlags.length)\n : null;\n state.edgeOfFlightLines = state.edgeOfFlightLines\n ? new Uint8Array(state.edgeOfFlightLines.length)\n : null;\n state.waveforms = state.waveforms ? new Uint8Array(state.waveforms.length) : null;\n state.extraBytes = state.extraBytes ? new Uint8Array(state.extraBytes.length) : null;\n state.typedExtraBytes = state.typedExtraBytes\n ? state.typedExtraBytes.map(attribute => ({\n ...attribute,\n value: createLASTypedExtraBytesValue(\n attribute.scalarDataType,\n attribute.value.length,\n attribute.outputFloat64\n )\n }))\n : null;\n state.typedExtraBytesSource = state.typedExtraBytesSource\n ? new Uint8Array(state.typedExtraBytesSource.length)\n : null;\n state.target.positions = state.positions;\n state.target.colors = state.colors;\n state.target.rawColors = state.rawColors;\n state.target.intensities = state.intensities;\n state.target.classifications = state.classifications;\n state.target.syntheticFlags = state.syntheticFlags;\n state.target.keyPointFlags = state.keyPointFlags;\n state.target.withheldFlags = state.withheldFlags;\n state.target.overlapFlags = state.overlapFlags;\n state.target.gpsTimes = state.gpsTimes;\n state.target.nir = state.nir;\n state.target.scanAngles = state.scanAngles;\n state.target.userData = state.userData;\n state.target.pointSourceIds = state.pointSourceIds;\n state.target.returnNumbers = state.returnNumbers;\n state.target.numberOfReturns = state.numberOfReturns;\n state.target.scannerChannels = state.scannerChannels;\n state.target.scanDirectionFlags = state.scanDirectionFlags;\n state.target.edgeOfFlightLines = state.edgeOfFlightLines;\n state.target.waveforms = state.waveforms;\n state.compatibilityExtraBytesSource = state.compatibilityExtraBytesSource\n ? new Uint8Array(state.compatibilityExtraBytesSource.length)\n : null;\n state.target.extraBytes =\n state.extraBytes || state.typedExtraBytesSource || state.compatibilityExtraBytesSource;\n }\n return table;\n}\n\n/** Resolve optional Arrow columns once before allocating or decoding a point batch. */\nfunction getLASColumnSelection(options: LASLoaderOptions): {\n intensity: boolean;\n classification: boolean;\n synthetic: boolean;\n keyPoint: boolean;\n withheld: boolean;\n overlap: boolean;\n color: boolean;\n gpsTime: boolean;\n nir: boolean;\n scanAngle: boolean;\n userData: boolean;\n pointSourceId: boolean;\n returnNumber: boolean;\n numberOfReturns: boolean;\n scannerChannel: boolean;\n scanDirectionFlag: boolean;\n edgeOfFlightLine: boolean;\n waveform: boolean;\n extraBytes: boolean;\n} {\n const columns = options.las?.columns;\n if (!columns) {\n return {\n intensity: true,\n classification: true,\n synthetic: true,\n keyPoint: true,\n withheld: true,\n overlap: true,\n color: true,\n gpsTime: true,\n nir: true,\n scanAngle: true,\n userData: true,\n pointSourceId: true,\n returnNumber: true,\n numberOfReturns: true,\n scannerChannel: true,\n scanDirectionFlag: true,\n edgeOfFlightLine: true,\n waveform: true,\n extraBytes: options.las?.extraBytes === 'typed'\n };\n }\n\n let intensity = false;\n let classification = false;\n let synthetic = false;\n let keyPoint = false;\n let withheld = false;\n let overlap = false;\n let color = false;\n let gpsTime = false;\n let nir = false;\n let scanAngle = false;\n let userData = false;\n let pointSourceId = false;\n let returnNumber = false;\n let numberOfReturns = false;\n let scannerChannel = false;\n let scanDirectionFlag = false;\n let edgeOfFlightLine = false;\n let waveform = false;\n let extraBytes = false;\n for (const column of columns as readonly string[]) {\n switch (column) {\n case 'POSITION':\n break;\n case 'intensity':\n intensity = true;\n break;\n case 'classification':\n classification = true;\n break;\n case 'synthetic':\n synthetic = true;\n break;\n case 'keyPoint':\n keyPoint = true;\n break;\n case 'withheld':\n withheld = true;\n break;\n case 'overlap':\n overlap = true;\n break;\n case 'COLOR_0':\n color = true;\n break;\n case 'GPS_TIME':\n gpsTime = true;\n break;\n case 'NIR':\n nir = true;\n break;\n case 'scanAngle':\n scanAngle = true;\n break;\n case 'userData':\n userData = true;\n break;\n case 'pointSourceId':\n pointSourceId = true;\n break;\n case 'returnNumber':\n returnNumber = true;\n break;\n case 'numberOfReturns':\n numberOfReturns = true;\n break;\n case 'scannerChannel':\n scannerChannel = true;\n break;\n case 'scanDirectionFlag':\n scanDirectionFlag = true;\n break;\n case 'edgeOfFlightLine':\n edgeOfFlightLine = true;\n break;\n case 'WAVEFORM':\n waveform = true;\n break;\n case 'EXTRA_BYTES':\n extraBytes = true;\n break;\n default:\n throw new Error(`LASLoader: unsupported column ${column}`);\n }\n }\n return {\n intensity,\n classification,\n synthetic,\n keyPoint,\n withheld,\n overlap,\n color,\n gpsTime,\n nir,\n scanAngle,\n userData,\n pointSourceId,\n returnNumber,\n numberOfReturns,\n scannerChannel,\n scanDirectionFlag,\n edgeOfFlightLine,\n waveform,\n extraBytes\n };\n}\n\nfunction convertRawColorsToUint8(\n rawColors: Uint16Array,\n pointCount: number,\n options: LASLoaderOptions\n): Uint8Array {\n const colors = new Uint8Array(pointCount * 4);\n const packedColors = new Uint32Array(colors.buffer);\n const twoByteColor = detectTwoByteRawColors(rawColors, pointCount, options.las?.colorDepth);\n if (twoByteColor) {\n for (let pointIndex = 0; pointIndex < pointCount; pointIndex++) {\n const sourceOffset = pointIndex * 3;\n const red = (rawColors[sourceOffset] >> 8) & 0xff;\n const green = (rawColors[sourceOffset + 1] >> 8) & 0xff;\n const blue = (rawColors[sourceOffset + 2] >> 8) & 0xff;\n packedColors[pointIndex] = 0xff000000 | (blue << 16) | (green << 8) | red;\n }\n } else {\n for (let pointIndex = 0; pointIndex < pointCount; pointIndex++) {\n const sourceOffset = pointIndex * 3;\n const red = rawColors[sourceOffset] & 0xff;\n const green = rawColors[sourceOffset + 1] & 0xff;\n const blue = rawColors[sourceOffset + 2] & 0xff;\n packedColors[pointIndex] = 0xff000000 | (blue << 16) | (green << 8) | red;\n }\n }\n return colors;\n}\n\nfunction detectTwoByteRawColors(\n rawColors: Uint16Array,\n pointCount: number,\n colorDepth?: number | string\n): boolean {\n if (colorDepth === 8) {\n return false;\n }\n if (colorDepth === 16) {\n return true;\n }\n if (colorDepth !== 'auto') {\n return false;\n }\n for (let index = 0; index < pointCount * 3; index++) {\n if (rawColors[index] > 255) {\n return true;\n }\n }\n return false;\n}\n\nfunction readNullTerminatedAscii(bytes: Uint8Array, offset: number, length: number): string {\n let end = offset;\n const maxEnd = offset + length;\n while (end < maxEnd && bytes[end] !== 0) {\n end++;\n }\n return String.fromCharCode(...bytes.subarray(offset, end));\n}\n\nfunction getHeaderBoundingBox(\n header: LASHeader\n): [[number, number, number], [number, number, number]] {\n const minimum = header.mins || [0, 0, 0];\n const maximum = header.maxs || [0, 0, 0];\n return [\n [minimum[0], minimum[1], minimum[2]],\n [maximum[0], maximum[1], maximum[2]]\n ];\n}\n\nfunction* readAvailablePointBatches(\n pending: Uint8Array,\n absoluteOffset: number,\n header: LASHeader,\n sourcePointIndex: number,\n totalRead: number,\n batchSize: number\n): Iterable<{\n arrayBuffer: ArrayBufferLike;\n header: LASHeader;\n pending: Uint8Array;\n absoluteOffset: number;\n sourcePointIndex: number;\n totalRead: number;\n}> {\n while (sourcePointIndex < header.pointsCount && totalRead < header.totalToRead) {\n const batch = readAvailableContiguousPointBatch(\n pending,\n absoluteOffset,\n header,\n sourcePointIndex,\n totalRead,\n batchSize\n );\n if (!batch) {\n return;\n }\n pending = batch.pending;\n absoluteOffset = batch.absoluteOffset;\n sourcePointIndex = batch.sourcePointIndex;\n totalRead = batch.totalRead;\n yield batch;\n }\n}\n\nfunction readAvailableContiguousPointBatch(\n pending: Uint8Array,\n absoluteOffset: number,\n header: LASHeader,\n sourcePointIndex: number,\n totalRead: number,\n batchSize: number\n): {\n arrayBuffer: ArrayBufferLike;\n header: LASHeader;\n pending: Uint8Array;\n absoluteOffset: number;\n sourcePointIndex: number;\n totalRead: number;\n} | null {\n const pointRecordLength = header.pointsStructSize;\n const pointAbsoluteOffset = header.pointsOffset + sourcePointIndex * pointRecordLength;\n const pointPendingOffset = pointAbsoluteOffset - absoluteOffset;\n if (pointPendingOffset < 0) {\n throw new Error('LASLoader: invalid streaming point offset');\n }\n if (pointPendingOffset + pointRecordLength > pending.byteLength) {\n return null;\n }\n\n const availablePointCount = Math.floor(\n (pending.byteLength - pointPendingOffset) / pointRecordLength\n );\n const batchPointCount = Math.min(\n batchSize,\n availablePointCount,\n header.pointsCount - sourcePointIndex,\n header.totalToRead - totalRead\n );\n if (batchPointCount <= 0) {\n return null;\n }\n\n sourcePointIndex += batchPointCount;\n totalRead += batchPointCount;\n const batchHeader = {\n ...header,\n pointsOffset: pending.byteOffset + pointPendingOffset,\n pointsCount: batchPointCount,\n totalRead\n };\n const nextPointOffset = header.pointsOffset + sourcePointIndex * pointRecordLength;\n const discardByteCount = Math.max(\n 0,\n Math.min(pending.byteLength, nextPointOffset - absoluteOffset)\n );\n\n return {\n arrayBuffer: pending.buffer,\n header: batchHeader,\n pending: pending.subarray(discardByteCount),\n absoluteOffset: absoluteOffset + discardByteCount,\n sourcePointIndex,\n totalRead\n };\n}\n\nfunction tryParseHeader(pending: Uint8Array, absoluteOffset: number): LASHeader | null {\n if (absoluteOffset !== 0 || pending.byteLength < 227) {\n return null;\n }\n const dataView = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);\n if (dataView.getUint32(0, true) !== LASF_SIGNATURE) {\n throw new Error('LASLoader: invalid LAS header');\n }\n const headerLength = dataView.getUint32(96, true);\n if (pending.byteLength < Math.max(headerLength, 255)) {\n return null;\n }\n const header = parseLASHeader(\n pending.buffer.slice(pending.byteOffset, pending.byteOffset + pending.byteLength)\n );\n return header;\n}\n\nfunction concatenateUint8Arrays(\n first: Uint8Array<ArrayBufferLike>,\n second: Uint8Array<ArrayBufferLike>\n): Uint8Array<ArrayBufferLike> {\n if (first.byteLength === 0) {\n return second;\n }\n const result = new Uint8Array(first.byteLength + second.byteLength);\n result.set(first);\n result.set(second, first.byteLength);\n return result;\n}\n\nfunction toUint8Array(data: ArrayBufferLike | ArrayBufferView): Uint8Array<ArrayBuffer> {\n const source = ArrayBuffer.isView(data)\n ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n : new Uint8Array(data);\n const copy = new Uint8Array(source.byteLength);\n copy.set(source);\n return copy;\n}\n\nfunction toAsyncIterator(\n data:\n | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n | Iterable<ArrayBufferLike | ArrayBufferView>\n): AsyncIterator<ArrayBufferLike | ArrayBufferView> {\n if (Symbol.asyncIterator in data) {\n return data[Symbol.asyncIterator]();\n }\n const iterator = data[Symbol.iterator]();\n return {\n async next() {\n return iterator.next();\n }\n };\n}\n\n/** Resolve the LAZ chunk-table offset, including the non-seekable-writer sentinel layout. */\nfunction readLAZChunkTableOffset(dataView: DataView, pointDataOffset: number): number {\n if (isNegativeOneUint64(dataView, pointDataOffset)) {\n if (dataView.byteLength < LAZ_CHUNK_TABLE_POINTER_LENGTH) {\n return 0;\n }\n return readUint64(dataView, dataView.byteLength - LAZ_CHUNK_TABLE_POINTER_LENGTH);\n }\n return readUint64(dataView, pointDataOffset);\n}\n\n/** Read a streaming chunk-table pointer, returning -1 for the end-pointer sentinel. */\nfunction readStreamedLAZChunkTableOffset(dataView: DataView): number {\n return isNegativeOneUint64(dataView, 0) ? -1 : readUint64(dataView, 0);\n}\n\n/** Return true when an eight-byte field contains signed little-endian -1. */\nfunction isNegativeOneUint64(dataView: DataView, byteOffset: number): boolean {\n return (\n dataView.byteLength >= byteOffset + 8 &&\n dataView.getUint32(byteOffset, true) === 0xffffffff &&\n dataView.getUint32(byteOffset + 4, true) === 0xffffffff\n );\n}\n\nfunction readUint64(dataView: DataView, byteOffset: number): number {\n if (dataView.byteLength < byteOffset + 8) {\n return 0;\n }\n const low = dataView.getUint32(byteOffset, true);\n const high = dataView.getUint32(byteOffset + 4, true);\n return high * 2 ** 32 + low;\n}\n\nexport const LAS_1_4_HEADER_LENGTH = LAS_14_HEADER_LENGTH;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_schema_utils", "import_get_las_schema", "totalPointCount", "next", "update"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { MeshArrowTable } from '@loaders.gl/core/schema';
|
|
2
|
+
import type { LAZChunkMetadata } from '@loaders.gl/core/loader-utils';
|
|
3
|
+
import type { LASLoaderOptions } from "../../las-loader-types.js";
|
|
4
|
+
import type { LASHeader } from "../las-types.js";
|
|
5
|
+
/** Arrow table returned by the TypeScript LAS parser with LAS loader metadata attached. */
|
|
6
|
+
export type LASArrowTable = MeshArrowTable & {
|
|
7
|
+
/** Loader identifier preserved for mesh compatibility conversion. */
|
|
8
|
+
loader: 'las';
|
|
9
|
+
/** Parsed LAS header and metadata for the batch. */
|
|
10
|
+
loaderData: LASHeader;
|
|
11
|
+
/** Batch parse progress in the range [0, 1]. */
|
|
12
|
+
progress?: number;
|
|
13
|
+
};
|
|
14
|
+
type LASDecodedChunk = {
|
|
15
|
+
arrayBuffer: ArrayBufferLike;
|
|
16
|
+
header: LASHeader;
|
|
17
|
+
};
|
|
18
|
+
/** Metadata needed to decode one standalone LAZ chunk into LAS Arrow columns. */
|
|
19
|
+
export type LAZChunkArrowTableMetadata = LAZChunkMetadata & {
|
|
20
|
+
/** LAS coordinate scales applied to encoded XYZ integers. */
|
|
21
|
+
scale: [number, number, number];
|
|
22
|
+
/** LAS coordinate offsets applied to encoded XYZ integers. */
|
|
23
|
+
offset: [number, number, number];
|
|
24
|
+
};
|
|
25
|
+
/** Parse LAS data with the TypeScript loader variant. */
|
|
26
|
+
export declare function parseLAS(arrayBuffer: ArrayBuffer, options?: LASLoaderOptions): LASArrowTable;
|
|
27
|
+
/** Decode one complete modern LAZ chunk directly into selected Arrow columns. */
|
|
28
|
+
export declare function decodeLAZChunkToArrowTable(compressed: ArrayBuffer | ArrayBufferView, metadata: LAZChunkArrowTableMetadata, options: LASLoaderOptions): LASArrowTable;
|
|
29
|
+
/** Parse LAS data from an incoming byte iterator into point batches. */
|
|
30
|
+
export declare function parseLASInBatches(arrayBufferIterator: AsyncIterable<ArrayBufferLike | ArrayBufferView> | Iterable<ArrayBufferLike | ArrayBufferView>, options?: LASLoaderOptions): AsyncIterable<LASArrowTable>;
|
|
31
|
+
/** Decode LAS data into raw point chunks. */
|
|
32
|
+
export declare function parseLASChunkedIterator(arrayBuffer: ArrayBuffer, batchSize?: number, options?: LASLoaderOptions): Iterable<LASDecodedChunk>;
|
|
33
|
+
/** Decode compressed LAZ file data from an incoming byte iterator into raw point chunks. */
|
|
34
|
+
export declare function decodeLAZFileInBatches(arrayBufferIterator: AsyncIterable<ArrayBufferLike | ArrayBufferView> | Iterable<ArrayBufferLike | ArrayBufferView>, options?: LASLoaderOptions): AsyncIterable<LASDecodedChunk>;
|
|
35
|
+
/** Parse the public LAS header block. */
|
|
36
|
+
export declare function parseLASHeader(arrayBuffer: ArrayBufferLike): LASHeader;
|
|
37
|
+
export declare const LAS_1_4_HEADER_LENGTH = 375;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=parse-las.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-las.d.ts","sourceRoot":"","sources":["../../../../src/las/lib/typescript/parse-las.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,cAAc,EAAiB,MAAM,yBAAyB,CAAC;AAY5E,OAAO,KAAK,EACV,gBAAgB,EAGjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAC,gBAAgB,EAAC,kCAA+B;AAc7D,OAAO,KAAK,EAGV,SAAS,EAIV,wBAAqB;AAEtB,2FAA2F;AAC3F,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAC3C,qEAAqE;IACrE,MAAM,EAAE,KAAK,CAAC;IACd,oDAAoD;IACpD,UAAU,EAAE,SAAS,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,0BAA0B,GAAG,gBAAgB,GAAG;IAC1D,6DAA6D;IAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,8DAA8D;IAC9D,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAoHF,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,aAAa,CA8BhG;AAED,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,WAAW,GAAG,eAAe,EACzC,QAAQ,EAAE,0BAA0B,EACpC,OAAO,EAAE,gBAAgB,GACxB,aAAa,CAoCf;AA4GD,wEAAwE;AACxE,wBAAuB,iBAAiB,CACtC,mBAAmB,EACf,aAAa,CAAC,eAAe,GAAG,eAAe,CAAC,GAChD,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC,EAC/C,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAAC,aAAa,CAAC,CA6H9B;AAkDD,6CAA6C;AAC7C,wBAAiB,uBAAuB,CACtC,WAAW,EAAE,WAAW,EACxB,SAAS,GAAE,MAA2B,EACtC,OAAO,GAAE,gBAAqB,GAC7B,QAAQ,CAAC,eAAe,CAAC,CA6B3B;AAED,4FAA4F;AAC5F,wBAAuB,sBAAsB,CAC3C,mBAAmB,EACf,aAAa,CAAC,eAAe,GAAG,eAAe,CAAC,GAChD,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC,EAC/C,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAAC,eAAe,CAAC,CAkBhC;AAinBD,yCAAyC;AACzC,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,SAAS,CAiGtE;AAm+ED,eAAO,MAAM,qBAAqB,MAAuB,CAAC"}
|