@loaders.gl/las 4.4.0-alpha.2 → 4.4.0-alpha.9

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.
Files changed (83) hide show
  1. package/dist/dist.dev.js +1022 -77
  2. package/dist/dist.min.js +21 -21
  3. package/dist/index.cjs +1024 -79
  4. package/dist/index.cjs.map +4 -4
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +7 -1
  8. package/dist/index.js.map +1 -0
  9. package/dist/las-arrow-loader.d.ts +10 -8
  10. package/dist/las-arrow-loader.d.ts.map +1 -1
  11. package/dist/las-arrow-loader.js +5 -4
  12. package/dist/las-arrow-loader.js.map +1 -0
  13. package/dist/las-format.d.ts +2 -2
  14. package/dist/las-format.js +3 -2
  15. package/dist/las-format.js.map +1 -0
  16. package/dist/las-loader.d.ts +2 -31
  17. package/dist/las-loader.d.ts.map +1 -1
  18. package/dist/las-loader.js +2 -20
  19. package/dist/las-loader.js.map +1 -0
  20. package/dist/las-worker.js +65 -71
  21. package/dist/laz-rs-loader.d.ts +29 -0
  22. package/dist/laz-rs-loader.d.ts.map +1 -0
  23. package/dist/laz-rs-loader.js +17 -0
  24. package/dist/laz-rs-loader.js.map +1 -0
  25. package/dist/lazperf-loader.d.ts +31 -0
  26. package/dist/lazperf-loader.d.ts.map +1 -0
  27. package/dist/lazperf-loader.js +15 -0
  28. package/dist/lazperf-loader.js.map +1 -0
  29. package/dist/lib/get-las-schema.d.ts +1 -1
  30. package/dist/lib/get-las-schema.js +2 -1
  31. package/dist/lib/get-las-schema.js.map +1 -0
  32. package/dist/lib/las-types.d.ts +1 -0
  33. package/dist/lib/las-types.d.ts.map +1 -1
  34. package/dist/lib/las-types.js +1 -0
  35. package/dist/lib/las-types.js.map +1 -0
  36. package/dist/lib/{laslaz-decoder.d.ts → laz-perf/laslaz-decoder.d.ts} +1 -1
  37. package/dist/lib/laz-perf/laslaz-decoder.d.ts.map +1 -0
  38. package/dist/lib/{laslaz-decoder.js → laz-perf/laslaz-decoder.js} +4 -2
  39. package/dist/lib/laz-perf/laslaz-decoder.js.map +1 -0
  40. package/dist/lib/{parse-las.d.ts → laz-perf/parse-las.d.ts} +3 -3
  41. package/dist/lib/laz-perf/parse-las.d.ts.map +1 -0
  42. package/dist/lib/{parse-las.js → laz-perf/parse-las.js} +6 -6
  43. package/dist/lib/laz-perf/parse-las.js.map +1 -0
  44. package/dist/lib/laz-rs-wasm/laslaz-decoder.d.ts +134 -0
  45. package/dist/lib/laz-rs-wasm/laslaz-decoder.d.ts.map +1 -0
  46. package/dist/lib/laz-rs-wasm/laslaz-decoder.js +446 -0
  47. package/dist/lib/laz-rs-wasm/laslaz-decoder.js.map +1 -0
  48. package/dist/lib/laz-rs-wasm/parse-las.d.ts +18 -0
  49. package/dist/lib/laz-rs-wasm/parse-las.d.ts.map +1 -0
  50. package/dist/lib/laz-rs-wasm/parse-las.js +188 -0
  51. package/dist/lib/laz-rs-wasm/parse-las.js.map +1 -0
  52. package/dist/libs/laz-perf/laz-perf.d.ts.map +1 -0
  53. package/dist/{lib/libs → libs/laz-perf}/laz-perf.js +1 -0
  54. package/dist/libs/laz-perf/laz-perf.js.map +1 -0
  55. package/dist/libs/laz-rs-wasm/laz_rs_wasm.d.ts +95 -0
  56. package/dist/libs/laz-rs-wasm/laz_rs_wasm.d.ts.map +1 -0
  57. package/dist/libs/laz-rs-wasm/laz_rs_wasm.js +425 -0
  58. package/dist/libs/laz-rs-wasm/laz_rs_wasm.js.map +1 -0
  59. package/dist/workers/las-worker.js +1 -0
  60. package/dist/workers/las-worker.js.map +1 -0
  61. package/package.json +8 -5
  62. package/src/index.ts +8 -1
  63. package/src/las-arrow-loader.ts +6 -5
  64. package/src/las-format.ts +2 -2
  65. package/src/las-loader.ts +1 -23
  66. package/src/laz-rs-loader.ts +22 -0
  67. package/src/lazperf-loader.ts +22 -0
  68. package/src/lib/get-las-schema.ts +1 -1
  69. package/src/lib/las-types.ts +1 -0
  70. package/src/lib/{laslaz-decoder.ts → laz-perf/laslaz-decoder.ts} +4 -3
  71. package/src/lib/{parse-las.ts → laz-perf/parse-las.ts} +7 -10
  72. package/src/lib/laz-rs-wasm/laslaz-decoder.ts +528 -0
  73. package/src/lib/laz-rs-wasm/parse-las.ts +232 -0
  74. package/src/libs/laz-rs-wasm/laz_rs_wasm.d.ts +80 -0
  75. package/src/libs/laz-rs-wasm/laz_rs_wasm.js +477 -0
  76. package/src/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
  77. package/src/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +31 -0
  78. package/src/libs/laz-rs-wasm/package.json +19 -0
  79. package/dist/lib/laslaz-decoder.d.ts.map +0 -1
  80. package/dist/lib/libs/laz-perf.d.ts.map +0 -1
  81. package/dist/lib/parse-las.d.ts.map +0 -1
  82. /package/dist/{lib/libs → libs/laz-perf}/laz-perf.d.ts +0 -0
  83. /package/src/{lib/libs → libs/laz-perf}/laz-perf.ts +0 -0
