@loaders.gl/las 4.2.0-alpha.4 → 4.2.0-alpha.6

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,5 +1,5 @@
1
- import type { LASLoaderOptions } from '../las-loader';
2
- import type { LASMesh } from './las-types';
1
+ import type { LASLoaderOptions } from "../las-loader.js";
2
+ import type { LASMesh } from "./las-types.js";
3
3
  /**
4
4
  * Parsing of .las file
5
5
  * @param arrayBuffer
@@ -1 +1 @@
1
- {"version":3,"file":"parse-las.d.ts","sourceRoot":"","sources":["../../src/lib/parse-las.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAC,OAAO,EAAY,MAAM,aAAa,CAAC;AAapD;;;;;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,CAwC/F"}
1
+ {"version":3,"file":"parse-las.d.ts","sourceRoot":"","sources":["../../src/lib/parse-las.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,gBAAgB,EAAC,yBAAsB;AACpD,OAAO,KAAK,EAAC,OAAO,EAAY,uBAAoB;AAapD;;;;;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,CAwC/F"}
@@ -1,174 +1,186 @@
1
- import { getMeshBoundingBox } from '@loaders.gl/schema';
1
+ import { getMeshBoundingBox /* , convertMesh */ } from '@loaders.gl/schema';
2
2
  import { LASFile } from "./laslaz-decoder.js";
3
3
  import { getLASSchema } from "./get-las-schema.js";
4
+ /**
5
+ * Parsing of .las file
6
+ * @param arrayBuffer
7
+ * @param options
8
+ * @returns LASHeader
9
+ */
4
10
  export function parseLAS(arrayBuffer, options) {
5
- return parseLASMesh(arrayBuffer, options);
11
+ return parseLASMesh(arrayBuffer, options);
12
+ // This code breaks pointcloud example on the website
13
+ // const mesh = parseLASMesh(arrayBuffer, options);
14
+ // return convertMesh(mesh, options?.las?.shape || 'mesh') as LASMesh | ArrowTable | ColumnarTable;
6
15
  }
