@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,446 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { WasmLasZipDecompressor } from "../../libs/laz-rs-wasm/laz_rs_wasm.js";
5
+ const POINT_FORMAT_READERS = {
6
+ 0: (dv) => {
7
+ return {
8
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
9
+ intensity: dv.getUint16(12, true),
10
+ classification: dv.getUint8(15)
11
+ };
12
+ },
13
+ 1: (dv) => {
14
+ return {
15
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
16
+ intensity: dv.getUint16(12, true),
17
+ classification: dv.getUint8(15)
18
+ };
19
+ },
20
+ 2: (dv) => {
21
+ return {
22
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
23
+ intensity: dv.getUint16(12, true),
24
+ classification: dv.getUint8(15),
25
+ color: [dv.getUint16(20, true), dv.getUint16(22, true), dv.getUint16(24, true)]
26
+ };
27
+ },
28
+ 3: (dv) => {
29
+ return {
30
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
31
+ intensity: dv.getUint16(12, true),
32
+ classification: dv.getUint8(15),
33
+ color: [dv.getUint16(28, true), dv.getUint16(30, true), dv.getUint16(32, true)]
34
+ };
35
+ },
36
+ 4: (dv) => {
37
+ return {
38
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
39
+ intensity: dv.getUint16(12, true),
40
+ classification: dv.getUint8(15)
41
+ };
42
+ },
43
+ 5: (dv) => {
44
+ return {
45
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
46
+ intensity: dv.getUint16(12, true),
47
+ classification: dv.getUint8(15),
48
+ color: [dv.getUint16(28, true), dv.getUint16(30, true), dv.getUint16(32, true)]
49
+ };
50
+ },
51
+ 6: (dv) => {
52
+ return {
53
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
54
+ intensity: dv.getUint16(12, true),
55
+ classification: dv.getUint8(16)
56
+ };
57
+ },
58
+ 7: (dv) => {
59
+ return {
60
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
61
+ intensity: dv.getUint16(12, true),
62
+ classification: dv.getUint8(16),
63
+ color: [dv.getUint16(30, true), dv.getUint16(32, true), dv.getUint16(34, true)]
64
+ };
65
+ },
66
+ 8: (dv) => {
67
+ return {
68
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
69
+ intensity: dv.getUint16(12, true),
70
+ classification: dv.getUint8(16),
71
+ color: [dv.getUint16(30, true), dv.getUint16(32, true), dv.getUint16(34, true)]
72
+ };
73
+ },
74
+ 9: (dv) => {
75
+ return {
76
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
77
+ intensity: dv.getUint16(12, true),
78
+ classification: dv.getUint8(16)
79
+ };
80
+ },
81
+ 10: (dv) => {
82
+ return {
83
+ position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],
84
+ intensity: dv.getUint16(12, true),
85
+ classification: dv.getUint8(16),
86
+ color: [dv.getUint16(30, true), dv.getUint16(32, true), dv.getUint16(34, true)]
87
+ };
88
+ }
89
+ };
90
+ /**
91
+ * Reads incoming binary data depends on the Type parameter
92
+ * @param buf
93
+ * @param Type
94
+ * @param offset
95
+ * @param count
96
+ * @returns number | number[] from incoming binary data
97
+ */
98
+ function readAs(buf, Type = {}, offset, count) {
99
+ count = count === undefined || count === 0 ? 1 : count;
100
+ const sub = buf.slice(offset, offset + Type.BYTES_PER_ELEMENT * count);
101
+ const r = new Type(sub);
102
+ if (count === 1) {
103
+ return r[0];
104
+ }
105
+ const ret = [];
106
+ for (let i = 0; i < count; i++) {
107
+ ret.push(r[i]);
108
+ }
109
+ return ret;
110
+ }
111
+ /**
112
+ * Parsing of header's attributes
113
+ * @param arraybuffer
114
+ * @returns header as LASHeader
115
+ */
116
+ function parseLASHeader(arraybuffer) {
117
+ const ver = new Uint8Array(arraybuffer, 24, 2);
118
+ const version = ver[0] * 10 + ver[1];
119
+ const versionAsString = `${ver[0]}.${ver[1]}`;
120
+ const rawPointsFormatId = readAs(arraybuffer, Uint8Array, 32 * 3 + 8);
121
+ const bit7 = (rawPointsFormatId & 0x80) >> 7;
122
+ const bit6 = (rawPointsFormatId & 0x40) >> 6;
123
+ const isCompressed = bit7 === 1 || bit6 === 1;
124
+ const pointsFormatId = rawPointsFormatId & 0x3f;
125
+ const o = {
126
+ pointsOffset: readAs(arraybuffer, Uint32Array, 32 * 3),
127
+ pointsFormatId,
128
+ pointsStructSize: readAs(arraybuffer, Uint16Array, 32 * 3 + 8 + 1),
129
+ pointsCount: readAs(arraybuffer, Uint32Array, 32 * 3 + 11),
130
+ versionAsString,
131
+ isCompressed
132
+ };
133
+ let start = 32 * 3 + 35;
134
+ o.scale = readAs(arraybuffer, Float64Array, start, 3);
135
+ start += 24; // 8*3
136
+ o.offset = readAs(arraybuffer, Float64Array, start, 3);
137
+ start += 24;
138
+ const bounds = readAs(arraybuffer, Float64Array, start, 6);
139
+ start += 48; // 8*6
140
+ o.maxs = [bounds[0], bounds[2], bounds[4]];
141
+ o.mins = [bounds[1], bounds[3], bounds[5]];
142
+ start += 20; // 8*20
143
+ if (version === 14) {
144
+ o.pointsCount = Number(readAs(arraybuffer, BigUint64Array, start));
145
+ }
146
+ const colorPointFormats = new Set([2, 3, 5, 7, 8, 10]);
147
+ o.hasColor = colorPointFormats.has(pointsFormatId);
148
+ // @ts-expect-error Caused when restoring lazperf
149
+ return o;
150
+ }
151
+ // LAS Loader
152
+ // Loads uncompressed files
153
+ //
154
+ class LASLoader {
155
+ arraybuffer;
156
+ readOffset = 0;
157
+ header = null;
158
+ constructor(arraybuffer) {
159
+ this.arraybuffer = arraybuffer;
160
+ }
161
+ /**
162
+ * @returns boolean
163
+ */
164
+ open() {
165
+ // Nothing needs to be done to open this
166
+ return true;
167
+ }
168
+ /**
169
+ * Parsing of incoming binary
170
+ * @returns LASHeader
171
+ */
172
+ getHeader() {
173
+ this.header = parseLASHeader(this.arraybuffer);
174
+ return this.header;
175
+ }
176
+ /**
177
+ * Reading data
178
+ * @param count
179
+ * @param skip
180
+ * @returns LasData
181
+ */
182
+ readData(count, skip) {
183
+ const { header, arraybuffer } = this;
184
+ if (!header) {
185
+ throw new Error('Cannot start reading data till a header request is issued');
186
+ }
187
+ let { readOffset } = this;
188
+ let start;
189
+ if (skip <= 1) {
190
+ count = Math.min(count, header.pointsCount - readOffset);
191
+ start = header.pointsOffset + readOffset * header.pointsStructSize;
192
+ const end = start + count * header.pointsStructSize;
193
+ readOffset += count;
194
+ this.readOffset = readOffset;
195
+ return {
196
+ buffer: arraybuffer.slice(start, end),
197
+ count,
198
+ hasMoreData: readOffset < header.pointsCount
199
+ };
200
+ }
201
+ const pointsToRead = Math.min(count * skip, header.pointsCount - readOffset);
202
+ const bufferSize = Math.ceil(pointsToRead / skip);
203
+ let pointsRead = 0;
204
+ const buf = new Uint8Array(bufferSize * header.pointsStructSize);
205
+ for (let i = 0; i < pointsToRead; i++) {
206
+ if (i % skip === 0) {
207
+ start = header.pointsOffset + readOffset * header.pointsStructSize;
208
+ const src = new Uint8Array(arraybuffer, start, header.pointsStructSize);
209
+ buf.set(src, pointsRead * header.pointsStructSize);
210
+ pointsRead++;
211
+ }
212
+ readOffset++;
213
+ }
214
+ this.readOffset = readOffset;
215
+ return {
216
+ buffer: buf.buffer,
217
+ count: pointsRead,
218
+ hasMoreData: readOffset < header.pointsCount
219
+ };
220
+ }
221
+ /**
222
+ * Method which brings data to null to close the file
223
+ * @returns
224
+ */
225
+ close() {
226
+ // @ts-ignore Possibly null
227
+ this.arraybuffer = null;
228
+ return true;
229
+ }
230
+ }
231
+ /**
232
+ * LAZ Loader
233
+ * Uses NaCL module to load LAZ files
234
+ */
235
+ class LAZLoader {
236
+ arraybuffer;
237
+ readOffset = 0;
238
+ instance = null;
239
+ header = null;
240
+ constructor(arraybuffer) {
241
+ this.arraybuffer = arraybuffer;
242
+ }
243
+ /**
244
+ * Opens the file
245
+ * @returns boolean
246
+ */
247
+ open() {
248
+ try {
249
+ const abInt = new Uint8Array(this.arraybuffer);
250
+ this.instance = new WasmLasZipDecompressor(abInt);
251
+ return true;
252
+ }
253
+ catch (error) {
254
+ throw new Error(`Failed to open file: ${error.message}`);
255
+ }
256
+ }
257
+ getHeader() {
258
+ try {
259
+ this.header = parseLASHeader(this.arraybuffer);
260
+ return this.header;
261
+ }
262
+ catch (error) {
263
+ throw new Error(`Failed to get header: ${error.message}`);
264
+ }
265
+ }
266
+ /**
267
+ * @param count
268
+ * @param offset
269
+ * @param skip
270
+ * @returns LASData
271
+ */
272
+ readData(count, skip) {
273
+ if (!this.instance) {
274
+ throw new Error('You need to open the file before trying to read stuff');
275
+ }
276
+ const { header, instance } = this;
277
+ if (!header) {
278
+ throw new Error('You need to query header before reading, I maintain state that way, sorry :(');
279
+ }
280
+ try {
281
+ const pointsToRead = Math.min(count * skip, header.pointsCount - this.readOffset);
282
+ const bufferSize = Math.ceil(pointsToRead / skip);
283
+ let pointsRead = 0;
284
+ const buf = new Uint8Array(bufferSize * header.pointsStructSize);
285
+ const bufRead = new Uint8Array(header.pointsStructSize);
286
+ for (let i = 0; i < pointsToRead; i++) {
287
+ instance.decompress_many(bufRead);
288
+ if (i % skip === 0) {
289
+ buf.set(bufRead, pointsRead * header.pointsStructSize);
290
+ pointsRead++;
291
+ }
292
+ this.readOffset++;
293
+ }
294
+ return {
295
+ buffer: buf.buffer,
296
+ count: pointsRead,
297
+ hasMoreData: this.readOffset < header.pointsCount
298
+ };
299
+ }
300
+ catch (error) {
301
+ throw new Error(`Failed to read data: ${error.message}`);
302
+ }
303
+ }
304
+ /**
305
+ * Deletes the instance
306
+ * @returns boolean
307
+ */
308
+ close() {
309
+ try {
310
+ if (this.instance !== null) {
311
+ this.instance.free();
312
+ this.instance = null;
313
+ }
314
+ // @ts-ignore Possibly null
315
+ this.arraybuffer = null;
316
+ return true;
317
+ }
318
+ catch (error) {
319
+ throw new Error(`Failed to close file: ${error.message}`);
320
+ }
321
+ }
322
+ }
323
+ /**
324
+ * Helper class: Decodes LAS records into points
325
+ */
326
+ class LASDecoder {
327
+ arrayb;
328
+ decoder;
329
+ pointsCount;
330
+ pointSize;
331
+ constructor(buffer, len, header) {
332
+ this.arrayb = buffer;
333
+ this.decoder = POINT_FORMAT_READERS[header.pointsFormatId];
334
+ this.pointsCount = len;
335
+ this.pointSize = header.pointsStructSize;
336
+ }
337
+ /**
338
+ * Decodes data depends on this point size
339
+ * @param index
340
+ * @returns New object
341
+ */
342
+ getPoint(index) {
343
+ if (index < 0 || index >= this.pointsCount) {
344
+ throw new Error('Point index out of range');
345
+ }
346
+ const dv = new DataView(this.arrayb, index * this.pointSize, this.pointSize);
347
+ return this.decoder(dv);
348
+ }
349
+ }
350
+ /**
351
+ * A single consistent interface for loading LAS/LAZ files
352
+ */
353
+ export class LASFile {
354
+ arraybuffer;
355
+ formatId = 0;
356
+ loader;
357
+ isCompressed = true;
358
+ isOpen = false;
359
+ version = 0;
360
+ versionAsString = '';
361
+ constructor(arraybuffer) {
362
+ this.arraybuffer = arraybuffer;
363
+ this.validate();
364
+ this.loader = this.isCompressed
365
+ ? new LAZLoader(this.arraybuffer)
366
+ : new LASLoader(this.arraybuffer);
367
+ }
368
+ validate() {
369
+ const signature = readAs(this.arraybuffer, Uint8Array, 0, 4);
370
+ const check = String.fromCharCode(...signature);
371
+ if (check !== 'LASF') {
372
+ throw new Error('Invalid LAS file');
373
+ }
374
+ if (this.determineVersion() > 14) {
375
+ throw new Error('Only file versions <= 1.4 are supported');
376
+ }
377
+ this.determineFormat();
378
+ if (POINT_FORMAT_READERS[this.formatId] === undefined) {
379
+ throw new Error('The point format ID is not supported');
380
+ }
381
+ }
382
+ /**
383
+ * Determines format in parameters of LASHeader
384
+ */
385
+ determineFormat() {
386
+ const formatId = readAs(this.arraybuffer, Uint8Array, 32 * 3 + 8);
387
+ const bit7 = (formatId & 0x80) >> 7;
388
+ const bit6 = (formatId & 0x40) >> 6;
389
+ if (bit7 === 1 && bit6 === 1) {
390
+ throw new Error('Old style compression not supported');
391
+ }
392
+ this.formatId = formatId & 0x3f;
393
+ this.isCompressed = bit7 === 1 || bit6 === 1;
394
+ }
395
+ /**
396
+ * Determines version
397
+ * @returns version
398
+ */
399
+ determineVersion() {
400
+ const ver = new Uint8Array(this.arraybuffer, 24, 2);
401
+ this.version = ver[0] * 10 + ver[1];
402
+ this.versionAsString = `${ver[0]}.${ver[1]}`;
403
+ return this.version;
404
+ }
405
+ /**
406
+ * Reads if the file is open
407
+ * @returns boolean
408
+ */
409
+ open() {
410
+ if (this.loader.open()) {
411
+ this.isOpen = true;
412
+ }
413
+ }
414
+ /**
415
+ * Gets the header
416
+ * @returns Header
417
+ */
418
+ getHeader() {
419
+ return this.loader.getHeader();
420
+ }
421
+ /**
422
+ * @param count
423
+ * @param start
424
+ * @param skip
425
+ * @returns LASData
426
+ */
427
+ readData(count, skip) {
428
+ return this.loader.readData(count, skip);
429
+ }
430
+ /**
431
+ * Closes the file
432
+ */
433
+ close() {
434
+ if (this.loader.close()) {
435
+ this.isOpen = false;
436
+ }
437
+ }
438
+ /**
439
+ */
440
+ getUnpacker() {
441
+ return LASDecoder;
442
+ }
443
+ }
444
+ /* eslint no-use-before-define: 2 */
445
+ // export const LASModuleWasLoaded = false;
446
+ //# sourceMappingURL=laslaz-decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laslaz-decoder.js","sourceRoot":"","sources":["../../../src/lib/laz-rs-wasm/laslaz-decoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { LASLoaderOptions } from "../../las-loader.js";
2
+ import type { LASMesh } from "../las-types.js";
3
+ /**
4
+ * Parsing of .las file
5
+ * @param arrayBuffer
6
+ * @param options
7
+ * @returns LASMesh
8
+ */
9
+ export declare function parseLAS(arrayBuffer: ArrayBuffer, options?: LASLoaderOptions): LASMesh;
10
+ /**
11
+ * parse laz data
12
+ * @param rawData
13
+ * @param skip
14
+ * @param onParseData
15
+ * @return parsed point cloud
16
+ */
17
+ export declare function parseLASChunked(rawData: ArrayBuffer, skip: number, onParseData?: any): void;
18
+ //# sourceMappingURL=parse-las.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-las.d.ts","sourceRoot":"","sources":["../../../src/lib/laz-rs-wasm/parse-las.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,gBAAgB,EAAC,4BAAyB;AACvD,OAAO,KAAK,EAAC,OAAO,EAAY,wBAAqB;AAWrD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAKtF;AAsHD;;;;;;GAMG;AAEH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,GAAQ,GAAG,IAAI,CAsC/F"}
@@ -0,0 +1,188 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { getMeshBoundingBox /* , convertMeshToTable */ } from '@loaders.gl/schema-utils';
5
+ import { getLASSchema } from "../get-las-schema.js";
6
+ import { LASFile } from "./laslaz-decoder.js";
7
+ /**
8
+ * Parsing of .las file
9
+ * @param arrayBuffer
10
+ * @param options
11
+ * @returns LASMesh
12
+ */
13
+ export function parseLAS(arrayBuffer, options) {
14
+ return parseLASMesh(arrayBuffer, options);
15
+ // This code breaks pointcloud example on the website
16
+ // const mesh = parseLASMesh(arrayBuffer, options);
17
+ // return convertMeshToTable(mesh, options?.las?.shape || 'mesh') as LASMesh | ArrowTable | ColumnarTable;
18
+ }
19
+ /**
20
+ * Parsing of .las file
21
+ * @param arrayBuffer
22
+ * @param options
23
+ * @returns LASHeader
24
+ */
25
+ function parseLASMesh(arrayBuffer, options = {}) {
26
+ let pointIndex = 0;
27
+ let positions;
28
+ let colors;
29
+ let intensities;
30
+ let classifications;
31
+ let originalHeader;
32
+ const lasMesh = {
33
+ loader: 'las',
34
+ loaderData: {},
35
+ // shape: 'mesh',
36
+ schema: { fields: [], metadata: {} },
37
+ header: {
38
+ vertexCount: 0,
39
+ boundingBox: [
40
+ [0, 0, 0],
41
+ [0, 0, 0]
42
+ ]
43
+ },
44
+ attributes: {},
45
+ topology: 'point-list',
46
+ mode: 0 // GL.POINTS
47
+ };
48
+ /* eslint-disable max-statements */
49
+ // @ts-ignore Possibly undefined
50
+ parseLASChunked(arrayBuffer, options.las?.skip, (decoder = {}, lasHeader) => {
51
+ if (!originalHeader) {
52
+ originalHeader = lasHeader;
53
+ const total = lasHeader.totalToRead;
54
+ const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;
55
+ positions = new PositionsType(total * 3);
56
+ // laslaz-decoder.js `pointFormatReaders`
57
+ colors = lasHeader.hasColor ? new Uint8Array(total * 4) : null;
58
+ intensities = new Uint16Array(total);
59
+ classifications = new Uint8Array(total);
60
+ lasMesh.loaderData = lasHeader;
61
+ lasMesh.attributes = {
62
+ POSITION: { value: positions, size: 3 },
63
+ // non-gltf attributes, use non-capitalized names for now
64
+ intensity: { value: intensities, size: 1 },
65
+ classification: { value: classifications, size: 1 }
66
+ };
67
+ if (colors) {
68
+ lasMesh.attributes.COLOR_0 = { value: colors, size: 4 };
69
+ }
70
+ }
71
+ const batchSize = decoder.pointsCount;
72
+ const { scale: [scaleX, scaleY, scaleZ], offset: [offsetX, offsetY, offsetZ] } = lasHeader;
73
+ const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);
74
+ for (let i = 0; i < batchSize; i++) {
75
+ const { position, color, intensity, classification } = decoder.getPoint(i);
76
+ positions[pointIndex * 3] = position[0] * scaleX + offsetX;
77
+ positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
78
+ positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
79
+ if (color && colors) {
80
+ if (twoByteColor) {
81
+ colors[pointIndex * 4] = color[0] / 256;
82
+ colors[pointIndex * 4 + 1] = color[1] / 256;
83
+ colors[pointIndex * 4 + 2] = color[2] / 256;
84
+ }
85
+ else {
86
+ colors[pointIndex * 4] = color[0];
87
+ colors[pointIndex * 4 + 1] = color[1];
88
+ colors[pointIndex * 4 + 2] = color[2];
89
+ }
90
+ colors[pointIndex * 4 + 3] = 255;
91
+ }
92
+ intensities[pointIndex] = intensity;
93
+ classifications[pointIndex] = classification;
94
+ pointIndex++;
95
+ }
96
+ const meshBatch = {
97
+ ...lasMesh,
98
+ header: {
99
+ vertexCount: lasHeader.totalRead
100
+ },
101
+ progress: lasHeader.totalRead / lasHeader.totalToRead
102
+ };
103
+ options?.onProgress?.(meshBatch);
104
+ });
105
+ /* eslint-enable max-statements */
106
+ lasMesh.header = {
107
+ vertexCount: originalHeader.totalToRead,
108
+ boundingBox: getMeshBoundingBox(lasMesh?.attributes || {})
109
+ };
110
+ if (lasMesh) {
111
+ lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);
112
+ }
113
+ return lasMesh;
114
+ }
115
+ /**
116
+ * parse laz data
117
+ * @param rawData
118
+ * @param skip
119
+ * @param onParseData
120
+ * @return parsed point cloud
121
+ */
122
+ /* eslint-enable max-statements */
123
+ export function parseLASChunked(rawData, skip, onParseData = {}) {
124
+ const dataHandler = new LASFile(rawData);
125
+ try {
126
+ // open data
127
+ dataHandler.open();
128
+ const header = dataHandler.getHeader();
129
+ // start loading
130
+ const Unpacker = dataHandler.getUnpacker();
131
+ const totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));
132
+ header.totalToRead = totalToRead;
133
+ let totalRead = 0;
134
+ /* eslint-disable no-constant-condition */
135
+ while (true) {
136
+ const chunk = dataHandler.readData(1000 * 100, skip);
137
+ totalRead += chunk.count;
138
+ header.totalRead = totalRead;
139
+ const unpacker = new Unpacker(chunk.buffer, chunk.count, header);
140
+ // surface unpacker and progress via call back
141
+ // use unpacker.pointsCount and unpacker.getPoint(i) to handle data in app
142
+ onParseData(unpacker, header);
143
+ if (!chunk.hasMoreData || totalRead >= totalToRead) {
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ catch (e) {
149
+ throw e;
150
+ }
151
+ finally {
152
+ dataHandler.close();
153
+ }
154
+ }
155
+ /**
156
+ * @param decoder
157
+ * @param batchSize
158
+ * @param colorDepth
159
+ * @returns boolean
160
+ */
161
+ function detectTwoByteColors(decoder = {}, batchSize, colorDepth) {
162
+ let twoByteColor = false;
163
+ switch (colorDepth) {
164
+ case 8:
165
+ twoByteColor = false;
166
+ break;
167
+ case 16:
168
+ twoByteColor = true;
169
+ break;
170
+ case 'auto':
171
+ if (decoder.getPoint(0).color) {
172
+ for (let i = 0; i < batchSize; i++) {
173
+ const { color } = decoder.getPoint(i);
174
+ // eslint-disable-next-line max-depth
175
+ if (color[0] > 255 || color[1] > 255 || color[2] > 255) {
176
+ twoByteColor = true;
177
+ }
178
+ }
179
+ }
180
+ break;
181
+ default:
182
+ // eslint-disable-next-line
183
+ console.warn('las: illegal value for options.las.colorDepth');
184
+ break;
185
+ }
186
+ return twoByteColor;
187
+ }
188
+ //# sourceMappingURL=parse-las.js.map