@loaders.gl/las 3.3.0-alpha.5 → 3.3.0-alpha.7

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.
@@ -1,4 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+
2
3
  import getModule from './libs/laz-perf';
3
4
  let Module = null;
4
5
  const POINT_FORMAT_READERS = {
@@ -34,21 +35,20 @@ const POINT_FORMAT_READERS = {
34
35
  }
35
36
  };
36
37
 
37
- function readAs(buf, Type = {}, offset, count) {
38
+ function readAs(buf) {
39
+ let Type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
40
+ let offset = arguments.length > 2 ? arguments[2] : undefined;
41
+ let count = arguments.length > 3 ? arguments[3] : undefined;
38
42
  count = count === undefined || count === 0 ? 1 : count;
39
43
  const sub = buf.slice(offset, offset + Type.BYTES_PER_ELEMENT * count);
40
44
  const r = new Type(sub);
41
-
42
45
  if (count === 1) {
43
46
  return r[0];
44
47
  }
45
-
46
48
  const ret = [];
47
-
48
49
  for (let i = 0; i < count; i++) {
49
50
  ret.push(r[i]);
50
51
  }
51
-
52
52
  return ret;
53
53
  }
54
54
 
@@ -74,9 +74,7 @@ function parseLASHeader(arraybuffer) {
74
74
  class LASLoader {
75
75
  constructor(arraybuffer) {
76
76
  _defineProperty(this, "arraybuffer", void 0);
77
-
78
77
  _defineProperty(this, "readOffset", 0);
79
-
80
78
  _defineProperty(this, "header", {
81
79
  pointsOffset: 0,
82
80
  pointsFormatId: 0,
@@ -91,14 +89,12 @@ class LASLoader {
91
89
  versionAsString: '',
92
90
  isCompressed: true
93
91
  });
94
-
95
92
  this.arraybuffer = arraybuffer;
96
93
  }
97
94
 
98
95
  open() {
99
96
  return true;
100
97
  }
101
-
102
98
  getHeader() {
103
99
  this.header = parseLASHeader(this.arraybuffer);
104
100
  return this.header;
@@ -109,16 +105,13 @@ class LASLoader {
109
105
  header,
110
106
  arraybuffer
111
107
  } = this;
112
-
113
108
  if (!header) {
114
109
  throw new Error('Cannot start reading data till a header request is issued');
115
110
  }
116
-
117
111
  let {
118
112
  readOffset
119
113
  } = this;
120
114
  let start;
121
-
122
115
  if (skip <= 1) {
123
116
  count = Math.min(count, header.pointsCount - readOffset);
124
117
  start = header.pointsOffset + readOffset * header.pointsStructSize;
@@ -131,12 +124,10 @@ class LASLoader {
131
124
  hasMoreData: readOffset < header.pointsCount
132
125
  };
133
126
  }
134
-
135
127
  const pointsToRead = Math.min(count * skip, header.pointsCount - readOffset);
136
128
  const bufferSize = Math.ceil(pointsToRead / skip);
137
129
  let pointsRead = 0;
138
130
  const buf = new Uint8Array(bufferSize * header.pointsStructSize);
139
-
140
131
  for (let i = 0; i < pointsToRead; i++) {
141
132
  if (i % skip === 0) {
142
133
  start = header.pointsOffset + readOffset * header.pointsStructSize;
@@ -144,10 +135,8 @@ class LASLoader {
144
135
  buf.set(src, pointsRead * header.pointsStructSize);
145
136
  pointsRead++;
146
137
  }
147
-
148
138
  readOffset++;
149
139
  }
150
-
151
140
  this.readOffset = readOffset;
152
141
  return {
153
142
  buffer: buf.buffer,
@@ -155,24 +144,19 @@ class LASLoader {
155
144
  hasMoreData: readOffset < header.pointsCount
156
145
  };
157
146
  }
158
-
159
147
  close() {
160
148
  this.arraybuffer = null;
161
149
  return true;
162
150
  }
163
-
164
151
  }
165
152
 
166
153
  class LAZLoader {
154
+
167
155
  constructor(arraybuffer) {
168
156
  _defineProperty(this, "arraybuffer", void 0);
169
-
170
157
  _defineProperty(this, "instance", null);
171
-
172
158
  _defineProperty(this, "header", null);
173
-
174
159
  this.arraybuffer = arraybuffer;
175
-
176
160
  if (!Module) {
177
161
  Module = getModule();
178
162
  }
@@ -185,9 +169,7 @@ class LAZLoader {
185
169
  } = this;
186
170
  this.instance = new Module.LASZip();
187
171
  const abInt = new Uint8Array(arraybuffer);
188
-
189
172
  const buf = Module._malloc(arraybuffer.byteLength);
190
-
191
173
  this.instance.arraybuffer = arraybuffer;
192
174
  this.instance.buf = buf;
193
175
  Module.HEAPU8.set(abInt, buf);
@@ -198,12 +180,10 @@ class LAZLoader {
198
180
  throw new Error("Failed to open file: ".concat(error.message));
199
181
  }
200
182
  }
201
-
202
183
  getHeader() {
203
184
  if (!this.instance) {
204
185
  throw new Error('You need to open the file before trying to read header');
205
186
  }
206
-
207
187
  try {
208
188
  const header = parseLASHeader(this.instance.arraybuffer);
209
189
  header.pointsFormatId &= 0x3f;
@@ -213,41 +193,32 @@ class LAZLoader {
213
193
  throw new Error("Failed to get header: ".concat(error.message));
214
194
  }
215
195
  }
216
-
217
196
  readData(count, offset, skip) {
218
197
  if (!this.instance) {
219
198
  throw new Error('You need to open the file before trying to read stuff');
220
199
  }
221
-
222
200
  const {
223
201
  header,
224
202
  instance
225
203
  } = this;
226
-
227
204
  if (!header) {
228
205
  throw new Error('You need to query header before reading, I maintain state that way, sorry :(');
229
206
  }
230
-
231
207
  try {
232
208
  const pointsToRead = Math.min(count * skip, header.pointsCount - instance.readOffset);
233
209
  const bufferSize = Math.ceil(pointsToRead / skip);
234
210
  let pointsRead = 0;
235
211
  const thisBuf = new Uint8Array(bufferSize * header.pointsStructSize);
236
-
237
212
  const bufRead = Module._malloc(header.pointsStructSize);
238
-
239
213
  for (let i = 0; i < pointsToRead; i++) {
240
214
  instance.getPoint(bufRead);
241
-
242
215
  if (i % skip === 0) {
243
216
  const a = new Uint8Array(Module.HEAPU8.buffer, bufRead, header.pointsStructSize);
244
217
  thisBuf.set(a, pointsRead * header.pointsStructSize);
245
218
  pointsRead++;
246
219
  }
247
-
248
220
  instance.readOffset++;
249
221
  }
250
-
251
222
  return {
252
223
  buffer: thisBuf.buffer,
253
224
  count: pointsRead,
@@ -264,33 +235,23 @@ class LAZLoader {
264
235
  this.instance.delete();
265
236
  this.instance = null;
266
237
  }
267
-
268
238
  return true;
269
239
  } catch (error) {
270
240
  throw new Error("Failed to close file: ".concat(error.message));
271
241
  }
272
242
  }
273
-
274
243
  }
275
244
 
276
245
  class LASDecoder {
277
246
  constructor(buffer, len, header) {
278
247
  _defineProperty(this, "arrayb", void 0);
279
-
280
248
  _defineProperty(this, "decoder", void 0);
281
-
282
249
  _defineProperty(this, "pointsCount", void 0);
283
-
284
250
  _defineProperty(this, "pointSize", void 0);
285
-
286
251
  _defineProperty(this, "scale", void 0);
287
-
288
252
  _defineProperty(this, "offset", void 0);
289
-
290
253
  _defineProperty(this, "mins", void 0);
291
-
292
254
  _defineProperty(this, "maxs", void 0);
293
-
294
255
  this.arrayb = buffer;
295
256
  this.decoder = POINT_FORMAT_READERS[header.pointsFormatId];
296
257
  this.pointsCount = len;
@@ -305,41 +266,28 @@ class LASDecoder {
305
266
  if (index < 0 || index >= this.pointsCount) {
306
267
  throw new Error('Point index out of range');
307
268
  }
308
-
309
269
  const dv = new DataView(this.arrayb, index * this.pointSize, this.pointSize);
310
270
  return this.decoder(dv);
311
271
  }
312
-
313
272
  }
314
273
 
315
274
  export class LASFile {
316
275
  constructor(arraybuffer) {
317
276
  _defineProperty(this, "arraybuffer", void 0);
318
-
319
277
  _defineProperty(this, "formatId", 0);
320
-
321
278
  _defineProperty(this, "loader", void 0);
322
-
323
279
  _defineProperty(this, "isCompressed", true);
324
-
325
280
  _defineProperty(this, "isOpen", false);
326
-
327
281
  _defineProperty(this, "version", 0);
328
-
329
282
  _defineProperty(this, "versionAsString", '');
330
-
331
283
  this.arraybuffer = arraybuffer;
332
-
333
284
  if (this.determineVersion() > 13) {
334
285
  throw new Error('Only file versions <= 1.3 are supported at this time');
335
286
  }
336
-
337
287
  this.determineFormat();
338
-
339
288
  if (POINT_FORMAT_READERS[this.formatId] === undefined) {
340
289
  throw new Error('The point format ID is not supported');
341
290
  }
342
-
343
291
  this.loader = this.isCompressed ? new LAZLoader(this.arraybuffer) : new LASLoader(this.arraybuffer);
344
292
  }
345
293
 
@@ -347,11 +295,9 @@ export class LASFile {
347
295
  const formatId = readAs(this.arraybuffer, Uint8Array, 32 * 3 + 8);
348
296
  const bit7 = (formatId & 0x80) >> 7;
349
297
  const bit6 = (formatId & 0x40) >> 6;
350
-
351
298
  if (bit7 === 1 && bit6 === 1) {
352
299
  throw new Error('Old style compression not supported');
353
300
  }
354
-
355
301
  this.formatId = formatId & 0x3f;
356
302
  this.isCompressed = bit7 === 1 || bit6 === 1;
357
303
  }
@@ -368,7 +314,6 @@ export class LASFile {
368
314
  this.isOpen = true;
369
315
  }
370
316
  }
371
-
372
317
  getHeader() {
373
318
  return this.loader.getHeader();
374
319
  }
@@ -382,11 +327,9 @@ export class LASFile {
382
327
  this.isOpen = false;
383
328
  }
384
329
  }
385
-
386
330
  getUnpacker() {
387
331
  return LASDecoder;
388
332
  }
389
-
390
333
  }
391
334
  export const LASModuleWasLoaded = false;
392
335
  //# sourceMappingURL=laslaz-decoder.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/laslaz-decoder.ts"],"names":["getModule","Module","POINT_FORMAT_READERS","dv","position","getInt32","intensity","getUint16","classification","getUint8","color","readAs","buf","Type","offset","count","undefined","sub","slice","BYTES_PER_ELEMENT","r","ret","i","push","parseLASHeader","arraybuffer","start","o","pointsOffset","Uint32Array","pointsFormatId","Uint8Array","pointsStructSize","Uint16Array","pointsCount","scale","Float64Array","bounds","maxs","mins","LASLoader","constructor","totalToRead","totalRead","versionAsString","isCompressed","open","getHeader","header","readData","skip","Error","readOffset","Math","min","end","buffer","hasMoreData","pointsToRead","bufferSize","ceil","pointsRead","src","set","close","LAZLoader","instance","LASZip","abInt","_malloc","byteLength","HEAPU8","error","message","thisBuf","bufRead","getPoint","a","delete","LASDecoder","len","arrayb","decoder","pointSize","index","DataView","LASFile","determineVersion","determineFormat","formatId","loader","bit7","bit6","ver","Int8Array","version","isOpen","getUnpacker","LASModuleWasLoaded"],"mappings":"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","sourcesContent":["/*\n Modified from Uday Verma and Howard Butler's plasio\n https://github.com/verma/plasio/\n MIT License\n*/\n// laslaz.js - treat as compiled code\nimport type {LASHeader} from './las-types';\nimport getModule from './libs/laz-perf';\n\nlet Module: any = null;\n\ntype LASReader = (dv: DataView) => {\n [LASAttribute: string]: number | number[];\n};\n\ntype LASReaders = {\n [key: number]: LASReader;\n};\n\ntype LASData = {\n buffer: ArrayBuffer;\n count: number;\n hasMoreData: boolean;\n};\n\nconst POINT_FORMAT_READERS: LASReaders = {\n 0: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15)\n };\n },\n 1: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15)\n };\n },\n 2: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15),\n color: [dv.getUint16(20, true), dv.getUint16(22, true), dv.getUint16(24, true)]\n };\n },\n 3: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15),\n color: [dv.getUint16(28, true), dv.getUint16(30, true), dv.getUint16(32, true)]\n };\n }\n};\n\n/**\n * Reads incoming binary data depends on the Type parameter\n * @param buf\n * @param Type\n * @param offset\n * @param count\n * @returns number | number[] from incoming binary data\n */\nfunction readAs(buf: ArrayBuffer, Type: any = {}, offset: number, count?: number) {\n count = count === undefined || count === 0 ? 1 : count;\n const sub = buf.slice(offset, offset + Type.BYTES_PER_ELEMENT * count);\n\n const r = new Type(sub);\n if (count === 1) {\n return r[0];\n }\n\n const ret: number[] = [];\n for (let i = 0; i < count; i++) {\n ret.push(r[i]);\n }\n\n return ret;\n}\n\n/**\n * Parsing of header's attributes\n * @param arraybuffer\n * @returns header as LASHeader\n */\nfunction parseLASHeader(arraybuffer: ArrayBuffer): LASHeader {\n let start = 32 * 3 + 35;\n\n const o: Partial<LASHeader> = {\n pointsOffset: readAs(arraybuffer, Uint32Array, 32 * 3),\n pointsFormatId: readAs(arraybuffer, Uint8Array, 32 * 3 + 8),\n pointsStructSize: readAs(arraybuffer, Uint16Array, 32 * 3 + 8 + 1),\n pointsCount: readAs(arraybuffer, Uint32Array, 32 * 3 + 11),\n scale: readAs(arraybuffer, Float64Array, start, 3)\n };\n start += 24; // 8*3\n o.offset = readAs(arraybuffer, Float64Array, start, 3);\n start += 24;\n\n const bounds = readAs(arraybuffer, Float64Array, start, 6);\n start += 48; // 8*6;\n o.maxs = [bounds[0], bounds[2], bounds[4]];\n o.mins = [bounds[1], bounds[3], bounds[5]];\n\n return o as LASHeader;\n}\n\n// LAS Loader\n// Loads uncompressed files\n//\nclass LASLoader {\n arraybuffer: ArrayBuffer;\n readOffset: number = 0;\n header: LASHeader = {\n pointsOffset: 0,\n pointsFormatId: 0,\n pointsStructSize: 0,\n pointsCount: 0,\n scale: [0, 0, 0],\n offset: [0, 0, 0],\n maxs: [0],\n mins: [0],\n totalToRead: 0,\n totalRead: 0,\n versionAsString: '',\n isCompressed: true\n };\n\n constructor(arraybuffer: ArrayBuffer) {\n this.arraybuffer = arraybuffer;\n }\n\n /**\n * @returns boolean\n */\n open() {\n // Nothing needs to be done to open this\n return true;\n }\n /**\n * Parsing of incoming binary\n * @returns LASHeader\n */\n getHeader() {\n this.header = parseLASHeader(this.arraybuffer);\n return this.header;\n }\n\n /**\n * Reading data\n * @param count\n * @param skip\n * @returns new ArrayBuffer, count, hasMoreData\n */\n readData(count: number, skip: number) {\n const {header, arraybuffer} = this;\n if (!header) {\n throw new Error('Cannot start reading data till a header request is issued');\n }\n\n let {readOffset} = this;\n let start: number;\n\n if (skip <= 1) {\n count = Math.min(count, header.pointsCount - readOffset);\n start = header.pointsOffset + readOffset * header.pointsStructSize;\n const end = start + count * header.pointsStructSize;\n readOffset += count;\n this.readOffset = readOffset;\n return {\n buffer: arraybuffer.slice(start, end),\n count,\n hasMoreData: readOffset < header.pointsCount\n };\n }\n\n const pointsToRead = Math.min(count * skip, header.pointsCount - readOffset);\n const bufferSize = Math.ceil(pointsToRead / skip);\n let pointsRead = 0;\n\n const buf = new Uint8Array(bufferSize * header.pointsStructSize);\n for (let i = 0; i < pointsToRead; i++) {\n if (i % skip === 0) {\n start = header.pointsOffset + readOffset * header.pointsStructSize;\n const src = new Uint8Array(arraybuffer, start, header.pointsStructSize);\n\n buf.set(src, pointsRead * header.pointsStructSize);\n pointsRead++;\n }\n\n readOffset++;\n }\n this.readOffset = readOffset;\n\n return {\n buffer: buf.buffer,\n count: pointsRead,\n hasMoreData: readOffset < header.pointsCount\n };\n }\n /**\n * Method which brings data to null to close the file\n * @returns\n */\n close() {\n // @ts-ignore Possibly null\n this.arraybuffer = null;\n return true;\n }\n}\n\n/**\n * LAZ Loader\n * Uses NaCL module to load LAZ files\n */\nclass LAZLoader {\n arraybuffer: ArrayBuffer;\n instance: any = null; // LASZip instance\n header: LASHeader | null = null;\n\n constructor(arraybuffer: ArrayBuffer) {\n this.arraybuffer = arraybuffer;\n\n if (!Module) {\n // Avoid executing laz-perf on import\n Module = getModule();\n }\n }\n\n /**\n * Opens the file\n * @returns boolean\n */\n open(): boolean {\n try {\n const {arraybuffer} = this;\n this.instance = new Module.LASZip();\n const abInt = new Uint8Array(arraybuffer);\n const buf = Module._malloc(arraybuffer.byteLength);\n\n this.instance.arraybuffer = arraybuffer;\n this.instance.buf = buf;\n Module.HEAPU8.set(abInt, buf);\n this.instance.open(buf, arraybuffer.byteLength);\n\n this.instance.readOffset = 0;\n\n return true;\n } catch (error) {\n throw new Error(`Failed to open file: ${(error as Error).message}`);\n }\n }\n\n getHeader(): LASHeader {\n if (!this.instance) {\n throw new Error('You need to open the file before trying to read header');\n }\n\n try {\n const header = parseLASHeader(this.instance.arraybuffer);\n header.pointsFormatId &= 0x3f;\n this.header = header;\n return header;\n } catch (error) {\n throw new Error(`Failed to get header: ${(error as Error).message}`);\n }\n }\n /**\n * @param count\n * @param offset\n * @param skip\n * @returns Data\n */\n readData(count: number, offset: number, skip: number): LASData {\n if (!this.instance) {\n throw new Error('You need to open the file before trying to read stuff');\n }\n\n const {header, instance} = this;\n\n if (!header) {\n throw new Error(\n 'You need to query header before reading, I maintain state that way, sorry :('\n );\n }\n\n try {\n const pointsToRead = Math.min(count * skip, header.pointsCount - instance.readOffset);\n const bufferSize = Math.ceil(pointsToRead / skip);\n let pointsRead = 0;\n\n const thisBuf = new Uint8Array(bufferSize * header.pointsStructSize);\n const bufRead = Module._malloc(header.pointsStructSize);\n for (let i = 0; i < pointsToRead; i++) {\n instance.getPoint(bufRead);\n\n if (i % skip === 0) {\n const a = new Uint8Array(Module.HEAPU8.buffer, bufRead, header.pointsStructSize);\n thisBuf.set(a, pointsRead * header.pointsStructSize);\n pointsRead++;\n }\n\n instance.readOffset++;\n }\n\n return {\n buffer: thisBuf.buffer,\n count: pointsRead,\n hasMoreData: instance.readOffset < header.pointsCount\n };\n } catch (error) {\n throw new Error(`Failed to read data: ${(error as Error).message}`);\n }\n }\n\n /**\n * Deletes the instance\n * @returns boolean\n */\n close(): boolean {\n try {\n if (this.instance !== null) {\n this.instance.delete();\n this.instance = null;\n }\n return true;\n } catch (error) {\n throw new Error(`Failed to close file: ${(error as Error).message}`);\n }\n }\n}\n\n/**\n * Helper class: Decodes LAS records into points\n */\nclass LASDecoder {\n arrayb: ArrayBuffer;\n decoder: (dv: DataView) => {};\n pointsCount: number;\n pointSize: number;\n scale: [number, number, number];\n offset?: [number, number, number];\n mins?: number[];\n maxs?: number[];\n\n constructor(buffer: ArrayBuffer, len: number, header: LASHeader) {\n this.arrayb = buffer;\n this.decoder = POINT_FORMAT_READERS[header.pointsFormatId];\n this.pointsCount = len;\n this.pointSize = header.pointsStructSize;\n this.scale = header.scale;\n this.offset = header.offset;\n this.mins = header.mins;\n this.maxs = header.maxs;\n }\n\n /**\n * Decodes data depends on this point size\n * @param index\n * @returns New object\n */\n getPoint(index: number): {} {\n if (index < 0 || index >= this.pointsCount) {\n throw new Error('Point index out of range');\n }\n\n const dv = new DataView(this.arrayb, index * this.pointSize, this.pointSize);\n return this.decoder(dv);\n }\n}\n\n/**\n * A single consistent interface for loading LAS/LAZ files\n */\nexport class LASFile {\n arraybuffer: ArrayBuffer;\n formatId: number = 0;\n loader: LASLoader | LAZLoader;\n isCompressed: boolean = true;\n isOpen: boolean = false;\n version: number = 0;\n versionAsString: string = '';\n\n constructor(arraybuffer: ArrayBuffer) {\n this.arraybuffer = arraybuffer;\n\n if (this.determineVersion() > 13) {\n throw new Error('Only file versions <= 1.3 are supported at this time');\n }\n\n this.determineFormat();\n if (POINT_FORMAT_READERS[this.formatId] === undefined) {\n throw new Error('The point format ID is not supported');\n }\n\n this.loader = this.isCompressed\n ? new LAZLoader(this.arraybuffer)\n : new LASLoader(this.arraybuffer);\n }\n\n /**\n * Determines format in parameters of LASHeaer\n */\n determineFormat(): void {\n const formatId = readAs(this.arraybuffer, Uint8Array, 32 * 3 + 8);\n const bit7 = (formatId & 0x80) >> 7;\n const bit6 = (formatId & 0x40) >> 6;\n\n if (bit7 === 1 && bit6 === 1) {\n throw new Error('Old style compression not supported');\n }\n\n this.formatId = formatId & 0x3f;\n this.isCompressed = bit7 === 1 || bit6 === 1;\n }\n\n /**\n * Determines version\n * @returns version\n */\n determineVersion(): number {\n const ver = new Int8Array(this.arraybuffer, 24, 2);\n this.version = ver[0] * 10 + ver[1];\n this.versionAsString = `${ver[0]}.${ver[1]}`;\n return this.version;\n }\n\n /**\n * Reads if the file is open\n * @returns boolean\n */\n open(): void {\n if (this.loader.open()) {\n this.isOpen = true;\n }\n }\n /**\n * Gets the header\n * @returns Header\n */\n getHeader(): LASHeader {\n return this.loader.getHeader();\n }\n\n /**\n * @param count\n * @param start\n * @param skip\n * @returns Data\n */\n readData(count: number, start: number, skip: number): LASData {\n return this.loader.readData(count, start, skip);\n }\n\n /**\n * Closes the file\n */\n close(): void {\n if (this.loader.close()) {\n this.isOpen = false;\n }\n }\n /**\n */\n getUnpacker(): typeof LASDecoder {\n return LASDecoder;\n }\n}\n\nexport const LASModuleWasLoaded = false;\n\n/* eslint no-use-before-define: 2 */\n"],"file":"laslaz-decoder.js"}
1
+ {"version":3,"file":"laslaz-decoder.js","names":["getModule","Module","POINT_FORMAT_READERS","dv","position","getInt32","intensity","getUint16","classification","getUint8","color","readAs","buf","Type","offset","count","undefined","sub","slice","BYTES_PER_ELEMENT","r","ret","i","push","parseLASHeader","arraybuffer","start","o","pointsOffset","Uint32Array","pointsFormatId","Uint8Array","pointsStructSize","Uint16Array","pointsCount","scale","Float64Array","bounds","maxs","mins","LASLoader","constructor","totalToRead","totalRead","versionAsString","isCompressed","open","getHeader","header","readData","skip","Error","readOffset","Math","min","end","buffer","hasMoreData","pointsToRead","bufferSize","ceil","pointsRead","src","set","close","LAZLoader","instance","LASZip","abInt","_malloc","byteLength","HEAPU8","error","message","thisBuf","bufRead","getPoint","a","delete","LASDecoder","len","arrayb","decoder","pointSize","index","DataView","LASFile","determineVersion","determineFormat","formatId","loader","bit7","bit6","ver","Int8Array","version","isOpen","getUnpacker","LASModuleWasLoaded"],"sources":["../../../src/lib/laslaz-decoder.ts"],"sourcesContent":["/*\n Modified from Uday Verma and Howard Butler's plasio\n https://github.com/verma/plasio/\n MIT License\n*/\n// laslaz.js - treat as compiled code\nimport type {LASHeader} from './las-types';\nimport getModule from './libs/laz-perf';\n\nlet Module: any = null;\n\ntype LASReader = (dv: DataView) => {\n [LASAttribute: string]: number | number[];\n};\n\ntype LASReaders = {\n [key: number]: LASReader;\n};\n\ntype LASData = {\n buffer: ArrayBuffer;\n count: number;\n hasMoreData: boolean;\n};\n\nconst POINT_FORMAT_READERS: LASReaders = {\n 0: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15)\n };\n },\n 1: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15)\n };\n },\n 2: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15),\n color: [dv.getUint16(20, true), dv.getUint16(22, true), dv.getUint16(24, true)]\n };\n },\n 3: (dv) => {\n return {\n position: [dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n intensity: dv.getUint16(12, true),\n classification: dv.getUint8(15),\n color: [dv.getUint16(28, true), dv.getUint16(30, true), dv.getUint16(32, true)]\n };\n }\n};\n\n/**\n * Reads incoming binary data depends on the Type parameter\n * @param buf\n * @param Type\n * @param offset\n * @param count\n * @returns number | number[] from incoming binary data\n */\nfunction readAs(buf: ArrayBuffer, Type: any = {}, offset: number, count?: number) {\n count = count === undefined || count === 0 ? 1 : count;\n const sub = buf.slice(offset, offset + Type.BYTES_PER_ELEMENT * count);\n\n const r = new Type(sub);\n if (count === 1) {\n return r[0];\n }\n\n const ret: number[] = [];\n for (let i = 0; i < count; i++) {\n ret.push(r[i]);\n }\n\n return ret;\n}\n\n/**\n * Parsing of header's attributes\n * @param arraybuffer\n * @returns header as LASHeader\n */\nfunction parseLASHeader(arraybuffer: ArrayBuffer): LASHeader {\n let start = 32 * 3 + 35;\n\n const o: Partial<LASHeader> = {\n pointsOffset: readAs(arraybuffer, Uint32Array, 32 * 3),\n pointsFormatId: readAs(arraybuffer, Uint8Array, 32 * 3 + 8),\n pointsStructSize: readAs(arraybuffer, Uint16Array, 32 * 3 + 8 + 1),\n pointsCount: readAs(arraybuffer, Uint32Array, 32 * 3 + 11),\n scale: readAs(arraybuffer, Float64Array, start, 3)\n };\n start += 24; // 8*3\n o.offset = readAs(arraybuffer, Float64Array, start, 3);\n start += 24;\n\n const bounds = readAs(arraybuffer, Float64Array, start, 6);\n start += 48; // 8*6;\n o.maxs = [bounds[0], bounds[2], bounds[4]];\n o.mins = [bounds[1], bounds[3], bounds[5]];\n\n return o as LASHeader;\n}\n\n// LAS Loader\n// Loads uncompressed files\n//\nclass LASLoader {\n arraybuffer: ArrayBuffer;\n readOffset: number = 0;\n header: LASHeader = {\n pointsOffset: 0,\n pointsFormatId: 0,\n pointsStructSize: 0,\n pointsCount: 0,\n scale: [0, 0, 0],\n offset: [0, 0, 0],\n maxs: [0],\n mins: [0],\n totalToRead: 0,\n totalRead: 0,\n versionAsString: '',\n isCompressed: true\n };\n\n constructor(arraybuffer: ArrayBuffer) {\n this.arraybuffer = arraybuffer;\n }\n\n /**\n * @returns boolean\n */\n open() {\n // Nothing needs to be done to open this\n return true;\n }\n /**\n * Parsing of incoming binary\n * @returns LASHeader\n */\n getHeader() {\n this.header = parseLASHeader(this.arraybuffer);\n return this.header;\n }\n\n /**\n * Reading data\n * @param count\n * @param skip\n * @returns new ArrayBuffer, count, hasMoreData\n */\n readData(count: number, skip: number) {\n const {header, arraybuffer} = this;\n if (!header) {\n throw new Error('Cannot start reading data till a header request is issued');\n }\n\n let {readOffset} = this;\n let start: number;\n\n if (skip <= 1) {\n count = Math.min(count, header.pointsCount - readOffset);\n start = header.pointsOffset + readOffset * header.pointsStructSize;\n const end = start + count * header.pointsStructSize;\n readOffset += count;\n this.readOffset = readOffset;\n return {\n buffer: arraybuffer.slice(start, end),\n count,\n hasMoreData: readOffset < header.pointsCount\n };\n }\n\n const pointsToRead = Math.min(count * skip, header.pointsCount - readOffset);\n const bufferSize = Math.ceil(pointsToRead / skip);\n let pointsRead = 0;\n\n const buf = new Uint8Array(bufferSize * header.pointsStructSize);\n for (let i = 0; i < pointsToRead; i++) {\n if (i % skip === 0) {\n start = header.pointsOffset + readOffset * header.pointsStructSize;\n const src = new Uint8Array(arraybuffer, start, header.pointsStructSize);\n\n buf.set(src, pointsRead * header.pointsStructSize);\n pointsRead++;\n }\n\n readOffset++;\n }\n this.readOffset = readOffset;\n\n return {\n buffer: buf.buffer,\n count: pointsRead,\n hasMoreData: readOffset < header.pointsCount\n };\n }\n /**\n * Method which brings data to null to close the file\n * @returns\n */\n close() {\n // @ts-ignore Possibly null\n this.arraybuffer = null;\n return true;\n }\n}\n\n/**\n * LAZ Loader\n * Uses NaCL module to load LAZ files\n */\nclass LAZLoader {\n arraybuffer: ArrayBuffer;\n instance: any = null; // LASZip instance\n header: LASHeader | null = null;\n\n constructor(arraybuffer: ArrayBuffer) {\n this.arraybuffer = arraybuffer;\n\n if (!Module) {\n // Avoid executing laz-perf on import\n Module = getModule();\n }\n }\n\n /**\n * Opens the file\n * @returns boolean\n */\n open(): boolean {\n try {\n const {arraybuffer} = this;\n this.instance = new Module.LASZip();\n const abInt = new Uint8Array(arraybuffer);\n const buf = Module._malloc(arraybuffer.byteLength);\n\n this.instance.arraybuffer = arraybuffer;\n this.instance.buf = buf;\n Module.HEAPU8.set(abInt, buf);\n this.instance.open(buf, arraybuffer.byteLength);\n\n this.instance.readOffset = 0;\n\n return true;\n } catch (error) {\n throw new Error(`Failed to open file: ${(error as Error).message}`);\n }\n }\n\n getHeader(): LASHeader {\n if (!this.instance) {\n throw new Error('You need to open the file before trying to read header');\n }\n\n try {\n const header = parseLASHeader(this.instance.arraybuffer);\n header.pointsFormatId &= 0x3f;\n this.header = header;\n return header;\n } catch (error) {\n throw new Error(`Failed to get header: ${(error as Error).message}`);\n }\n }\n /**\n * @param count\n * @param offset\n * @param skip\n * @returns Data\n */\n readData(count: number, offset: number, skip: number): LASData {\n if (!this.instance) {\n throw new Error('You need to open the file before trying to read stuff');\n }\n\n const {header, instance} = this;\n\n if (!header) {\n throw new Error(\n 'You need to query header before reading, I maintain state that way, sorry :('\n );\n }\n\n try {\n const pointsToRead = Math.min(count * skip, header.pointsCount - instance.readOffset);\n const bufferSize = Math.ceil(pointsToRead / skip);\n let pointsRead = 0;\n\n const thisBuf = new Uint8Array(bufferSize * header.pointsStructSize);\n const bufRead = Module._malloc(header.pointsStructSize);\n for (let i = 0; i < pointsToRead; i++) {\n instance.getPoint(bufRead);\n\n if (i % skip === 0) {\n const a = new Uint8Array(Module.HEAPU8.buffer, bufRead, header.pointsStructSize);\n thisBuf.set(a, pointsRead * header.pointsStructSize);\n pointsRead++;\n }\n\n instance.readOffset++;\n }\n\n return {\n buffer: thisBuf.buffer,\n count: pointsRead,\n hasMoreData: instance.readOffset < header.pointsCount\n };\n } catch (error) {\n throw new Error(`Failed to read data: ${(error as Error).message}`);\n }\n }\n\n /**\n * Deletes the instance\n * @returns boolean\n */\n close(): boolean {\n try {\n if (this.instance !== null) {\n this.instance.delete();\n this.instance = null;\n }\n return true;\n } catch (error) {\n throw new Error(`Failed to close file: ${(error as Error).message}`);\n }\n }\n}\n\n/**\n * Helper class: Decodes LAS records into points\n */\nclass LASDecoder {\n arrayb: ArrayBuffer;\n decoder: (dv: DataView) => {};\n pointsCount: number;\n pointSize: number;\n scale: [number, number, number];\n offset?: [number, number, number];\n mins?: number[];\n maxs?: number[];\n\n constructor(buffer: ArrayBuffer, len: number, header: LASHeader) {\n this.arrayb = buffer;\n this.decoder = POINT_FORMAT_READERS[header.pointsFormatId];\n this.pointsCount = len;\n this.pointSize = header.pointsStructSize;\n this.scale = header.scale;\n this.offset = header.offset;\n this.mins = header.mins;\n this.maxs = header.maxs;\n }\n\n /**\n * Decodes data depends on this point size\n * @param index\n * @returns New object\n */\n getPoint(index: number): {} {\n if (index < 0 || index >= this.pointsCount) {\n throw new Error('Point index out of range');\n }\n\n const dv = new DataView(this.arrayb, index * this.pointSize, this.pointSize);\n return this.decoder(dv);\n }\n}\n\n/**\n * A single consistent interface for loading LAS/LAZ files\n */\nexport class LASFile {\n arraybuffer: ArrayBuffer;\n formatId: number = 0;\n loader: LASLoader | LAZLoader;\n isCompressed: boolean = true;\n isOpen: boolean = false;\n version: number = 0;\n versionAsString: string = '';\n\n constructor(arraybuffer: ArrayBuffer) {\n this.arraybuffer = arraybuffer;\n\n if (this.determineVersion() > 13) {\n throw new Error('Only file versions <= 1.3 are supported at this time');\n }\n\n this.determineFormat();\n if (POINT_FORMAT_READERS[this.formatId] === undefined) {\n throw new Error('The point format ID is not supported');\n }\n\n this.loader = this.isCompressed\n ? new LAZLoader(this.arraybuffer)\n : new LASLoader(this.arraybuffer);\n }\n\n /**\n * Determines format in parameters of LASHeaer\n */\n determineFormat(): void {\n const formatId = readAs(this.arraybuffer, Uint8Array, 32 * 3 + 8);\n const bit7 = (formatId & 0x80) >> 7;\n const bit6 = (formatId & 0x40) >> 6;\n\n if (bit7 === 1 && bit6 === 1) {\n throw new Error('Old style compression not supported');\n }\n\n this.formatId = formatId & 0x3f;\n this.isCompressed = bit7 === 1 || bit6 === 1;\n }\n\n /**\n * Determines version\n * @returns version\n */\n determineVersion(): number {\n const ver = new Int8Array(this.arraybuffer, 24, 2);\n this.version = ver[0] * 10 + ver[1];\n this.versionAsString = `${ver[0]}.${ver[1]}`;\n return this.version;\n }\n\n /**\n * Reads if the file is open\n * @returns boolean\n */\n open(): void {\n if (this.loader.open()) {\n this.isOpen = true;\n }\n }\n /**\n * Gets the header\n * @returns Header\n */\n getHeader(): LASHeader {\n return this.loader.getHeader();\n }\n\n /**\n * @param count\n * @param start\n * @param skip\n * @returns Data\n */\n readData(count: number, start: number, skip: number): LASData {\n return this.loader.readData(count, start, skip);\n }\n\n /**\n * Closes the file\n */\n close(): void {\n if (this.loader.close()) {\n this.isOpen = false;\n }\n }\n /**\n */\n getUnpacker(): typeof LASDecoder {\n return LASDecoder;\n }\n}\n\nexport const LASModuleWasLoaded = false;\n\n/* eslint no-use-before-define: 2 */\n"],"mappings":"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"}