@@ -0,0 +1,232 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ // ported and es6-ified from https://github.com/verma/plasio/
6
+ // import type {ArrowTable, ColumnarTable} from '@loaders.gl/schema';
7
+ import type {LASLoaderOptions} from '../../las-loader';
8
+ import type {LASMesh, LASHeader} from '../las-types';
9
+ import {getMeshBoundingBox /* , convertMeshToTable */} from '@loaders.gl/schema-utils';
10
+ import {getLASSchema} from '../get-las-schema';
11
+ import {LASFile} from './laslaz-decoder';
12
+
13
+ type LASChunk = {
14
+ count: number;
15
+ buffer: ArrayBuffer;
16
+ hasMoreData: boolean;
17
+ };
18
+
19
+ /**
20
+ * Parsing of .las file
21
+ * @param arrayBuffer
22
+ * @param options
23
+ * @returns LASMesh
24
+ */
25
+ export function parseLAS(arrayBuffer: ArrayBuffer, options?: LASLoaderOptions): LASMesh {
26
+ return parseLASMesh(arrayBuffer, options);
27
+ // This code breaks pointcloud example on the website
28
+ // const mesh = parseLASMesh(arrayBuffer, options);
29
+ // return convertMeshToTable(mesh, options?.las?.shape || 'mesh') as LASMesh | ArrowTable | ColumnarTable;
30
+ }
31
+
32
+ /**
33
+ * Parsing of .las file
34
+ * @param arrayBuffer
35
+ * @param options
36
+ * @returns LASHeader
37
+ */
38
+ function parseLASMesh(arrayBuffer: ArrayBuffer, options: LASLoaderOptions = {}): LASMesh {
39
+ let pointIndex: number = 0;
40
+
41
+ let positions: Float32Array | Float64Array;
42
+ let colors: Uint8Array | null;
43
+ let intensities: Uint16Array;
44
+ let classifications: Uint8Array;
45
+ let originalHeader: any;
46
+
47
+ const lasMesh: LASMesh = {
48
+ loader: 'las',
49
+ loaderData: {} as LASHeader,
50
+ // shape: 'mesh',
51
+ schema: {fields: [], metadata: {}},
52
+ header: {
53
+ vertexCount: 0,
54
+ boundingBox: [
55
+ [0, 0, 0],
56
+ [0, 0, 0]
57
+ ]
58
+ },
59
+ attributes: {},
60
+ topology: 'point-list',
61
+ mode: 0 // GL.POINTS
62
+ };
63
+
64
+ /* eslint-disable max-statements */
65
+ // @ts-ignore Possibly undefined
66
+ parseLASChunked(arrayBuffer, options.las?.skip, (decoder: any = {}, lasHeader: LASHeader) => {
67
+ if (!originalHeader) {
68
+ originalHeader = lasHeader;
69
+ const total = lasHeader.totalToRead;
70
+
71
+ const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;
72
+ positions = new PositionsType(total * 3);
73
+ // laslaz-decoder.js `pointFormatReaders`
74
+ colors = lasHeader.hasColor ? new Uint8Array(total * 4) : null;
75
+ intensities = new Uint16Array(total);
76
+ classifications = new Uint8Array(total);
77
+
78
+ lasMesh.loaderData = lasHeader;
79
+ lasMesh.attributes = {
80
+ POSITION: {value: positions, size: 3},
81
+ // non-gltf attributes, use non-capitalized names for now
82
+ intensity: {value: intensities, size: 1},
83
+ classification: {value: classifications, size: 1}
84
+ };
85
+
86
+ if (colors) {
87
+ lasMesh.attributes.COLOR_0 = {value: colors, size: 4};
88
+ }
89
+ }
90
+
91
+ const batchSize = decoder.pointsCount;
92
+ const {
93
+ scale: [scaleX, scaleY, scaleZ],
94
+ offset: [offsetX, offsetY, offsetZ]
95
+ } = lasHeader;
96
+
97
+ const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);
98
+
99
+ for (let i = 0; i < batchSize; i++) {
100
+ const {position, color, intensity, classification} = decoder.getPoint(i);
101
+
102
+ positions[pointIndex * 3] = position[0] * scaleX + offsetX;
103
+ positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
104
+ positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
105
+
106
+ if (color && colors) {
107
+ if (twoByteColor) {
108
+ colors[pointIndex * 4] = color[0] / 256;
109
+ colors[pointIndex * 4 + 1] = color[1] / 256;
110
+ colors[pointIndex * 4 + 2] = color[2] / 256;
111
+ } else {
112
+ colors[pointIndex * 4] = color[0];
113
+ colors[pointIndex * 4 + 1] = color[1];
114
+ colors[pointIndex * 4 + 2] = color[2];
115
+ }
116
+ colors[pointIndex * 4 + 3] = 255;
117
+ }
118
+
119
+ intensities[pointIndex] = intensity;
120
+ classifications[pointIndex] = classification;
121
+
122
+ pointIndex++;
123
+ }
124
+
125
+ const meshBatch = {
126
+ ...lasMesh,
127
+ header: {
128
+ vertexCount: lasHeader.totalRead
129
+ },
130
+ progress: lasHeader.totalRead / lasHeader.totalToRead
131
+ };
132
+
133
+ options?.onProgress?.(meshBatch);
134
+ });
135
+ /* eslint-enable max-statements */
136
+
137
+ lasMesh.header = {
138
+ vertexCount: originalHeader.totalToRead,
139
+ boundingBox: getMeshBoundingBox(lasMesh?.attributes || {})
140
+ };
141
+
142
+ if (lasMesh) {
143
+ lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);
144
+ }
145
+ return lasMesh;
146
+ }
147
+
148
+ /**
149
+ * parse laz data
150
+ * @param rawData
151
+ * @param skip
152
+ * @param onParseData
153
+ * @return parsed point cloud
154
+ */
155
+ /* eslint-enable max-statements */
156
+ export function parseLASChunked(rawData: ArrayBuffer, skip: number, onParseData: any = {}): void {
157
+ const dataHandler = new LASFile(rawData);
158
+
159
+ try {
160
+ // open data
161
+ dataHandler.open();
162
+
163
+ const header = dataHandler.getHeader();
164
+ // start loading
165
+ const Unpacker = dataHandler.getUnpacker();
166
+
167
+ const totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));
168
+ header.totalToRead = totalToRead;
169
+ let totalRead = 0;
170
+
171
+ /* eslint-disable no-constant-condition */
172
+ while (true) {
173
+ const chunk: LASChunk = dataHandler.readData(1000 * 100, skip);
174
+
175
+ totalRead += chunk.count;
176
+
177
+ header.totalRead = totalRead;
178
+
179
+ const unpacker = new Unpacker(chunk.buffer, chunk.count, header);
180
+
181
+ // surface unpacker and progress via call back
182
+ // use unpacker.pointsCount and unpacker.getPoint(i) to handle data in app
183
+ onParseData(unpacker, header);
184
+
185
+ if (!chunk.hasMoreData || totalRead >= totalToRead) {
186
+ break;
187
+ }
188
+ }
189
+ } catch (e) {
190
+ throw e;
191
+ } finally {
192
+ dataHandler.close();
193
+ }
194
+ }
195
+
196
+ /**
197
+ * @param decoder
198
+ * @param batchSize
199
+ * @param colorDepth
200
+ * @returns boolean
201
+ */
202
+ function detectTwoByteColors(
203
+ decoder: any = {},
204
+ batchSize: number,
205
+ colorDepth?: number | string
206
+ ): boolean {
207
+ let twoByteColor = false;
208
+ switch (colorDepth) {
209
+ case 8:
210
+ twoByteColor = false;
211
+ break;
212
+ case 16:
213
+ twoByteColor = true;
214
+ break;
215
+ case 'auto':
216
+ if (decoder.getPoint(0).color) {
217
+ for (let i = 0; i < batchSize; i++) {
218
+ const {color} = decoder.getPoint(i);
219
+ // eslint-disable-next-line max-depth
220
+ if (color[0] > 255 || color[1] > 255 || color[2] > 255) {
221
+ twoByteColor = true;
222
+ }
223
+ }
224
+ }
225
+ break;
226
+ default:
227
+ // eslint-disable-next-line
228
+ console.warn('las: illegal value for options.las.colorDepth');
229
+ break;
230
+ }
231
+ return twoByteColor;
232
+ }
@@ -0,0 +1,80 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ export class WasmLasZipDecompressor {
4
+ free(): void;
5
+ /**
6
+ * @param {Uint8Array} buf
7
+ */
8
+ constructor(buf: Uint8Array);
9
+ /**
10
+ * @param {Uint8Array} out
11
+ */
12
+ decompress_many(out: Uint8Array): void;
13
+ header: WasmQuickHeader;
14
+ }
15
+ export class WasmQuickHeader {
16
+ free(): void;
17
+ header_size: number;
18
+ major: number;
19
+ minor: number;
20
+ num_points: bigint;
21
+ num_vlrs: number;
22
+ offset_to_points: number;
23
+ point_format_id: number;
24
+ point_size: number;
25
+ }
26
+
27
+ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
28
+
29
+ export interface InitOutput {
30
+ readonly memory: WebAssembly.Memory;
31
+ readonly __wbg_wasmquickheader_free: (a: number, b: number) => void;
32
+ readonly __wbg_get_wasmquickheader_major: (a: number) => number;
33
+ readonly __wbg_set_wasmquickheader_major: (a: number, b: number) => void;
34
+ readonly __wbg_get_wasmquickheader_minor: (a: number) => number;
35
+ readonly __wbg_set_wasmquickheader_minor: (a: number, b: number) => void;
36
+ readonly __wbg_get_wasmquickheader_offset_to_points: (a: number) => number;
37
+ readonly __wbg_set_wasmquickheader_offset_to_points: (a: number, b: number) => void;
38
+ readonly __wbg_get_wasmquickheader_num_vlrs: (a: number) => number;
39
+ readonly __wbg_set_wasmquickheader_num_vlrs: (a: number, b: number) => void;
40
+ readonly __wbg_get_wasmquickheader_point_format_id: (a: number) => number;
41
+ readonly __wbg_set_wasmquickheader_point_format_id: (a: number, b: number) => void;
42
+ readonly __wbg_get_wasmquickheader_point_size: (a: number) => number;
43
+ readonly __wbg_set_wasmquickheader_point_size: (a: number, b: number) => void;
44
+ readonly __wbg_get_wasmquickheader_num_points: (a: number) => number;
45
+ readonly __wbg_set_wasmquickheader_num_points: (a: number, b: number) => void;
46
+ readonly __wbg_get_wasmquickheader_header_size: (a: number) => number;
47
+ readonly __wbg_set_wasmquickheader_header_size: (a: number, b: number) => void;
48
+ readonly __wbg_wasmlaszipdecompressor_free: (a: number, b: number) => void;
49
+ readonly __wbg_get_wasmlaszipdecompressor_header: (a: number) => number;
50
+ readonly __wbg_set_wasmlaszipdecompressor_header: (a: number, b: number) => void;
51
+ readonly wasmlaszipdecompressor_new: (a: number) => Array;
52
+ readonly wasmlaszipdecompressor_decompress_many: (a: number, b: number, c: number, d: number) => Array;
53
+ readonly __wbindgen_export_0: WebAssembly.Table;
54
+ readonly __externref_table_dealloc: (a: number) => void;
55
+ readonly __wbindgen_malloc: (a: number, b: number) => number;
56
+ readonly __wbindgen_free: (a: number, b: number, c: number) => void;
57
+ readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
58
+ readonly __wbindgen_start: () => void;
59
+ }
60
+
61
+ export type SyncInitInput = BufferSource | WebAssembly.Module;
62
+ /**
63
+ * Instantiates the given `module`, which can either be bytes or
64
+ * a precompiled `WebAssembly.Module`.
65
+ *
66
+ * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated.
67
+ *
68
+ * @returns {InitOutput}
69
+ */
70
+ export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput;
71
+
72
+ /**
73
+ * If `module_or_path` is {RequestInfo} or {URL}, makes a request and
74
+ * for everything else, calls `WebAssembly.instantiate` directly.
75
+ *
76
+ * @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated.
77
+ *
78
+ * @returns {Promise<InitOutput>}
79
+ */
80
+ export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;