@loaders.gl/las 3.4.0-alpha.2 → 3.4.0-alpha.4

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,12 +1,9 @@
1
-
2
-
3
1
  import { Schema, getMeshBoundingBox } from '@loaders.gl/schema';
4
2
  import { LASFile } from './laslaz-decoder';
5
3
  import { getLASSchema } from './get-las-schema';
6
4
  export default function parseLAS(arrayBuffer, options) {
7
5
  return parseLASMesh(arrayBuffer, options);
8
6
  }
9
-
10
7
  function parseLASMesh(arrayBuffer) {
11
8
  var _options$las;
12
9
  let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -28,7 +25,6 @@ function parseLASMesh(arrayBuffer) {
28
25
  topology: 'point-list',
29
26
  mode: 0
30
27
  };
31
-
32
28
  parseLASChunked(arrayBuffer, (_options$las = options.las) === null || _options$las === void 0 ? void 0 : _options$las.skip, function () {
33
29
  var _options$las3, _options$onProgress;
34
30
  let decoder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -105,7 +101,6 @@ function parseLASMesh(arrayBuffer) {
105
101
  };
106
102
  options === null || options === void 0 ? void 0 : (_options$onProgress = options.onProgress) === null || _options$onProgress === void 0 ? void 0 : _options$onProgress.call(options, meshBatch);
107
103
  });
108
-
109
104
  lasMesh.header = {
110
105
  vertexCount: originalHeader.totalToRead,
111
106
  boundingBox: getMeshBoundingBox((lasMesh === null || lasMesh === void 0 ? void 0 : lasMesh.attributes) || {})
@@ -115,7 +110,6 @@ function parseLASMesh(arrayBuffer) {
115
110
  }
116
111
  return lasMesh;
117
112
  }
118
-
119
113
  export function parseLASChunked(rawData, skip) {
120
114
  let onParseData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
121
115
  const dataHandler = new LASFile(rawData);
@@ -126,7 +120,6 @@ export function parseLASChunked(rawData, skip) {
126
120
  const totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));
127
121
  header.totalToRead = totalToRead;
128
122
  let totalRead = 0;
129
-
130
123
  while (true) {
131
124
  const chunk = dataHandler.readData(1000 * 100, 0, skip);
132
125
  totalRead += chunk.count;
@@ -134,7 +127,6 @@ export function parseLASChunked(rawData, skip) {
134
127
  header.versionAsString = chunk.versionAsString;
135
128
  header.isCompressed = chunk.isCompressed;
136
129
  const unpacker = new Unpacker(chunk.buffer, chunk.count, header);
137
-
138
130
  onParseData(unpacker, header);
139
131
  if (!chunk.hasMoreData || totalRead >= totalToRead) {
140
132
  break;
@@ -146,7 +138,6 @@ export function parseLASChunked(rawData, skip) {
146
138
  dataHandler.close();
147
139
  }
148
140
  }
149
-
150
141
  function detectTwoByteColors() {
151
142
  let decoder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
152
143
  let batchSize = arguments.length > 1 ? arguments[1] : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"parse-las.js","names":["Schema","getMeshBoundingBox","LASFile","getLASSchema","parseLAS","arrayBuffer","options","parseLASMesh","pointIndex","positions","colors","intensities","classifications","originalHeader","lasMesh","loader","loaderData","schema","header","vertexCount","boundingBox","attributes","topology","mode","parseLASChunked","las","skip","decoder","lasHeader","total","totalToRead","PositionsType","fp64","Float64Array","Float32Array","pointsFormatId","Uint8Array","Uint16Array","POSITION","value","size","intensity","classification","COLOR_0","batchSize","pointsCount","scale","scaleX","scaleY","scaleZ","offset","offsetX","offsetY","offsetZ","twoByteColor","detectTwoByteColors","colorDepth","i","position","color","getPoint","meshBatch","totalRead","progress","onProgress","rawData","onParseData","dataHandler","open","getHeader","Unpacker","getUnpacker","Math","ceil","max","chunk","readData","count","versionAsString","isCompressed","unpacker","buffer","hasMoreData","e","close","console","warn"],"sources":["../../../src/lib/parse-las.ts"],"sourcesContent":["// ported and es6-ified from https://github.com/verma/plasio/\nimport type {ArrowTable, ColumnarTable} from '@loaders.gl/schema';\nimport type {LASLoaderOptions} from '../las-loader';\nimport type {LASMesh, LASHeader} from './las-types';\nimport {Schema, getMeshBoundingBox /* , convertMesh */} from '@loaders.gl/schema';\nimport {LASFile} from './laslaz-decoder';\nimport {getLASSchema} from './get-las-schema';\n\ntype LASChunk = {\n count: number;\n buffer: ArrayBuffer;\n hasMoreData: boolean;\n versionAsString?: string;\n isCompressed?: boolean;\n};\n\n/**\n * Parsing of .las file\n * @param arrayBuffer\n * @param options\n * @returns LASHeader\n */\nexport default function parseLAS(\n arrayBuffer: ArrayBuffer,\n options?: LASLoaderOptions\n): LASMesh | ArrowTable | ColumnarTable {\n return parseLASMesh(arrayBuffer, options);\n // This code breaks pointcloud example on the website\n // const mesh = parseLASMesh(arrayBuffer, options);\n // return convertMesh(mesh, options?.las?.shape || 'mesh') as LASMesh | ArrowTable | ColumnarTable;\n}\n\n/**\n * Parsing of .las file\n * @param arrayBuffer\n * @param options\n * @returns LASHeader\n */\nfunction parseLASMesh(arrayBuffer: ArrayBuffer, options: LASLoaderOptions = {}): LASMesh {\n let pointIndex: number = 0;\n\n let positions: Float32Array | Float64Array;\n let colors: Uint8Array | null;\n let intensities: Uint16Array;\n let classifications: Uint8Array;\n let originalHeader: any;\n\n const lasMesh: LASMesh = {\n loader: 'las',\n loaderData: {} as LASHeader,\n // shape: 'mesh',\n schema: new Schema([]),\n header: {\n vertexCount: 0,\n boundingBox: [\n [0, 0, 0],\n [0, 0, 0]\n ]\n },\n attributes: {},\n topology: 'point-list',\n mode: 0 // GL.POINTS\n };\n\n /* eslint-disable max-statements */\n // @ts-ignore Possibly undefined\n parseLASChunked(arrayBuffer, options.las?.skip, (decoder: any = {}, lasHeader: LASHeader) => {\n if (!originalHeader) {\n originalHeader = lasHeader;\n const total = lasHeader.totalToRead;\n\n const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;\n positions = new PositionsType(total * 3);\n // laslaz-decoder.js `pointFormatReaders`\n colors = lasHeader.pointsFormatId >= 2 ? new Uint8Array(total * 4) : null;\n intensities = new Uint16Array(total);\n classifications = new Uint8Array(total);\n\n lasMesh.loaderData = lasHeader;\n lasMesh.attributes = {\n POSITION: {value: positions, size: 3},\n // non-gltf attributes, use non-capitalized names for now\n intensity: {value: intensities, size: 1},\n classification: {value: classifications, size: 1}\n };\n\n if (colors) {\n lasMesh.attributes.COLOR_0 = {value: colors, size: 4};\n }\n }\n\n const batchSize = decoder.pointsCount;\n const {\n scale: [scaleX, scaleY, scaleZ],\n offset: [offsetX, offsetY, offsetZ]\n } = lasHeader;\n\n const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);\n\n for (let i = 0; i < batchSize; i++) {\n const {position, color, intensity, classification} = decoder.getPoint(i);\n\n positions[pointIndex * 3] = position[0] * scaleX + offsetX;\n positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;\n positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;\n\n if (color && colors) {\n if (twoByteColor) {\n colors[pointIndex * 4] = color[0] / 256;\n colors[pointIndex * 4 + 1] = color[1] / 256;\n colors[pointIndex * 4 + 2] = color[2] / 256;\n } else {\n colors[pointIndex * 4] = color[0];\n colors[pointIndex * 4 + 1] = color[1];\n colors[pointIndex * 4 + 2] = color[2];\n }\n colors[pointIndex * 4 + 3] = 255;\n }\n\n intensities[pointIndex] = intensity;\n classifications[pointIndex] = classification;\n\n pointIndex++;\n }\n\n const meshBatch = {\n ...lasMesh,\n header: {\n vertexCount: lasHeader.totalRead\n },\n progress: lasHeader.totalRead / lasHeader.totalToRead\n };\n\n options?.onProgress?.(meshBatch);\n });\n /* eslint-enable max-statements */\n\n lasMesh.header = {\n vertexCount: originalHeader.totalToRead,\n boundingBox: getMeshBoundingBox(lasMesh?.attributes || {})\n };\n\n if (lasMesh) {\n lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);\n }\n return lasMesh;\n}\n\n/**\n * parse laz data\n * @param rawData\n * @param skip\n * @param onParseData\n * @return parsed point cloud\n */\n/* eslint-enable max-statements */\nexport function parseLASChunked(rawData: ArrayBuffer, skip: number, onParseData: any = {}): void {\n const dataHandler = new LASFile(rawData);\n\n try {\n // open data\n dataHandler.open();\n\n const header = dataHandler.getHeader();\n // start loading\n const Unpacker = dataHandler.getUnpacker();\n\n const totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));\n header.totalToRead = totalToRead;\n let totalRead = 0;\n\n /* eslint-disable no-constant-condition */\n while (true) {\n const chunk: LASChunk = dataHandler.readData(1000 * 100, 0, skip);\n\n totalRead += chunk.count;\n\n header.totalRead = totalRead;\n header.versionAsString = chunk.versionAsString;\n header.isCompressed = chunk.isCompressed;\n\n const unpacker = new Unpacker(chunk.buffer, chunk.count, header);\n\n // surface unpacker and progress via call back\n // use unpacker.pointsCount and unpacker.getPoint(i) to handle data in app\n onParseData(unpacker, header);\n\n if (!chunk.hasMoreData || totalRead >= totalToRead) {\n break;\n }\n }\n } catch (e) {\n throw e;\n } finally {\n dataHandler.close();\n }\n}\n\n/**\n * @param decoder\n * @param batchSize\n * @param colorDepth\n * @returns boolean\n */\nfunction detectTwoByteColors(\n decoder: any = {},\n batchSize: number,\n colorDepth?: number | string\n): boolean {\n let twoByteColor = false;\n switch (colorDepth) {\n case 8:\n twoByteColor = false;\n break;\n case 16:\n twoByteColor = true;\n break;\n case 'auto':\n if (decoder.getPoint(0).color) {\n for (let i = 0; i < batchSize; i++) {\n const {color} = decoder.getPoint(i);\n // eslint-disable-next-line max-depth\n if (color[0] > 255 || color[1] > 255 || color[2] > 255) {\n twoByteColor = true;\n }\n }\n }\n break;\n default:\n // eslint-disable-next-line\n console.warn('las: illegal value for options.las.colorDepth');\n break;\n }\n return twoByteColor;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse-las.js","names":["Schema","getMeshBoundingBox","LASFile","getLASSchema","parseLAS","arrayBuffer","options","parseLASMesh","_options$las","arguments","length","undefined","pointIndex","positions","colors","intensities","classifications","originalHeader","lasMesh","loader","loaderData","schema","header","vertexCount","boundingBox","attributes","topology","mode","parseLASChunked","las","skip","_options$las3","_options$onProgress","decoder","lasHeader","_options$las2","total","totalToRead","PositionsType","fp64","Float64Array","Float32Array","pointsFormatId","Uint8Array","Uint16Array","POSITION","value","size","intensity","classification","COLOR_0","batchSize","pointsCount","scale","scaleX","scaleY","scaleZ","offset","offsetX","offsetY","offsetZ","twoByteColor","detectTwoByteColors","colorDepth","i","position","color","getPoint","meshBatch","totalRead","progress","onProgress","call","rawData","onParseData","dataHandler","open","getHeader","Unpacker","getUnpacker","Math","ceil","max","chunk","readData","count","versionAsString","isCompressed","unpacker","buffer","hasMoreData","e","close","console","warn"],"sources":["../../../src/lib/parse-las.ts"],"sourcesContent":["// ported and es6-ified from https://github.com/verma/plasio/\nimport type {ArrowTable, ColumnarTable} from '@loaders.gl/schema';\nimport type {LASLoaderOptions} from '../las-loader';\nimport type {LASMesh, LASHeader} from './las-types';\nimport {Schema, getMeshBoundingBox /* , convertMesh */} from '@loaders.gl/schema';\nimport {LASFile} from './laslaz-decoder';\nimport {getLASSchema} from './get-las-schema';\n\ntype LASChunk = {\n count: number;\n buffer: ArrayBuffer;\n hasMoreData: boolean;\n versionAsString?: string;\n isCompressed?: boolean;\n};\n\n/**\n * Parsing of .las file\n * @param arrayBuffer\n * @param options\n * @returns LASHeader\n */\nexport default function parseLAS(\n arrayBuffer: ArrayBuffer,\n options?: LASLoaderOptions\n): LASMesh | ArrowTable | ColumnarTable {\n return parseLASMesh(arrayBuffer, options);\n // This code breaks pointcloud example on the website\n // const mesh = parseLASMesh(arrayBuffer, options);\n // return convertMesh(mesh, options?.las?.shape || 'mesh') as LASMesh | ArrowTable | ColumnarTable;\n}\n\n/**\n * Parsing of .las file\n * @param arrayBuffer\n * @param options\n * @returns LASHeader\n */\nfunction parseLASMesh(arrayBuffer: ArrayBuffer, options: LASLoaderOptions = {}): LASMesh {\n let pointIndex: number = 0;\n\n let positions: Float32Array | Float64Array;\n let colors: Uint8Array | null;\n let intensities: Uint16Array;\n let classifications: Uint8Array;\n let originalHeader: any;\n\n const lasMesh: LASMesh = {\n loader: 'las',\n loaderData: {} as LASHeader,\n // shape: 'mesh',\n schema: new Schema([]),\n header: {\n vertexCount: 0,\n boundingBox: [\n [0, 0, 0],\n [0, 0, 0]\n ]\n },\n attributes: {},\n topology: 'point-list',\n mode: 0 // GL.POINTS\n };\n\n /* eslint-disable max-statements */\n // @ts-ignore Possibly undefined\n parseLASChunked(arrayBuffer, options.las?.skip, (decoder: any = {}, lasHeader: LASHeader) => {\n if (!originalHeader) {\n originalHeader = lasHeader;\n const total = lasHeader.totalToRead;\n\n const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;\n positions = new PositionsType(total * 3);\n // laslaz-decoder.js `pointFormatReaders`\n colors = lasHeader.pointsFormatId >= 2 ? new Uint8Array(total * 4) : null;\n intensities = new Uint16Array(total);\n classifications = new Uint8Array(total);\n\n lasMesh.loaderData = lasHeader;\n lasMesh.attributes = {\n POSITION: {value: positions, size: 3},\n // non-gltf attributes, use non-capitalized names for now\n intensity: {value: intensities, size: 1},\n classification: {value: classifications, size: 1}\n };\n\n if (colors) {\n lasMesh.attributes.COLOR_0 = {value: colors, size: 4};\n }\n }\n\n const batchSize = decoder.pointsCount;\n const {\n scale: [scaleX, scaleY, scaleZ],\n offset: [offsetX, offsetY, offsetZ]\n } = lasHeader;\n\n const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);\n\n for (let i = 0; i < batchSize; i++) {\n const {position, color, intensity, classification} = decoder.getPoint(i);\n\n positions[pointIndex * 3] = position[0] * scaleX + offsetX;\n positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;\n positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;\n\n if (color && colors) {\n if (twoByteColor) {\n colors[pointIndex * 4] = color[0] / 256;\n colors[pointIndex * 4 + 1] = color[1] / 256;\n colors[pointIndex * 4 + 2] = color[2] / 256;\n } else {\n colors[pointIndex * 4] = color[0];\n colors[pointIndex * 4 + 1] = color[1];\n colors[pointIndex * 4 + 2] = color[2];\n }\n colors[pointIndex * 4 + 3] = 255;\n }\n\n intensities[pointIndex] = intensity;\n classifications[pointIndex] = classification;\n\n pointIndex++;\n }\n\n const meshBatch = {\n ...lasMesh,\n header: {\n vertexCount: lasHeader.totalRead\n },\n progress: lasHeader.totalRead / lasHeader.totalToRead\n };\n\n options?.onProgress?.(meshBatch);\n });\n /* eslint-enable max-statements */\n\n lasMesh.header = {\n vertexCount: originalHeader.totalToRead,\n boundingBox: getMeshBoundingBox(lasMesh?.attributes || {})\n };\n\n if (lasMesh) {\n lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);\n }\n return lasMesh;\n}\n\n/**\n * parse laz data\n * @param rawData\n * @param skip\n * @param onParseData\n * @return parsed point cloud\n */\n/* eslint-enable max-statements */\nexport function parseLASChunked(rawData: ArrayBuffer, skip: number, onParseData: any = {}): void {\n const dataHandler = new LASFile(rawData);\n\n try {\n // open data\n dataHandler.open();\n\n const header = dataHandler.getHeader();\n // start loading\n const Unpacker = dataHandler.getUnpacker();\n\n const totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));\n header.totalToRead = totalToRead;\n let totalRead = 0;\n\n /* eslint-disable no-constant-condition */\n while (true) {\n const chunk: LASChunk = dataHandler.readData(1000 * 100, 0, skip);\n\n totalRead += chunk.count;\n\n header.totalRead = totalRead;\n header.versionAsString = chunk.versionAsString;\n header.isCompressed = chunk.isCompressed;\n\n const unpacker = new Unpacker(chunk.buffer, chunk.count, header);\n\n // surface unpacker and progress via call back\n // use unpacker.pointsCount and unpacker.getPoint(i) to handle data in app\n onParseData(unpacker, header);\n\n if (!chunk.hasMoreData || totalRead >= totalToRead) {\n break;\n }\n }\n } catch (e) {\n throw e;\n } finally {\n dataHandler.close();\n }\n}\n\n/**\n * @param decoder\n * @param batchSize\n * @param colorDepth\n * @returns boolean\n */\nfunction detectTwoByteColors(\n decoder: any = {},\n batchSize: number,\n colorDepth?: number | string\n): boolean {\n let twoByteColor = false;\n switch (colorDepth) {\n case 8:\n twoByteColor = false;\n break;\n case 16:\n twoByteColor = true;\n break;\n case 'auto':\n if (decoder.getPoint(0).color) {\n for (let i = 0; i < batchSize; i++) {\n const {color} = decoder.getPoint(i);\n // eslint-disable-next-line max-depth\n if (color[0] > 255 || color[1] > 255 || color[2] > 255) {\n twoByteColor = true;\n }\n }\n }\n break;\n default:\n // eslint-disable-next-line\n console.warn('las: illegal value for options.las.colorDepth');\n break;\n }\n return twoByteColor;\n}\n"],"mappings":"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"}
@@ -200,7 +200,7 @@
200
200
  }
201
201
 
202
202
  // src/las-loader.ts
203
- var VERSION = true ? "3.4.0-alpha.2" : "latest";
203
+ var VERSION = true ? "3.4.0-alpha.4" : "latest";
204
204
  var DEFAULT_LAS_OPTIONS = {
205
205
  las: {
206
206
  shape: "mesh",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/las",
3
- "version": "3.4.0-alpha.2",
3
+ "version": "3.4.0-alpha.4",
4
4
  "description": "Framework-independent loader for the LAS and LAZ formats",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -41,9 +41,9 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@babel/runtime": "^7.3.1",
44
- "@loaders.gl/loader-utils": "3.4.0-alpha.2",
45
- "@loaders.gl/schema": "3.4.0-alpha.2",
44
+ "@loaders.gl/loader-utils": "3.4.0-alpha.4",
45
+ "@loaders.gl/schema": "3.4.0-alpha.4",
46
46
  "apache-arrow": "^4.0.0"
47
47
  },
48
- "gitHead": "f1c00c124d8d0c41a138ff40afb0d1a00711bf2e"
48
+ "gitHead": "f039a523df8b908a91f26c5ba8c4cfc1924b6140"
49
49
  }