@loaders.gl/pointclouds 5.0.0-beta.1 → 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 +1 -1
- package/PCD-README.md +1 -1
- package/PLY-README.md +1 -1
- package/README.md +5 -1
- package/dist/dist.dev.js +3584 -2211
- package/dist/dist.min.js +20 -20
- package/dist/index.cjs +0 -6
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/las/bundled.cjs +0 -3
- package/dist/las/bundled.cjs.map +2 -2
- package/dist/las/bundled.d.ts +0 -1
- package/dist/las/bundled.d.ts.map +1 -1
- package/dist/las/bundled.js +0 -1
- package/dist/las/bundled.js.map +1 -1
- package/dist/las/index.cjs +0 -3
- package/dist/las/index.cjs.map +3 -3
- package/dist/las/index.d.ts +0 -2
- package/dist/las/index.d.ts.map +1 -1
- package/dist/las/index.js +0 -3
- package/dist/las/index.js.map +1 -1
- package/dist/las/las-copc-loader-types.cjs +1 -1
- package/dist/las/las-copc-loader-types.cjs.map +2 -2
- package/dist/las/las-copc-loader-types.d.ts +13 -9
- package/dist/las/las-copc-loader-types.d.ts.map +1 -1
- package/dist/las/las-copc-loader-types.js +1 -1
- package/dist/las/las-copc-loader-types.js.map +1 -1
- package/dist/las/las-copc-loader.cjs +8 -5
- package/dist/las/las-copc-loader.cjs.map +2 -2
- package/dist/las/las-copc-loader.d.ts +8 -6
- package/dist/las/las-copc-loader.d.ts.map +1 -1
- package/dist/las/las-copc-loader.js +11 -6
- package/dist/las/las-copc-loader.js.map +1 -1
- package/dist/las/las-loader-shared.cjs +4 -2
- package/dist/las/las-loader-shared.cjs.map +2 -2
- package/dist/las/las-loader-shared.d.ts +9 -7
- package/dist/las/las-loader-shared.d.ts.map +1 -1
- package/dist/las/las-loader-shared.js +4 -2
- package/dist/las/las-loader-shared.js.map +1 -1
- package/dist/las/las-loader-types.cjs +3 -6
- package/dist/las/las-loader-types.cjs.map +2 -2
- package/dist/las/las-loader-types.d.ts +18 -45
- package/dist/las/las-loader-types.d.ts.map +1 -1
- package/dist/las/las-loader-types.js +1 -3
- package/dist/las/las-loader-types.js.map +1 -1
- package/dist/las/las-loader.cjs +61 -13
- package/dist/las/las-loader.cjs.map +3 -3
- package/dist/las/las-loader.d.ts +51 -5
- package/dist/las/las-loader.d.ts.map +1 -1
- package/dist/las/las-loader.js +56 -6
- package/dist/las/las-loader.js.map +1 -1
- package/dist/las/las-writer.cjs +3 -3
- package/dist/las/las-writer.cjs.map +2 -2
- package/dist/las/las-writer.d.ts +4 -3
- package/dist/las/las-writer.d.ts.map +1 -1
- package/dist/las/las-writer.js +4 -6
- package/dist/las/las-writer.js.map +1 -1
- package/dist/las/laz-rs-loader-types.cjs +1 -1
- package/dist/las/laz-rs-loader-types.cjs.map +2 -2
- package/dist/las/laz-rs-loader-types.d.ts +13 -9
- package/dist/las/laz-rs-loader-types.d.ts.map +1 -1
- package/dist/las/laz-rs-loader-types.js +1 -1
- package/dist/las/laz-rs-loader-types.js.map +1 -1
- package/dist/las/laz-rs-loader.cjs +8 -5
- package/dist/las/laz-rs-loader.cjs.map +2 -2
- package/dist/las/laz-rs-loader.d.ts +8 -6
- package/dist/las/laz-rs-loader.d.ts.map +1 -1
- package/dist/las/laz-rs-loader.js +11 -6
- package/dist/las/laz-rs-loader.js.map +1 -1
- package/dist/las/lazperf-loader-types.cjs +1 -1
- package/dist/las/lazperf-loader-types.cjs.map +2 -2
- package/dist/las/lazperf-loader-types.d.ts +14 -10
- package/dist/las/lazperf-loader-types.d.ts.map +1 -1
- package/dist/las/lazperf-loader-types.js +1 -1
- package/dist/las/lazperf-loader-types.js.map +1 -1
- package/dist/las/lazperf-loader.cjs +9 -6
- package/dist/las/lazperf-loader.cjs.map +2 -2
- package/dist/las/lazperf-loader.d.ts +9 -7
- package/dist/las/lazperf-loader.d.ts.map +1 -1
- package/dist/las/lazperf-loader.js +12 -7
- package/dist/las/lazperf-loader.js.map +1 -1
- package/dist/las/lib/copc/parse-las.cjs +1 -1
- package/dist/las/lib/copc/parse-las.cjs.map +2 -2
- package/dist/las/lib/copc/parse-las.js +1 -1
- package/dist/las/lib/copc/parse-las.js.map +1 -1
- package/dist/las/lib/get-las-schema.cjs +5 -0
- package/dist/las/lib/get-las-schema.cjs.map +2 -2
- package/dist/las/lib/get-las-schema.d.ts.map +1 -1
- package/dist/las/lib/get-las-schema.js +6 -0
- package/dist/las/lib/get-las-schema.js.map +1 -1
- package/dist/las/lib/las-extra-bytes.cjs +6 -1
- package/dist/las/lib/las-extra-bytes.cjs.map +2 -2
- package/dist/las/lib/las-extra-bytes.d.ts.map +1 -1
- package/dist/las/lib/las-extra-bytes.js +6 -4
- package/dist/las/lib/las-extra-bytes.js.map +1 -1
- package/dist/las/lib/laz-perf/parse-las.cjs +9 -8
- package/dist/las/lib/laz-perf/parse-las.cjs.map +3 -3
- package/dist/las/lib/laz-perf/parse-las.js +9 -8
- package/dist/las/lib/laz-perf/parse-las.js.map +1 -1
- package/dist/las/lib/laz-rs-wasm/parse-las.cjs +9 -8
- package/dist/las/lib/laz-rs-wasm/parse-las.cjs.map +3 -3
- package/dist/las/lib/laz-rs-wasm/parse-las.js +9 -8
- package/dist/las/lib/laz-rs-wasm/parse-las.js.map +1 -1
- package/dist/las/lib/typescript/parse-las.cjs +135 -13
- package/dist/las/lib/typescript/parse-las.cjs.map +3 -3
- package/dist/las/lib/typescript/parse-las.d.ts.map +1 -1
- package/dist/las/lib/typescript/parse-las.js +106 -10
- package/dist/las/lib/typescript/parse-las.js.map +1 -1
- package/dist/las/unbundled.cjs +0 -2
- package/dist/las/unbundled.cjs.map +2 -2
- package/dist/las/unbundled.d.ts +1 -1
- package/dist/las/unbundled.d.ts.map +1 -1
- package/dist/las/unbundled.js +1 -1
- package/dist/las/unbundled.js.map +1 -1
- package/dist/las/workers/las-worker.cjs +5 -5
- package/dist/las/workers/las-worker.cjs.map +2 -2
- package/dist/las/workers/las-worker.js +6 -6
- package/dist/las/workers/las-worker.js.map +1 -1
- 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 +1219 -253
- 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 +2 -4
- package/dist/pcd/bundled.cjs.map +2 -2
- package/dist/pcd/bundled.d.ts +1 -1
- package/dist/pcd/bundled.d.ts.map +1 -1
- package/dist/pcd/bundled.js +1 -1
- package/dist/pcd/bundled.js.map +1 -1
- package/dist/pcd/index.cjs +0 -3
- package/dist/pcd/index.cjs.map +3 -3
- package/dist/pcd/index.d.ts +0 -2
- package/dist/pcd/index.d.ts.map +1 -1
- package/dist/pcd/index.js +0 -3
- package/dist/pcd/index.js.map +1 -1
- package/dist/pcd/pcd-loader-types.cjs +9 -10
- package/dist/pcd/pcd-loader-types.cjs.map +2 -2
- package/dist/pcd/pcd-loader-types.d.ts +18 -41
- package/dist/pcd/pcd-loader-types.d.ts.map +1 -1
- package/dist/pcd/pcd-loader-types.js +6 -6
- package/dist/pcd/pcd-loader-types.js.map +1 -1
- package/dist/pcd/pcd-loader.cjs +82 -25
- package/dist/pcd/pcd-loader.cjs.map +3 -3
- package/dist/pcd/pcd-loader.d.ts +42 -6
- package/dist/pcd/pcd-loader.d.ts.map +1 -1
- package/dist/pcd/pcd-loader.js +72 -21
- package/dist/pcd/pcd-loader.js.map +1 -1
- package/dist/pcd/pcd-writer.cjs +3 -3
- package/dist/pcd/pcd-writer.cjs.map +2 -2
- package/dist/pcd/pcd-writer.d.ts +5 -4
- package/dist/pcd/pcd-writer.d.ts.map +1 -1
- package/dist/pcd/pcd-writer.js +4 -4
- package/dist/pcd/pcd-writer.js.map +1 -1
- package/dist/pcd/unbundled.cjs +2 -4
- package/dist/pcd/unbundled.cjs.map +2 -2
- package/dist/pcd/unbundled.d.ts +1 -1
- package/dist/pcd/unbundled.d.ts.map +1 -1
- package/dist/pcd/unbundled.js +1 -1
- package/dist/pcd/unbundled.js.map +1 -1
- package/dist/pcd/workers/pcd-worker.cjs +5 -5
- package/dist/pcd/workers/pcd-worker.cjs.map +2 -2
- package/dist/pcd/workers/pcd-worker.js +6 -6
- package/dist/pcd/workers/pcd-worker.js.map +1 -1
- 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 +1457 -418
- 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 +2 -4
- package/dist/ply/bundled.cjs.map +2 -2
- package/dist/ply/bundled.d.ts +1 -1
- package/dist/ply/bundled.d.ts.map +1 -1
- package/dist/ply/bundled.js +1 -1
- package/dist/ply/bundled.js.map +1 -1
- package/dist/ply/index.cjs +0 -3
- package/dist/ply/index.cjs.map +3 -3
- package/dist/ply/index.d.ts +0 -2
- package/dist/ply/index.d.ts.map +1 -1
- package/dist/ply/index.js +0 -3
- package/dist/ply/index.js.map +1 -1
- package/dist/ply/lib/get-ply-schema.cjs +4 -2
- package/dist/ply/lib/get-ply-schema.cjs.map +2 -2
- package/dist/ply/lib/get-ply-schema.d.ts +6 -0
- package/dist/ply/lib/get-ply-schema.d.ts.map +1 -1
- package/dist/ply/lib/get-ply-schema.js +1 -1
- package/dist/ply/lib/get-ply-schema.js.map +1 -1
- package/dist/ply/lib/parse-ply-arrow.cjs +1 -1
- package/dist/ply/lib/parse-ply-arrow.cjs.map +2 -2
- package/dist/ply/lib/parse-ply-arrow.js +2 -2
- package/dist/ply/lib/parse-ply-arrow.js.map +1 -1
- package/dist/ply/lib/parse-ply-in-batches.cjs +14 -8
- package/dist/ply/lib/parse-ply-in-batches.cjs.map +3 -3
- package/dist/ply/lib/parse-ply-in-batches.d.ts.map +1 -1
- package/dist/ply/lib/parse-ply-in-batches.js +9 -4
- package/dist/ply/lib/parse-ply-in-batches.js.map +1 -1
- package/dist/ply/lib/parse-ply.cjs +3 -0
- package/dist/ply/lib/parse-ply.cjs.map +2 -2
- package/dist/ply/lib/parse-ply.d.ts +1 -1
- package/dist/ply/lib/parse-ply.d.ts.map +1 -1
- package/dist/ply/lib/parse-ply.js +4 -0
- package/dist/ply/lib/parse-ply.js.map +1 -1
- package/dist/ply/ply-loader-types.cjs +9 -10
- package/dist/ply/ply-loader-types.cjs.map +2 -2
- package/dist/ply/ply-loader-types.d.ts +19 -42
- package/dist/ply/ply-loader-types.d.ts.map +1 -1
- package/dist/ply/ply-loader-types.js +6 -6
- package/dist/ply/ply-loader-types.js.map +1 -1
- package/dist/ply/ply-loader.cjs +82 -24
- package/dist/ply/ply-loader.cjs.map +3 -3
- package/dist/ply/ply-loader.d.ts +43 -6
- package/dist/ply/ply-loader.d.ts.map +1 -1
- package/dist/ply/ply-loader.js +71 -19
- package/dist/ply/ply-loader.js.map +1 -1
- package/dist/ply/ply-writer.cjs +3 -3
- package/dist/ply/ply-writer.cjs.map +2 -2
- package/dist/ply/ply-writer.d.ts +5 -4
- package/dist/ply/ply-writer.d.ts.map +1 -1
- package/dist/ply/ply-writer.js +4 -4
- package/dist/ply/ply-writer.js.map +1 -1
- package/dist/ply/unbundled.cjs +2 -4
- package/dist/ply/unbundled.cjs.map +2 -2
- package/dist/ply/unbundled.d.ts +1 -1
- package/dist/ply/unbundled.d.ts.map +1 -1
- package/dist/ply/unbundled.js +1 -1
- package/dist/ply/unbundled.js.map +1 -1
- package/dist/ply/workers/ply-worker.cjs +6 -6
- package/dist/ply/workers/ply-worker.cjs.map +2 -2
- package/dist/ply/workers/ply-worker.js +8 -8
- package/dist/ply/workers/ply-worker.js.map +1 -1
- 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 +2099 -312
- 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 +75 -71
- package/src/index.ts +3 -3
- package/src/las/bundled.ts +0 -1
- package/src/las/index.ts +0 -4
- package/src/las/las-copc-loader-types.ts +3 -3
- package/src/las/las-copc-loader.ts +12 -12
- package/src/las/las-loader-shared.ts +9 -7
- package/src/las/las-loader-types.ts +3 -6
- package/src/las/las-loader.ts +63 -9
- package/src/las/las-writer.ts +17 -13
- package/src/las/laz-rs-loader-types.ts +3 -3
- package/src/las/laz-rs-loader.ts +11 -11
- package/src/las/lazperf-loader-types.ts +3 -3
- package/src/las/lazperf-loader.ts +13 -13
- package/src/las/lib/copc/parse-las.ts +1 -1
- package/src/las/lib/get-las-schema.ts +5 -0
- package/src/las/lib/las-extra-bytes.ts +6 -4
- package/src/las/lib/laz-perf/parse-las.ts +8 -9
- package/src/las/lib/laz-rs-wasm/parse-las.ts +8 -9
- package/src/las/lib/typescript/parse-las.ts +143 -11
- package/src/las/libs/laz-rs-wasm/README.md +5 -0
- package/src/las/libs/laz-rs-wasm/package.json +6 -0
- package/src/las/unbundled.ts +1 -1
- package/src/las/workers/las-worker.ts +6 -6
- 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 +1 -4
- package/src/pcd/index.ts +0 -4
- package/src/pcd/pcd-loader-types.ts +10 -11
- package/src/pcd/pcd-loader.ts +97 -29
- package/src/pcd/pcd-writer.ts +12 -8
- package/src/pcd/unbundled.ts +1 -1
- package/src/pcd/workers/pcd-worker.ts +6 -6
- 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 +1 -4
- package/src/ply/index.ts +0 -4
- package/src/ply/lib/get-ply-schema.ts +1 -1
- package/src/ply/lib/parse-ply-arrow.ts +2 -2
- package/src/ply/lib/parse-ply-in-batches.ts +9 -4
- package/src/ply/lib/parse-ply.ts +4 -1
- package/src/ply/ply-loader-types.ts +10 -11
- package/src/ply/ply-loader.ts +94 -24
- package/src/ply/ply-writer.ts +12 -8
- package/src/ply/unbundled.ts +1 -1
- package/src/ply/workers/ply-worker.ts +8 -8
- package/src/ply-loader-types.ts +1 -0
- package/src/ply-loader.ts +1 -0
- package/src/ply-writer.ts +1 -0
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
+
import {makeArrowMetadataBatch, updateArrowTableMetadata} from '@loaders.gl/core/schema-utils';
|
|
6
|
+
import * as arrow from 'apache-arrow';
|
|
7
|
+
import {makeMetadataFromLasHeader} from '../get-las-schema';
|
|
5
8
|
import type {MeshArrowTable, MeshAttributes} from '@loaders.gl/core/schema';
|
|
6
9
|
import {makeMeshArrowTable, type MeshArrowAttributes} from '@loaders.gl/core/schema-utils';
|
|
7
10
|
import {
|
|
@@ -375,6 +378,7 @@ export async function* parseLASInBatches(
|
|
|
375
378
|
let header: LASHeader | null = null;
|
|
376
379
|
let sourcePointIndex = 0;
|
|
377
380
|
let totalRead = 0;
|
|
381
|
+
let lastTable: LASArrowTable | undefined;
|
|
378
382
|
|
|
379
383
|
while (true) {
|
|
380
384
|
const next = await inputIterator.next();
|
|
@@ -385,6 +389,7 @@ export async function* parseLASInBatches(
|
|
|
385
389
|
pending = concatenateUint8Arrays(pending, toUint8Array(chunk));
|
|
386
390
|
if (!header) {
|
|
387
391
|
header = tryParseHeader(pending, absoluteOffset);
|
|
392
|
+
if (header && pending.byteLength < header.pointsOffset) header = null;
|
|
388
393
|
if (header) {
|
|
389
394
|
header.totalToRead = header.pointsCount;
|
|
390
395
|
}
|
|
@@ -393,7 +398,68 @@ export async function* parseLASInBatches(
|
|
|
393
398
|
continue;
|
|
394
399
|
}
|
|
395
400
|
if (header.isCompressed) {
|
|
396
|
-
|
|
401
|
+
const extendedOffset = header.metadata?.evlrOffset;
|
|
402
|
+
let inputOffset = pending.byteLength;
|
|
403
|
+
const extendedChunks: Uint8Array<ArrayBufferLike>[] = [];
|
|
404
|
+
if (extendedOffset && extendedOffset < inputOffset) {
|
|
405
|
+
extendedChunks.push(pending.subarray(extendedOffset));
|
|
406
|
+
}
|
|
407
|
+
const trackedIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView> = {
|
|
408
|
+
async next() {
|
|
409
|
+
const next = await inputIterator.next();
|
|
410
|
+
if (!next.done && extendedOffset) {
|
|
411
|
+
const bytes = toUint8Array(next.value);
|
|
412
|
+
const start = Math.max(extendedOffset - inputOffset, 0);
|
|
413
|
+
if (start < bytes.byteLength) extendedChunks.push(bytes.slice(start));
|
|
414
|
+
inputOffset += bytes.byteLength;
|
|
415
|
+
}
|
|
416
|
+
return next;
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
if (header.pointsCount === 0) {
|
|
420
|
+
const {laszip} = await readLASZipVLRFromInput(pending, trackedIterator, header);
|
|
421
|
+
validateTypeScriptLAZSupport(header, laszip);
|
|
422
|
+
lastTable = makeEmptyLASBatch(header, options);
|
|
423
|
+
} else {
|
|
424
|
+
for await (const table of parseLAZInBatches(pending, trackedIterator, header, options)) {
|
|
425
|
+
lastTable = updateArrowTableMetadata(
|
|
426
|
+
table,
|
|
427
|
+
makeMetadataFromLasHeader({
|
|
428
|
+
...header,
|
|
429
|
+
totalRead: table.loaderData.totalRead,
|
|
430
|
+
metadata: table.loaderData.metadata || header.metadata
|
|
431
|
+
})
|
|
432
|
+
);
|
|
433
|
+
yield lastTable;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (
|
|
437
|
+
extendedOffset &&
|
|
438
|
+
lastTable &&
|
|
439
|
+
header.metadata?.evlrCount &&
|
|
440
|
+
(lastTable.loaderData.metadata?.evlrs.length ?? 0) < header.metadata.evlrCount
|
|
441
|
+
) {
|
|
442
|
+
while (!(await trackedIterator.next()).done) {
|
|
443
|
+
// Finish reading trailing records if the decoder stopped at its chunk table.
|
|
444
|
+
}
|
|
445
|
+
// The tracked iterator retains only the extended-record suffix.
|
|
446
|
+
const suffix = extendedChunks.reduce<Uint8Array<ArrayBufferLike>>(
|
|
447
|
+
concatenateUint8Arrays,
|
|
448
|
+
new Uint8Array(0)
|
|
449
|
+
);
|
|
450
|
+
const update = makeLASMetadataUpdate(
|
|
451
|
+
lastTable,
|
|
452
|
+
header,
|
|
453
|
+
suffix,
|
|
454
|
+
extendedOffset,
|
|
455
|
+
lastTable.loaderData.totalRead
|
|
456
|
+
);
|
|
457
|
+
if (update) {
|
|
458
|
+
yield update;
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
if (header.pointsCount === 0 && lastTable) yield lastTable;
|
|
397
463
|
return;
|
|
398
464
|
}
|
|
399
465
|
|
|
@@ -409,7 +475,11 @@ export async function* parseLASInBatches(
|
|
|
409
475
|
totalRead = batch.totalRead;
|
|
410
476
|
pending = batch.pending;
|
|
411
477
|
absoluteOffset = batch.absoluteOffset;
|
|
412
|
-
|
|
478
|
+
lastTable = updateArrowTableMetadata(
|
|
479
|
+
parseLASArrowTableBatch(batch.arrayBuffer, batch.header, options),
|
|
480
|
+
makeMetadataFromLasHeader({...header, totalRead})
|
|
481
|
+
);
|
|
482
|
+
yield lastTable;
|
|
413
483
|
}
|
|
414
484
|
}
|
|
415
485
|
|
|
@@ -419,6 +489,60 @@ export async function* parseLASInBatches(
|
|
|
419
489
|
if (totalRead < header.totalToRead) {
|
|
420
490
|
throw new Error('LASLoader: truncated LAS point data');
|
|
421
491
|
}
|
|
492
|
+
if (!lastTable) {
|
|
493
|
+
lastTable = makeEmptyLASBatch(header, options);
|
|
494
|
+
yield lastTable;
|
|
495
|
+
}
|
|
496
|
+
const update = makeLASMetadataUpdate(lastTable, header, pending, absoluteOffset, totalRead);
|
|
497
|
+
if (update) yield update;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/** Creates the declared point schema and original header metadata for a zero-point stream. */
|
|
501
|
+
function makeEmptyLASBatch(header: LASHeader, options: LASLoaderOptions): LASArrowTable {
|
|
502
|
+
const table = parseLASArrowTableBatch(new ArrayBuffer(0), {...header, pointsOffset: 0}, options);
|
|
503
|
+
return updateArrowTableMetadata(
|
|
504
|
+
{...table, loaderData: header},
|
|
505
|
+
makeMetadataFromLasHeader(header)
|
|
506
|
+
);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/** Builds a schema-only batch carrying late extended records and their absolute offsets. */
|
|
510
|
+
function makeLASMetadataUpdate(
|
|
511
|
+
lastTable: LASArrowTable,
|
|
512
|
+
header: LASHeader,
|
|
513
|
+
pending: Uint8Array,
|
|
514
|
+
absoluteOffset: number,
|
|
515
|
+
totalRead: number
|
|
516
|
+
): LASArrowTable | undefined {
|
|
517
|
+
const metadata = header.metadata;
|
|
518
|
+
if (metadata?.evlrOffset && metadata.evlrCount) {
|
|
519
|
+
const relativeOffset = metadata.evlrOffset - absoluteOffset;
|
|
520
|
+
const records = parseLASExtendedVariableLengthRecords(
|
|
521
|
+
new DataView(pending.buffer, pending.byteOffset, pending.byteLength),
|
|
522
|
+
relativeOffset,
|
|
523
|
+
metadata.evlrCount
|
|
524
|
+
).map(record => ({...record, offset: record.offset + absoluteOffset}));
|
|
525
|
+
const finalMetadata = {
|
|
526
|
+
...metadata,
|
|
527
|
+
evlrs: records,
|
|
528
|
+
extraBytes: [...metadata.extraBytes],
|
|
529
|
+
waveformPacketDescriptors: [...metadata.waveformPacketDescriptors]
|
|
530
|
+
};
|
|
531
|
+
for (const record of records)
|
|
532
|
+
parseTypedLASMetadataRecord(
|
|
533
|
+
{...record, data: record.data || new Uint8Array()},
|
|
534
|
+
finalMetadata
|
|
535
|
+
);
|
|
536
|
+
resolveLASGeoTIFFKeyDirectory(finalMetadata);
|
|
537
|
+
const finalHeader = {...header, totalRead, metadata: finalMetadata};
|
|
538
|
+
if (records.length > 0) {
|
|
539
|
+
const data = new arrow.Table([makeArrowMetadataBatch(lastTable.data.schema)]);
|
|
540
|
+
return updateArrowTableMetadata(
|
|
541
|
+
{...lastTable, data, loaderData: finalHeader},
|
|
542
|
+
makeMetadataFromLasHeader(finalHeader)
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
422
546
|
}
|
|
423
547
|
|
|
424
548
|
/** Decode LAS data into raw point chunks. */
|
|
@@ -1017,7 +1141,7 @@ function* parseLAZChunkedIterator(
|
|
|
1017
1141
|
if (header.pointsFormatId <= 5 || laszip.variableChunks) {
|
|
1018
1142
|
yield* decodeLAZFileFromCompleteBytes(new Uint8Array(arrayBuffer), header, laszip, {
|
|
1019
1143
|
...options,
|
|
1020
|
-
batchSize
|
|
1144
|
+
core: {...options.core, batchSize}
|
|
1021
1145
|
});
|
|
1022
1146
|
return;
|
|
1023
1147
|
}
|
|
@@ -1052,7 +1176,11 @@ function* decodeLAZFileFromCompleteBytes(
|
|
|
1052
1176
|
options: LASLoaderOptions = {}
|
|
1053
1177
|
): Iterable<LASDecodedChunk> {
|
|
1054
1178
|
const batchSize = getBatchSize(options);
|
|
1055
|
-
const outputHeader = {
|
|
1179
|
+
const outputHeader = {
|
|
1180
|
+
...header,
|
|
1181
|
+
metadata: parseLASMetadata(bytes, header),
|
|
1182
|
+
totalToRead: header.pointsCount
|
|
1183
|
+
};
|
|
1056
1184
|
const state = createRawPointBatchState(
|
|
1057
1185
|
batchSize,
|
|
1058
1186
|
header.pointsStructSize,
|
|
@@ -1207,8 +1335,12 @@ function hasCompleteLASMetadata(arrayBuffer: ArrayBufferLike, header: LASHeader)
|
|
|
1207
1335
|
return arrayBuffer.byteLength >= Math.max(vlrEnd, header.pointsOffset);
|
|
1208
1336
|
}
|
|
1209
1337
|
|
|
1210
|
-
function parseLASMetadata(
|
|
1211
|
-
|
|
1338
|
+
function parseLASMetadata(
|
|
1339
|
+
arrayBuffer: ArrayBufferLike | ArrayBufferView,
|
|
1340
|
+
header: LASHeader
|
|
1341
|
+
): LASMetadata {
|
|
1342
|
+
const dataView = makeDataView(arrayBuffer);
|
|
1343
|
+
const bytes = new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength);
|
|
1212
1344
|
const version = header.versionAsString || '1.0';
|
|
1213
1345
|
const versionParts = version.split('.').map(Number);
|
|
1214
1346
|
const isAtLeast14 = versionParts[0] > 1 || (versionParts[0] === 1 && versionParts[1] >= 4);
|
|
@@ -1223,9 +1355,9 @@ function parseLASMetadata(arrayBuffer: ArrayBufferLike, header: LASHeader): LASM
|
|
|
1223
1355
|
versionParts[0] > 1 || (versionParts[0] === 1 && versionParts[1] >= 3)
|
|
1224
1356
|
? dataView.getBigUint64(227, true)
|
|
1225
1357
|
: undefined,
|
|
1226
|
-
projectId: formatLASProjectId(
|
|
1227
|
-
systemIdentifier: readLASString(
|
|
1228
|
-
generatingSoftware: readLASString(
|
|
1358
|
+
projectId: formatLASProjectId(bytes.subarray(8, 24)),
|
|
1359
|
+
systemIdentifier: readLASString(bytes, 26, 32),
|
|
1360
|
+
generatingSoftware: readLASString(bytes, 58, 32),
|
|
1229
1361
|
creationDayOfYear: dataView.getUint16(90, true),
|
|
1230
1362
|
creationYear: dataView.getUint16(92, true),
|
|
1231
1363
|
headerSize: header.headerSize!,
|
|
@@ -1287,7 +1419,7 @@ function parseLASExtendedVariableLengthRecords(
|
|
|
1287
1419
|
evlrOffset: number,
|
|
1288
1420
|
evlrCount: number
|
|
1289
1421
|
): LASExtendedVariableLengthRecord[] {
|
|
1290
|
-
if (
|
|
1422
|
+
if (evlrOffset < 0 || !evlrCount || evlrOffset >= dataView.byteLength) {
|
|
1291
1423
|
return [];
|
|
1292
1424
|
}
|
|
1293
1425
|
const bytes = new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength);
|
|
@@ -2011,7 +2143,7 @@ function detectTwoByteColors(
|
|
|
2011
2143
|
}
|
|
2012
2144
|
|
|
2013
2145
|
function getBatchSize(options: LASLoaderOptions): number {
|
|
2014
|
-
const batchSize = options.
|
|
2146
|
+
const batchSize = options.core?.batchSize;
|
|
2015
2147
|
return typeof batchSize === 'number' ? batchSize : DEFAULT_BATCH_SIZE;
|
|
2016
2148
|
}
|
|
2017
2149
|
|
package/src/las/unbundled.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
5
|
export type {LASLoaderOptions} from './las-loader-types';
|
|
6
|
-
export {LASLoader
|
|
6
|
+
export {LASLoader} from './las-loader-types';
|
|
7
7
|
export {LASCOPCLoader} from './las-copc-loader-types';
|
|
8
8
|
export {LAZPerfLoader} from './lazperf-loader-types';
|
|
9
9
|
export {LAZRsLoader} from './laz-rs-loader-types';
|
|
@@ -3,22 +3,22 @@
|
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
5
|
import {createLoaderWorker} from '@loaders.gl/core/loader-utils';
|
|
6
|
-
import {
|
|
6
|
+
import {LASColumnLoader} from '../las-loader';
|
|
7
7
|
|
|
8
8
|
createLoaderWorker({
|
|
9
|
-
...
|
|
9
|
+
...LASColumnLoader,
|
|
10
10
|
/** Decodes worker output as transferable columns; caller formatting follows hydration. */
|
|
11
11
|
parse(input, options) {
|
|
12
|
-
return
|
|
12
|
+
return LASColumnLoader.parse(input, {
|
|
13
13
|
...options,
|
|
14
|
-
las: {...options?.las, shape: 'arrow
|
|
14
|
+
las: {...options?.las, shape: 'arrow', colorFormat: 'uint8norm'}
|
|
15
15
|
});
|
|
16
16
|
},
|
|
17
17
|
/** Keeps the primary TypeScript decoder alive for the full input stream. */
|
|
18
18
|
parseInBatches(input, options) {
|
|
19
|
-
return
|
|
19
|
+
return LASColumnLoader.parseInBatches(input, {
|
|
20
20
|
...options,
|
|
21
|
-
las: {...options?.las, shape: 'arrow
|
|
21
|
+
las: {...options?.las, shape: 'arrow', colorFormat: 'uint8norm'}
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/las-copc-loader-types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/las-copc-loader.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/las-loader-types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/las-loader.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/las-writer.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/laz-rs-loader-types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/laz-rs-loader.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/lazperf-loader-types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './las/lazperf-loader.js';
|
package/src/pcd/bundled.ts
CHANGED
|
@@ -3,7 +3,4 @@
|
|
|
3
3
|
// Copyright vis.gl contributors
|
|
4
4
|
|
|
5
5
|
export type {PCDLoaderOptions} from './pcd-loader-types';
|
|
6
|
-
export {
|
|
7
|
-
PCDLoaderWithParser as PCDWorkerLoader,
|
|
8
|
-
PCDLoaderWithParser as PCDLoader
|
|
9
|
-
} from './pcd-loader';
|
|
6
|
+
export {PCDLoaderWithParser as PCDLoader} from './pcd-loader';
|
package/src/pcd/index.ts
CHANGED
|
@@ -7,7 +7,3 @@ export {PCDFormat} from './pcd-format';
|
|
|
7
7
|
export {PCDLoader} from './pcd-loader-types';
|
|
8
8
|
export type {PCDWriterOptions} from './pcd-writer';
|
|
9
9
|
export {PCDWriter} from './pcd-writer';
|
|
10
|
-
|
|
11
|
-
// DEPRECATED EXPORTS
|
|
12
|
-
/** @deprecated Use PCDLoader. */
|
|
13
|
-
export {PCDWorkerLoader} from './pcd-loader-types';
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
+
import type {Table, RecordBatch} from 'apache-arrow';
|
|
5
6
|
import type {Loader, LoaderOptions} from '@loaders.gl/core/loader-utils';
|
|
6
|
-
import type {MeshArrowTable, ArrowTableBatch} from '@loaders.gl/core/schema';
|
|
7
7
|
import type {PCDMesh} from './lib/pcd-types';
|
|
8
8
|
import {PCDFormat} from './pcd-format';
|
|
9
|
-
import {serializeArrowWorkerTable} from '@loaders.gl/core/
|
|
9
|
+
import {serializeArrowWorkerTable} from '@loaders.gl/core/arrow-worker-transport';
|
|
10
10
|
|
|
11
11
|
// __VERSION__ is injected by babel-plugin-version-inline
|
|
12
12
|
// @ts-ignore TS2304: Cannot find name '__VERSION__'.
|
|
@@ -15,7 +15,7 @@ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
|
|
|
15
15
|
export type PCDLoaderOptions = LoaderOptions & {
|
|
16
16
|
pcd?: {
|
|
17
17
|
/** Output shape. Defaults to a Mesh Arrow table. */
|
|
18
|
-
shape?: 'mesh' | 'arrow
|
|
18
|
+
shape?: 'mesh' | 'arrow';
|
|
19
19
|
/** Color storage format. Defaults to uint8norm for backwards compatibility. */
|
|
20
20
|
colorFormat?: 'uint8norm' | 'float16' | 'float32';
|
|
21
21
|
/** Override the URL to the worker bundle (by default loads from unpkg.com) */
|
|
@@ -27,7 +27,7 @@ export type PCDLoaderOptions = LoaderOptions & {
|
|
|
27
27
|
* Preloads the parser-bearing PCD loader implementation.
|
|
28
28
|
*/
|
|
29
29
|
async function preload() {
|
|
30
|
-
const {PCDLoaderWithParser} = await import('@loaders.gl/pointclouds/pcd
|
|
30
|
+
const {PCDLoaderWithParser} = await import('@loaders.gl/pointclouds/pcd-loader');
|
|
31
31
|
return PCDLoaderWithParser;
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -35,19 +35,18 @@ async function preload() {
|
|
|
35
35
|
* Metadata-only worker loader for PCD - Point Cloud Data
|
|
36
36
|
*/
|
|
37
37
|
export const PCDLoader = {
|
|
38
|
+
defaultShape: 'arrow',
|
|
39
|
+
supportsNativeArrow: true,
|
|
38
40
|
...PCDFormat,
|
|
39
|
-
dataType: null as unknown as PCDMesh |
|
|
40
|
-
batchType: null as unknown as PCDMesh |
|
|
41
|
+
dataType: null as unknown as PCDMesh | Table,
|
|
42
|
+
batchType: null as unknown as PCDMesh | RecordBatch,
|
|
41
43
|
version: VERSION,
|
|
42
44
|
worker: true,
|
|
43
45
|
/** Enables the stateful input/output batch protocol on the built-in worker. */
|
|
44
46
|
workerInBatches: true,
|
|
45
47
|
serializeWorkerResult: serializeArrowWorkerTable,
|
|
46
48
|
options: {
|
|
47
|
-
pcd: {shape: 'arrow
|
|
49
|
+
pcd: {shape: 'arrow', colorFormat: 'uint8norm'}
|
|
48
50
|
},
|
|
49
51
|
preload
|
|
50
|
-
} as const satisfies Loader<PCDMesh |
|
|
51
|
-
|
|
52
|
-
/** @deprecated Use PCDLoader. */
|
|
53
|
-
export const PCDWorkerLoader = PCDLoader;
|
|
52
|
+
} as const satisfies Loader<PCDMesh | Table, PCDMesh | RecordBatch, PCDLoaderOptions>;
|
package/src/pcd/pcd-loader.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
+
import {refineArrowTableBatches, makeArrowMetadataBatch} from '@loaders.gl/core/schema-utils';
|
|
6
|
+
import type {Table, RecordBatch} from 'apache-arrow';
|
|
5
7
|
import type {PCDLoaderOptions} from './pcd-loader-types';
|
|
6
8
|
|
|
7
9
|
import {
|
|
@@ -13,8 +15,8 @@ import type {ArrowTableBatch, MeshArrowTable} from '@loaders.gl/core/schema';
|
|
|
13
15
|
import {
|
|
14
16
|
deserializeArrowWorkerTable,
|
|
15
17
|
serializeArrowWorkerTable
|
|
16
|
-
} from '@loaders.gl/core/
|
|
17
|
-
import {
|
|
18
|
+
} from '@loaders.gl/core/arrow-worker-transport';
|
|
19
|
+
import {convertMeshToArrowTableWrapper, convertTableToMesh} from '@loaders.gl/core/schema-utils';
|
|
18
20
|
import type {PCDMesh} from './lib/pcd-types';
|
|
19
21
|
import {parsePCD, parsePCDHeader} from './lib/parse-pcd';
|
|
20
22
|
import {PCDLoader as PCDLoaderMetadata} from './pcd-loader-types';
|
|
@@ -24,7 +26,7 @@ const {preload: _PCDLoaderPreload, ...PCDLoaderMetadataWithoutPreload} = PCDLoad
|
|
|
24
26
|
type PCDParsedBatch = PCDMesh | ArrowTableBatch;
|
|
25
27
|
|
|
26
28
|
function convertPCDMesh(mesh: PCDMesh, options?: PCDLoaderOptions): PCDMesh | MeshArrowTable {
|
|
27
|
-
const table =
|
|
29
|
+
const table = convertMeshToArrowTableWrapper(mesh);
|
|
28
30
|
return options?.pcd?.shape === 'mesh'
|
|
29
31
|
? convertPCDTableToMesh(table, mesh)
|
|
30
32
|
: {...table, loader: mesh.loader, loaderData: mesh.loaderData};
|
|
@@ -33,33 +35,14 @@ function convertPCDMesh(mesh: PCDMesh, options?: PCDLoaderOptions): PCDMesh | Me
|
|
|
33
35
|
/**
|
|
34
36
|
* Loader for PCD - Point Cloud Data
|
|
35
37
|
*/
|
|
36
|
-
export const
|
|
38
|
+
export const PCDColumnLoader = {
|
|
37
39
|
...PCDLoaderMetadataWithoutPreload,
|
|
40
|
+
dataType: null as unknown as PCDMesh | MeshArrowTable,
|
|
41
|
+
batchType: null as unknown as PCDMesh | ArrowTableBatch,
|
|
38
42
|
parse: async (arrayBuffer, options) => convertPCDMesh(parsePCD(arrayBuffer, options), options),
|
|
39
43
|
parseSync: (arrayBuffer, options) => convertPCDMesh(parsePCD(arrayBuffer, options), options),
|
|
40
|
-
parseInBatches:
|
|
41
|
-
|
|
42
|
-
| AsyncIterable<ArrayBufferLike | ArrayBufferView>
|
|
43
|
-
| Iterable<ArrayBufferLike | ArrayBufferView>,
|
|
44
|
-
options
|
|
45
|
-
): AsyncIterable<PCDParsedBatch> {
|
|
46
|
-
const batchSize = getNumericBatchSize(options);
|
|
47
|
-
const data = await concatenateArrayBuffersAsync(arrayBuffer);
|
|
48
|
-
const textData = new TextDecoder().decode(data);
|
|
49
|
-
const pcdHeader = parsePCDHeader(textData);
|
|
50
|
-
|
|
51
|
-
if (pcdHeader.data === 'ascii') {
|
|
52
|
-
yield* parsePCDASCIIInBatches(data, options, batchSize);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (pcdHeader.data === 'binary') {
|
|
57
|
-
yield* parsePCDBinaryInBatches(data, options, batchSize);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
yield makePCDBatch(parsePCD(data, options), options);
|
|
62
|
-
},
|
|
44
|
+
parseInBatches: (input, options) =>
|
|
45
|
+
refineArrowTableBatches(parsePCDWithMetadataInBatches(input, options)),
|
|
63
46
|
serializeWorkerResult: serializeArrowWorkerTable,
|
|
64
47
|
deserializeWorkerResult: deserializePCDWorkerResult,
|
|
65
48
|
serializeWorkerBatch: serializeArrowWorkerTable,
|
|
@@ -68,7 +51,7 @@ export const PCDLoaderWithParser = {
|
|
|
68
51
|
|
|
69
52
|
/** Returns a numeric batch size when batching has an explicit row count. */
|
|
70
53
|
function getNumericBatchSize(options?: PCDLoaderOptions): number | undefined {
|
|
71
|
-
const batchSize = options?.
|
|
54
|
+
const batchSize = options?.core?.batchSize;
|
|
72
55
|
return typeof batchSize === 'number' ? batchSize : undefined;
|
|
73
56
|
}
|
|
74
57
|
|
|
@@ -118,7 +101,7 @@ function* parsePCDBinaryInBatches(
|
|
|
118
101
|
}
|
|
119
102
|
|
|
120
103
|
function makePCDBatch(mesh: PCDMesh, options?: PCDLoaderOptions): PCDParsedBatch {
|
|
121
|
-
const table =
|
|
104
|
+
const table = convertMeshToArrowTableWrapper(mesh);
|
|
122
105
|
if (options?.pcd?.shape === 'mesh') {
|
|
123
106
|
return convertPCDTableToMesh(table, mesh);
|
|
124
107
|
}
|
|
@@ -177,3 +160,88 @@ function deserializePCDWorkerResult(
|
|
|
177
160
|
function deserializePCDWorkerBatch(result: unknown, options?: PCDLoaderOptions): PCDParsedBatch {
|
|
178
161
|
return deserializePCDWorkerResult(result, options) as PCDParsedBatch;
|
|
179
162
|
}
|
|
163
|
+
|
|
164
|
+
/** Parses PCD batches before shared cumulative metadata refinement. */
|
|
165
|
+
async function* parsePCDWithMetadataInBatches(
|
|
166
|
+
arrayBuffer:
|
|
167
|
+
| AsyncIterable<ArrayBufferLike | ArrayBufferView>
|
|
168
|
+
| Iterable<ArrayBufferLike | ArrayBufferView>,
|
|
169
|
+
options?: PCDLoaderOptions
|
|
170
|
+
): AsyncIterable<PCDParsedBatch> {
|
|
171
|
+
const batchSize = getNumericBatchSize(options);
|
|
172
|
+
const data = await concatenateArrayBuffersAsync(arrayBuffer);
|
|
173
|
+
const textData = new TextDecoder().decode(data);
|
|
174
|
+
const pcdHeader = parsePCDHeader(textData);
|
|
175
|
+
|
|
176
|
+
if (pcdHeader.data === 'ascii') {
|
|
177
|
+
yield* parsePCDASCIIInBatches(data, options, batchSize);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (pcdHeader.data === 'binary') {
|
|
182
|
+
yield* parsePCDBinaryInBatches(data, options, batchSize);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
yield makePCDBatch(parsePCD(data, options), options);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Exposes native Arrow output while retaining the worker's column protocol. */
|
|
190
|
+
export const PCDLoaderWithParser = {
|
|
191
|
+
...PCDColumnLoader,
|
|
192
|
+
dataType: PCDLoaderMetadata.dataType,
|
|
193
|
+
batchType: PCDLoaderMetadata.batchType,
|
|
194
|
+
parse: async (input: ArrayBuffer, options?: PCDLoaderOptions) =>
|
|
195
|
+
unwrapPCDTable(await PCDColumnLoader.parse(input, options)),
|
|
196
|
+
parseSync: (input: ArrayBuffer, options?: PCDLoaderOptions) =>
|
|
197
|
+
unwrapPCDTable(PCDColumnLoader.parseSync(input, options)),
|
|
198
|
+
async *parseInBatches(input, options) {
|
|
199
|
+
for await (const batch of PCDColumnLoader.parseInBatches(input, options)) {
|
|
200
|
+
if (isColumnBatch(batch)) {
|
|
201
|
+
batch.data.schema.metadata.set(
|
|
202
|
+
'loaders.gl.pcd.header',
|
|
203
|
+
JSON.stringify((batch as ArrowTableBatch & {loaderData?: unknown}).loaderData)
|
|
204
|
+
);
|
|
205
|
+
for (const recordBatch of batch.data.batches) {
|
|
206
|
+
recordBatch.schema.metadata.set(
|
|
207
|
+
'loaders.gl.pcd.header',
|
|
208
|
+
batch.data.schema.metadata.get('loaders.gl.pcd.header')!
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
if (batch.data.batches.length) yield* batch.data.batches;
|
|
212
|
+
else yield makeArrowMetadataBatch(batch.data.schema);
|
|
213
|
+
} else yield batch;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
deserializeWorkerResult: (result: unknown, options?: PCDLoaderOptions) =>
|
|
217
|
+
unwrapPCDTable(PCDColumnLoader.deserializeWorkerResult(result, options)),
|
|
218
|
+
deserializeWorkerBatch(result: unknown, options?: PCDLoaderOptions) {
|
|
219
|
+
const batch = PCDColumnLoader.deserializeWorkerBatch(result, options);
|
|
220
|
+
if (isColumnBatch(batch)) {
|
|
221
|
+
const recordBatch = batch.data.batches[0] ?? makeArrowMetadataBatch(batch.data.schema);
|
|
222
|
+
recordBatch.schema.metadata.set(
|
|
223
|
+
'loaders.gl.pcd.header',
|
|
224
|
+
JSON.stringify((batch as ArrowTableBatch & {loaderData?: unknown}).loaderData)
|
|
225
|
+
);
|
|
226
|
+
return recordBatch;
|
|
227
|
+
}
|
|
228
|
+
return batch;
|
|
229
|
+
}
|
|
230
|
+
} as const satisfies LoaderWithParser<PCDMesh | Table, PCDMesh | RecordBatch, PCDLoaderOptions>;
|
|
231
|
+
|
|
232
|
+
/** Returns the Arrow table with its file metadata or the requested mesh. */
|
|
233
|
+
function unwrapPCDTable(result: PCDMesh | MeshArrowTable): PCDMesh | Table {
|
|
234
|
+
if ('shape' in result && result.shape === 'arrow-table') {
|
|
235
|
+
result.data.schema.metadata.set(
|
|
236
|
+
'loaders.gl.pcd.header',
|
|
237
|
+
JSON.stringify((result as MeshArrowTable & {loaderData?: unknown}).loaderData)
|
|
238
|
+
);
|
|
239
|
+
return result.data;
|
|
240
|
+
}
|
|
241
|
+
return result as PCDMesh;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/** Identifies the private Arrow batch envelope. */
|
|
245
|
+
function isColumnBatch(batch: PCDMesh | ArrowTableBatch): batch is ArrowTableBatch {
|
|
246
|
+
return 'shape' in batch && batch.shape === 'arrow-table';
|
|
247
|
+
}
|
package/src/pcd/pcd-writer.ts
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
+
import type {Table} from 'apache-arrow';
|
|
5
6
|
import type {WriterOptions, WriterWithEncoder} from '@loaders.gl/core/loader-utils';
|
|
6
7
|
import type {Mesh, MeshArrowTable, MeshAttribute} from '@loaders.gl/core/schema';
|
|
7
|
-
import {
|
|
8
|
+
import {convertMeshToArrowTableWrapper, convertTableToMesh} from '@loaders.gl/core/schema-utils';
|
|
8
9
|
import {PCDFormat} from './pcd-format';
|
|
9
10
|
|
|
10
11
|
// __VERSION__ is injected by babel-plugin-version-inline
|
|
@@ -22,7 +23,7 @@ export type PCDWriterOptions = WriterOptions & {
|
|
|
22
23
|
*/
|
|
23
24
|
export const PCDWriter = {
|
|
24
25
|
...PCDFormat,
|
|
25
|
-
dataType: null as unknown as Mesh | MeshArrowTable,
|
|
26
|
+
dataType: null as unknown as Mesh | MeshArrowTable | Table,
|
|
26
27
|
batchType: null as never,
|
|
27
28
|
version: VERSION,
|
|
28
29
|
options: {
|
|
@@ -32,16 +33,19 @@ export const PCDWriter = {
|
|
|
32
33
|
encode: async (data, options) => encodePCDSync(data, options),
|
|
33
34
|
encodeSync: encodePCDSync,
|
|
34
35
|
encodeTextSync: encodePCD
|
|
35
|
-
} as const satisfies WriterWithEncoder<Mesh | MeshArrowTable, never, PCDWriterOptions>;
|
|
36
|
+
} as const satisfies WriterWithEncoder<Mesh | MeshArrowTable | Table, never, PCDWriterOptions>;
|
|
36
37
|
|
|
37
38
|
/** Encode mesh category data as PCD bytes. */
|
|
38
|
-
function encodePCDSync(
|
|
39
|
+
function encodePCDSync(
|
|
40
|
+
data: Mesh | MeshArrowTable | Table,
|
|
41
|
+
options?: PCDWriterOptions
|
|
42
|
+
): ArrayBuffer {
|
|
39
43
|
const text = encodePCD(data, options);
|
|
40
44
|
return new TextEncoder().encode(text).buffer;
|
|
41
45
|
}
|
|
42
46
|
|
|
43
47
|
/** Encode mesh category data as ASCII PCD text. */
|
|
44
|
-
function encodePCD(data: Mesh | MeshArrowTable, options?: PCDWriterOptions): string {
|
|
48
|
+
function encodePCD(data: Mesh | MeshArrowTable | Table, options?: PCDWriterOptions): string {
|
|
45
49
|
const mesh = convertTableToMesh(normalizeMeshArrowTable(data));
|
|
46
50
|
const positionAttribute = getRequiredAttribute(mesh, 'POSITION');
|
|
47
51
|
const normalAttribute = mesh.attributes.NORMAL;
|
|
@@ -106,11 +110,11 @@ function encodePCD(data: Mesh | MeshArrowTable, options?: PCDWriterOptions): str
|
|
|
106
110
|
}
|
|
107
111
|
|
|
108
112
|
/** Return mesh data as a MeshArrowTable, converting plain Mesh data first. */
|
|
109
|
-
function normalizeMeshArrowTable(data: Mesh | MeshArrowTable): MeshArrowTable {
|
|
110
|
-
if ('
|
|
113
|
+
function normalizeMeshArrowTable(data: Mesh | MeshArrowTable | Table): MeshArrowTable | Table {
|
|
114
|
+
if (!('attributes' in data)) {
|
|
111
115
|
return data;
|
|
112
116
|
}
|
|
113
|
-
return
|
|
117
|
+
return convertMeshToArrowTableWrapper(data as Mesh);
|
|
114
118
|
}
|
|
115
119
|
|
|
116
120
|
/** Return a required mesh attribute or throw a format-specific error. */
|
package/src/pcd/unbundled.ts
CHANGED
|
@@ -3,22 +3,22 @@
|
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
5
|
import {createLoaderWorker} from '@loaders.gl/core/loader-utils';
|
|
6
|
-
import {
|
|
6
|
+
import {PCDColumnLoader} from '../pcd-loader';
|
|
7
7
|
|
|
8
8
|
createLoaderWorker({
|
|
9
|
-
...
|
|
9
|
+
...PCDColumnLoader,
|
|
10
10
|
/** Always returns columnar data; legacy mesh conversion runs on the caller. */
|
|
11
11
|
parse(input, options) {
|
|
12
|
-
return
|
|
12
|
+
return PCDColumnLoader.parse(input, {
|
|
13
13
|
...options,
|
|
14
|
-
pcd: {...options?.pcd, shape: 'arrow
|
|
14
|
+
pcd: {...options?.pcd, shape: 'arrow'}
|
|
15
15
|
});
|
|
16
16
|
},
|
|
17
17
|
/** Keeps one columnar parser alive for the entire worker input stream. */
|
|
18
18
|
parseInBatches(input, options) {
|
|
19
|
-
return
|
|
19
|
+
return PCDColumnLoader.parseInBatches(input, {
|
|
20
20
|
...options,
|
|
21
|
-
pcd: {...options?.pcd, shape: 'arrow
|
|
21
|
+
pcd: {...options?.pcd, shape: 'arrow'}
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
});
|