7
- function parseLASMesh(arrayBuffer) {
8
- var _options$las;
9
- let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
10
- let pointIndex = 0;
11
- let positions;
12
- let colors;
13
- let intensities;
14
- let classifications;
15
- let originalHeader;
16
- const lasMesh = {
17
- loader: 'las',
18
- loaderData: {},
19
- schema: {
20
- fields: [],
21
- metadata: {}
22
- },
23
- header: {
24
- vertexCount: 0,
25
- boundingBox: [[0, 0, 0], [0, 0, 0]]
26
- },
27
- attributes: {},
28
- topology: 'point-list',
29
- mode: 0
30
- };
31
- parseLASChunked(arrayBuffer, (_options$las = options.las) === null || _options$las === void 0 ? void 0 : _options$las.skip, function () {
32
- var _options$las3, _options$onProgress;
33
- let decoder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
34
- let lasHeader = arguments.length > 1 ? arguments[1] : undefined;
35
- if (!originalHeader) {
36
- var _options$las2;
37
- originalHeader = lasHeader;
38
- const total = lasHeader.totalToRead;
39
- const PositionsType = (_options$las2 = options.las) !== null && _options$las2 !== void 0 && _options$las2.fp64 ? Float64Array : Float32Array;
40
- positions = new PositionsType(total * 3);
41
- colors = lasHeader.pointsFormatId >= 2 ? new Uint8Array(total * 4) : null;
42
- intensities = new Uint16Array(total);
43
- classifications = new Uint8Array(total);
44
- lasMesh.loaderData = lasHeader;
45
- lasMesh.attributes = {
46
- POSITION: {
47
- value: positions,
48
- size: 3
16
+ /**
17
+ * Parsing of .las file
18
+ * @param arrayBuffer
19
+ * @param options
20
+ * @returns LASHeader
21
+ */
22
+ function parseLASMesh(arrayBuffer, options = {}) {
23
+ let pointIndex = 0;
24
+ let positions;
25
+ let colors;
26
+ let intensities;
27
+ let classifications;
28
+ let originalHeader;
29
+ const lasMesh = {
30
+ loader: 'las',
31
+ loaderData: {},
32
+ // shape: 'mesh',
33
+ schema: { fields: [], metadata: {} },
34
+ header: {
35
+ vertexCount: 0,
36
+ boundingBox: [
37
+ [0, 0, 0],
38
+ [0, 0, 0]
39
+ ]
49
40
  },
50
- intensity: {
51
- value: intensities,
52
- size: 1
53
- },
54
- classification: {
55
- value: classifications,
56
- size: 1
41
+ attributes: {},
42
+ topology: 'point-list',
43
+ mode: 0 // GL.POINTS
44
+ };
45
+ /* eslint-disable max-statements */
46
+ // @ts-ignore Possibly undefined
47
+ parseLASChunked(arrayBuffer, options.las?.skip, (decoder = {}, lasHeader) => {
48
+ if (!originalHeader) {
49
+ originalHeader = lasHeader;
50
+ const total = lasHeader.totalToRead;
51
+ const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;
52
+ positions = new PositionsType(total * 3);
53
+ // laslaz-decoder.js `pointFormatReaders`
54
+ colors = lasHeader.pointsFormatId >= 2 ? new Uint8Array(total * 4) : null;
55
+ intensities = new Uint16Array(total);
56
+ classifications = new Uint8Array(total);
57
+ lasMesh.loaderData = lasHeader;
58
+ lasMesh.attributes = {
59
+ POSITION: { value: positions, size: 3 },
60
+ // non-gltf attributes, use non-capitalized names for now
61
+ intensity: { value: intensities, size: 1 },
62
+ classification: { value: classifications, size: 1 }
63
+ };
64
+ if (colors) {
65
+ lasMesh.attributes.COLOR_0 = { value: colors, size: 4 };
66
+ }
67
+ }
68
+ const batchSize = decoder.pointsCount;
69
+ const { scale: [scaleX, scaleY, scaleZ], offset: [offsetX, offsetY, offsetZ] } = lasHeader;
70
+ const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);
71
+ for (let i = 0; i < batchSize; i++) {
72
+ const { position, color, intensity, classification } = decoder.getPoint(i);
73
+ positions[pointIndex * 3] = position[0] * scaleX + offsetX;
74
+ positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
75
+ positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
76
+ if (color && colors) {
77
+ if (twoByteColor) {
78
+ colors[pointIndex * 4] = color[0] / 256;
79
+ colors[pointIndex * 4 + 1] = color[1] / 256;
80
+ colors[pointIndex * 4 + 2] = color[2] / 256;
81
+ }
82
+ else {
83
+ colors[pointIndex * 4] = color[0];
84
+ colors[pointIndex * 4 + 1] = color[1];
85
+ colors[pointIndex * 4 + 2] = color[2];
86
+ }
87
+ colors[pointIndex * 4 + 3] = 255;
88
+ }
89
+ intensities[pointIndex] = intensity;
90
+ classifications[pointIndex] = classification;
91
+ pointIndex++;
57
92
  }
58
- };
59
- if (colors) {
60
- lasMesh.attributes.COLOR_0 = {
61
- value: colors,
62
- size: 4
93
+ const meshBatch = {
94
+ ...lasMesh,
95
+ header: {
96
+ vertexCount: lasHeader.totalRead
97
+ },
98
+ progress: lasHeader.totalRead / lasHeader.totalToRead
63
99
  };
64
- }
100
+ options?.onProgress?.(meshBatch);
101
+ });
102
+ /* eslint-enable max-statements */
103
+ lasMesh.header = {
104
+ vertexCount: originalHeader.totalToRead,
105
+ boundingBox: getMeshBoundingBox(lasMesh?.attributes || {})
106
+ };
107
+ if (lasMesh) {
108
+ lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);
65
109
  }
66
- const batchSize = decoder.pointsCount;
67
- const {
68
- scale: [scaleX, scaleY, scaleZ],
69
- offset: [offsetX, offsetY, offsetZ]
70
- } = lasHeader;
71
- const twoByteColor = detectTwoByteColors(decoder, batchSize, (_options$las3 = options.las) === null || _options$las3 === void 0 ? void 0 : _options$las3.colorDepth);
72
- for (let i = 0; i < batchSize; i++) {
73
- const {
74
- position,
75
- color,
76
- intensity,
77
- classification
78
- } = decoder.getPoint(i);
79
- positions[pointIndex * 3] = position[0] * scaleX + offsetX;
80
- positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
81
- positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
82
- if (color && colors) {
83
- if (twoByteColor) {
84
- colors[pointIndex * 4] = color[0] / 256;
85
- colors[pointIndex * 4 + 1] = color[1] / 256;
86
- colors[pointIndex * 4 + 2] = color[2] / 256;
87
- } else {
88
- colors[pointIndex * 4] = color[0];
89
- colors[pointIndex * 4 + 1] = color[1];
90
- colors[pointIndex * 4 + 2] = color[2];
110
+ return lasMesh;
111
+ }
112
+ /**
113
+ * parse laz data
114
+ * @param rawData
115
+ * @param skip
116
+ * @param onParseData
117
+ * @return parsed point cloud
118
+ */
119
+ /* eslint-enable max-statements */
120
+ export function parseLASChunked(rawData, skip, onParseData = {}) {
121
+ const dataHandler = new LASFile(rawData);
122
+ try {
123
+ // open data
124
+ dataHandler.open();
125
+ const header = dataHandler.getHeader();
126
+ // start loading
127
+ const Unpacker = dataHandler.getUnpacker();
128
+ const totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));
129
+ header.totalToRead = totalToRead;
130
+ let totalRead = 0;
131
+ /* eslint-disable no-constant-condition */
132
+ while (true) {
133
+ const chunk = dataHandler.readData(1000 * 100, 0, skip);
134
+ totalRead += chunk.count;
135
+ header.totalRead = totalRead;
136
+ header.versionAsString = chunk.versionAsString;
137
+ header.isCompressed = chunk.isCompressed;
138
+ const unpacker = new Unpacker(chunk.buffer, chunk.count, header);
139
+ // surface unpacker and progress via call back
140
+ // use unpacker.pointsCount and unpacker.getPoint(i) to handle data in app
141
+ onParseData(unpacker, header);
142
+ if (!chunk.hasMoreData || totalRead >= totalToRead) {
143
+ break;
144
+ }
91
145
  }
92
- colors[pointIndex * 4 + 3] = 255;
93
- }
94
- intensities[pointIndex] = intensity;
95
- classifications[pointIndex] = classification;
96
- pointIndex++;
97
146
  }
98
- const meshBatch = {
99
- ...lasMesh,
100
- header: {
101
- vertexCount: lasHeader.totalRead
102
- },
103
- progress: lasHeader.totalRead / lasHeader.totalToRead
104
- };
105
- options === null || options === void 0 ? void 0 : (_options$onProgress = options.onProgress) === null || _options$onProgress === void 0 ? void 0 : _options$onProgress.call(options, meshBatch);
106
- });
107
- lasMesh.header = {
108
- vertexCount: originalHeader.totalToRead,
109
- boundingBox: getMeshBoundingBox((lasMesh === null || lasMesh === void 0 ? void 0 : lasMesh.attributes) || {})
110
- };
111
- if (lasMesh) {
112
- lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);
113
- }
114
- return lasMesh;
115
- }
116
- export function parseLASChunked(rawData, skip) {
117
- let onParseData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
118
- const dataHandler = new LASFile(rawData);
119
- try {
120
- dataHandler.open();
121
- const header = dataHandler.getHeader();
122
- const Unpacker = dataHandler.getUnpacker();
123
- const totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));
124
- header.totalToRead = totalToRead;
125
- let totalRead = 0;
126
- while (true) {
127
- const chunk = dataHandler.readData(1000 * 100, 0, skip);
128
- totalRead += chunk.count;
129
- header.totalRead = totalRead;
130
- header.versionAsString = chunk.versionAsString;
131
- header.isCompressed = chunk.isCompressed;
132
- const unpacker = new Unpacker(chunk.buffer, chunk.count, header);
133
- onParseData(unpacker, header);
134
- if (!chunk.hasMoreData || totalRead >= totalToRead) {
135
- break;
136
- }
147
+ catch (e) {
148
+ throw e;
149
+ }
150
+ finally {
151
+ dataHandler.close();
137
152
  }
138
- } catch (e) {
139
- throw e;
140
- } finally {
141
- dataHandler.close();
142
- }
143
153
  }
144
- function detectTwoByteColors() {
145
- let decoder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
146
- let batchSize = arguments.length > 1 ? arguments[1] : undefined;
147
- let colorDepth = arguments.length > 2 ? arguments[2] : undefined;
148
- let twoByteColor = false;
149
- switch (colorDepth) {
150
- case 8:
151
- twoByteColor = false;
152
- break;
153
- case 16:
154
- twoByteColor = true;
155
- break;
156
- case 'auto':
157
- if (decoder.getPoint(0).color) {
158
- for (let i = 0; i < batchSize; i++) {
159
- const {
160
- color
161
- } = decoder.getPoint(i);
162
- if (color[0] > 255 || color[1] > 255 || color[2] > 255) {
154
+ /**
155
+ * @param decoder
156
+ * @param batchSize
157
+ * @param colorDepth
158
+ * @returns boolean
159
+ */
160
+ function detectTwoByteColors(decoder = {}, batchSize, colorDepth) {
161
+ let twoByteColor = false;
162
+ switch (colorDepth) {
163
+ case 8:
164
+ twoByteColor = false;
165
+ break;
166
+ case 16:
163
167
  twoByteColor = true;
164
- }
165
- }
166
- }
167
- break;
168
- default:
169
- console.warn('las: illegal value for options.las.colorDepth');
170
- break;
171
- }
172
- return twoByteColor;
168
+ break;
169
+ case 'auto':
170
+ if (decoder.getPoint(0).color) {
171
+ for (let i = 0; i < batchSize; i++) {
172
+ const { color } = decoder.getPoint(i);
173
+ // eslint-disable-next-line max-depth
174
+ if (color[0] > 255 || color[1] > 255 || color[2] > 255) {
175
+ twoByteColor = true;
176
+ }
177
+ }
178
+ }
179
+ break;
180
+ default:
181
+ // eslint-disable-next-line
182
+ console.warn('las: illegal value for options.las.colorDepth');
183
+ break;
184
+ }
185
+ return twoByteColor;
173
186
  }
174
- //# sourceMappingURL=parse-las.js.map
@@ -1,4 +1,3 @@
1
1
  import { createLoaderWorker } from '@loaders.gl/loader-utils';
2
2
  import { LASLoader } from "../index.js";
3
3
  createLoaderWorker(LASLoader);
4
- //# sourceMappingURL=las-worker.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/las",
3
- "version": "4.2.0-alpha.4",
3
+ "version": "4.2.0-alpha.6",
4
4
  "description": "Framework-independent loader for the LAS and LAZ formats",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -32,10 +32,10 @@
32
32
  },
33
33
  "sideEffects": false,
34
34
  "browser": {
35
+ "crypto": false,
35
36
  "fs": false,
36
37
  "path": false,
37
- "ws": false,
38
- "crypto": false
38
+ "ws": false
39
39
  },
40
40
  "files": [
41
41
  "src",
@@ -43,15 +43,18 @@
43
43
  "README.md"
44
44
  ],
45
45
  "scripts": {
46
- "pre-build": "npm run build-bundle && npm run build-bundle -- --env=dev && npm run build-worker",
47
- "build-bundle": "ocular-bundle ./src/index.ts",
46
+ "pre-build": "npm run build-bundle && npm run build-bundle-dev && npm run build-worker",
47
+ "build-bundle": "ocular-bundle ./bundle.ts --output=dist/dist.min.js",
48
+ "build-bundle-dev": "ocular-bundle ./bundle.ts --env=dev --output=dist/dist.dev.js",
48
49
  "build-worker": "esbuild src/workers/las-worker.ts --bundle --outfile=dist/las-worker.js --define:__VERSION__=\\\"$npm_package_version\\\""
49
50
  },
50
51
  "dependencies": {
51
- "@babel/runtime": "^7.3.1",
52
- "@loaders.gl/loader-utils": "4.2.0-alpha.4",
53
- "@loaders.gl/schema": "4.2.0-alpha.4",
52
+ "@loaders.gl/loader-utils": "4.2.0-alpha.6",
53
+ "@loaders.gl/schema": "4.2.0-alpha.6",
54
54
  "laz-perf": "^0.0.6"
55
55
  },
56
- "gitHead": "6c52dee5c3f005648a394cc4aee7fc37005c8e83"
56
+ "peerDependencies": {
57
+ "@loaders.gl/core": "^4.0.0"
58
+ },
59
+ "gitHead": "37bd8ca71763529f18727ee4bf29dd176aa914ca"
57
60
  }
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["LASLoader","LASWorkerLoader","parseLAS","parse","arrayBuffer","options","parseSync"],"sources":["../src/index.ts"],"sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {LASLoaderOptions} from './las-loader';\nimport type {LASMesh} from './lib/las-types';\nimport {LASLoader as LASWorkerLoader} from './las-loader';\nimport {parseLAS} from './lib/parse-las';\n\n// LASLoader\n\nexport type {LASLoaderOptions};\nexport {LASWorkerLoader};\n\n/**\n * Loader for the LAS (LASer) point cloud format\n * @note Does not support LAS v1.4\n */\nexport const LASLoader: LoaderWithParser<LASMesh, never, LASLoaderOptions> = {\n ...LASWorkerLoader,\n parse: async (arrayBuffer: ArrayBuffer, options?: LASLoaderOptions) =>\n parseLAS(arrayBuffer, options),\n parseSync: (arrayBuffer: ArrayBuffer, options?: LASLoaderOptions) =>\n parseLAS(arrayBuffer, options)\n};\n"],"mappings":"SAGQA,SAAS,IAAIC,eAAe;AAAA,SAC5BC,QAAQ;AAKhB,SAAQD,eAAe;AAMvB,OAAO,MAAMD,SAA6D,GAAG;EAC3E,GAAGC,eAAe;EAClBE,KAAK,EAAE,MAAAA,CAAOC,WAAwB,EAAEC,OAA0B,KAChEH,QAAQ,CAACE,WAAW,EAAEC,OAAO,CAAC;EAChCC,SAAS,EAAEA,CAACF,WAAwB,EAAEC,OAA0B,KAC9DH,QAAQ,CAACE,WAAW,EAAEC,OAAO;AACjC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"las-loader.js","names":["VERSION","LASLoader","name","id","module","version","worker","extensions","mimeTypes","text","binary","tests","options","las","shape","fp64","skip","colorDepth"],"sources":["../src/las-loader.ts"],"sourcesContent":["// LASER (LAS) FILE FORMAT\nimport type {Loader, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {LASMesh} from './lib/las-types';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type LASLoaderOptions = LoaderOptions & {\n las?: {\n shape?: 'mesh' | 'columnar-table' | 'arrow-table';\n fp64?: boolean;\n skip?: number;\n colorDepth?: number | string;\n };\n onProgress?: Function;\n};\n\n/**\n * Loader for the LAS (LASer) point cloud format\n * @note Does not support LAS v1.4\n */\nexport const LASLoader: Loader<LASMesh, never, LASLoaderOptions> = {\n name: 'LAS',\n id: 'las',\n module: 'las',\n version: VERSION,\n worker: true,\n extensions: ['las', 'laz'], // LAZ is the \"compressed\" flavor of LAS,\n mimeTypes: ['application/octet-stream'], // TODO - text version?\n text: true,\n binary: true,\n tests: ['LAS'],\n options: {\n las: {\n shape: 'mesh',\n fp64: false,\n skip: 1,\n colorDepth: 8\n }\n }\n};\n"],"mappings":"AAMA,MAAMA,OAAO,GAAG,sBAAkB,KAAK,WAAW,qBAAiB,QAAQ;AAgB3E,OAAO,MAAMC,SAAmD,GAAG;EACjEC,IAAI,EAAE,KAAK;EACXC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,KAAK;EACbC,OAAO,EAAEL,OAAO;EAChBM,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;EAC1BC,SAAS,EAAE,CAAC,0BAA0B,CAAC;EACvCC,IAAI,EAAE,IAAI;EACVC,MAAM,EAAE,IAAI;EACZC,KAAK,EAAE,CAAC,KAAK,CAAC;EACdC,OAAO,EAAE;IACPC,GAAG,EAAE;MACHC,KAAK,EAAE,MAAM;MACbC,IAAI,EAAE,KAAK;MACXC,IAAI,EAAE,CAAC;MACPC,UAAU,EAAE;IACd;EACF;AACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-las-schema.js","names":["deduceMeshSchema","getLASSchema","lasHeader","attributes","metadataMap","makeMetadataFromLasHeader","schema","metadata","las_pointsOffset","pointsOffset","toString","las_pointsFormatId","pointsFormatId","las_pointsStructSize","pointsStructSize","las_pointsCount","pointsCount","las_scale","JSON","stringify","scale","las_offset","offset","maxs","undefined","las_maxs","mins","las_mins","las_totalToRead","totalToRead","las_pointsFortotalReadmatId","totalRead","versionAsString","las_versionAsString","isCompressed","las_isCompressed"],"sources":["../../src/lib/get-las-schema.ts"],"sourcesContent":["import {Schema, MeshAttributes, deduceMeshSchema} from '@loaders.gl/schema';\nimport type {LASHeader} from './las-types';\n\n/**\n * Gets schema from PLY header\n * @param lasHeader\n * @param metadata\n * @returns Schema\n */\nexport function getLASSchema(lasHeader: LASHeader, attributes: MeshAttributes): Schema {\n const metadataMap = makeMetadataFromLasHeader(lasHeader);\n const schema = deduceMeshSchema(attributes, metadataMap);\n return schema;\n}\n\n/**\n * Make arrow like schema metadata by LASHeader properties\n * @param lasHeader\n * @returns\n */\nexport function makeMetadataFromLasHeader(lasHeader: LASHeader): Record<string, string> {\n const metadata: Record<string, string> = {};\n /* eslint-disable camelcase */\n metadata.las_pointsOffset = lasHeader.pointsOffset.toString(10);\n metadata.las_pointsFormatId = lasHeader.pointsFormatId.toString(10);\n metadata.las_pointsStructSize = lasHeader.pointsStructSize.toString(10);\n metadata.las_pointsCount = lasHeader.pointsCount.toString(10);\n metadata.las_scale = JSON.stringify(lasHeader.scale);\n metadata.las_offset = JSON.stringify(lasHeader.offset);\n if (lasHeader.maxs !== undefined) {\n metadata.las_maxs = JSON.stringify(lasHeader.maxs);\n }\n if (lasHeader.mins !== undefined) {\n metadata.las_mins = JSON.stringify(lasHeader.mins);\n }\n metadata.las_totalToRead = lasHeader.totalToRead.toString(10);\n metadata.las_pointsFortotalReadmatId = lasHeader.totalRead.toString(10);\n if (lasHeader.versionAsString !== undefined) {\n metadata.las_versionAsString = lasHeader.versionAsString;\n }\n if (lasHeader.isCompressed !== undefined) {\n metadata.las_isCompressed = lasHeader.isCompressed.toString();\n }\n return metadata;\n}\n"],"mappings":"AAAA,SAAgCA,gBAAgB,QAAO,oBAAoB;AAS3E,OAAO,SAASC,YAAYA,CAACC,SAAoB,EAAEC,UAA0B,EAAU;EACrF,MAAMC,WAAW,GAAGC,yBAAyB,CAACH,SAAS,CAAC;EACxD,MAAMI,MAAM,GAAGN,gBAAgB,CAACG,UAAU,EAAEC,WAAW,CAAC;EACxD,OAAOE,MAAM;AACf;AAOA,OAAO,SAASD,yBAAyBA,CAACH,SAAoB,EAA0B;EACtF,MAAMK,QAAgC,GAAG,CAAC,CAAC;EAE3CA,QAAQ,CAACC,gBAAgB,GAAGN,SAAS,CAACO,YAAY,CAACC,QAAQ,CAAC,EAAE,CAAC;EAC/DH,QAAQ,CAACI,kBAAkB,GAAGT,SAAS,CAACU,cAAc,CAACF,QAAQ,CAAC,EAAE,CAAC;EACnEH,QAAQ,CAACM,oBAAoB,GAAGX,SAAS,CAACY,gBAAgB,CAACJ,QAAQ,CAAC,EAAE,CAAC;EACvEH,QAAQ,CAACQ,eAAe,GAAGb,SAAS,CAACc,WAAW,CAACN,QAAQ,CAAC,EAAE,CAAC;EAC7DH,QAAQ,CAACU,SAAS,GAAGC,IAAI,CAACC,SAAS,CAACjB,SAAS,CAACkB,KAAK,CAAC;EACpDb,QAAQ,CAACc,UAAU,GAAGH,IAAI,CAACC,SAAS,CAACjB,SAAS,CAACoB,MAAM,CAAC;EACtD,IAAIpB,SAAS,CAACqB,IAAI,KAAKC,SAAS,EAAE;IAChCjB,QAAQ,CAACkB,QAAQ,GAAGP,IAAI,CAACC,SAAS,CAACjB,SAAS,CAACqB,IAAI,CAAC;EACpD;EACA,IAAIrB,SAAS,CAACwB,IAAI,KAAKF,SAAS,EAAE;IAChCjB,QAAQ,CAACoB,QAAQ,GAAGT,IAAI,CAACC,SAAS,CAACjB,SAAS,CAACwB,IAAI,CAAC;EACpD;EACAnB,QAAQ,CAACqB,eAAe,GAAG1B,SAAS,CAAC2B,WAAW,CAACnB,QAAQ,CAAC,EAAE,CAAC;EAC7DH,QAAQ,CAACuB,2BAA2B,GAAG5B,SAAS,CAAC6B,SAAS,CAACrB,QAAQ,CAAC,EAAE,CAAC;EACvE,IAAIR,SAAS,CAAC8B,eAAe,KAAKR,SAAS,EAAE;IAC3CjB,QAAQ,CAAC0B,mBAAmB,GAAG/B,SAAS,CAAC8B,eAAe;EAC1D;EACA,IAAI9B,SAAS,CAACgC,YAAY,KAAKV,SAAS,EAAE;IACxCjB,QAAQ,CAAC4B,gBAAgB,GAAGjC,SAAS,CAACgC,YAAY,CAACxB,QAAQ,CAAC,CAAC;EAC/D;EACA,OAAOH,QAAQ;AACjB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"las-types.js","names":[],"sources":["../../src/lib/las-types.ts"],"sourcesContent":["import {Mesh} from '@loaders.gl/schema';\n\n/**\n * Type for header of the .las file\n */\nexport type LASHeader = {\n pointsOffset: number;\n pointsFormatId: number;\n pointsStructSize: number;\n pointsCount: number;\n scale: [number, number, number];\n offset: [number, number, number];\n maxs?: number[];\n mins?: number[];\n totalToRead: number;\n totalRead: number;\n versionAsString?: string;\n isCompressed?: boolean;\n};\n\n/**\n * loaders.gl Mesh with Draco specific data\n */\nexport type LASMesh = Mesh & {\n loader: 'las';\n loaderData: LASHeader; // Draco specific data\n topology: 'point-list';\n mode: 0;\n};\n"],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"laslaz-decoder.js","names":["getModule","Module","POINT_FORMAT_READERS","dv","position","getInt32","intensity","getUint16","classification","getUint8","color","readAs","buf","Type","arguments","length","undefined","offset","count","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","readOffset","header","totalToRead","totalRead","versionAsString","isCompressed","open","getHeader","readData","skip","Error","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","formatId","loader","isOpen","version","determineVersion","determineFormat","bit7","bit6","ver","Int8Array","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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"}