@loaders.gl/las 3.1.0-beta.5 → 3.1.2
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.
- package/dist/bundle.js +5 -19596
- package/dist/dist.min.js +19596 -0
- package/dist/es5/bundle.js +1 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/index.js +40 -6
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/las-loader.js +4 -4
- package/dist/es5/las-loader.js.map +1 -1
- package/dist/es5/lib/get-las-schema.js +3 -3
- package/dist/es5/lib/get-las-schema.js.map +1 -1
- package/dist/es5/lib/laslaz-decoder.js +233 -206
- package/dist/es5/lib/laslaz-decoder.js.map +1 -1
- package/dist/es5/lib/libs/laz-perf.js +1 -1
- package/dist/es5/lib/libs/laz-perf.js.map +1 -1
- package/dist/es5/lib/parse-las.js +66 -42
- package/dist/es5/lib/parse-las.js.map +1 -1
- package/dist/esm/las-loader.js +1 -1
- package/dist/esm/las-loader.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,34 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
3
5
|
Object.defineProperty(exports, "__esModule", {
|
|
4
6
|
value: true
|
|
5
7
|
});
|
|
6
8
|
exports.default = parseLAS;
|
|
7
9
|
exports.parseLASChunked = parseLASChunked;
|
|
8
10
|
|
|
11
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
12
|
+
|
|
13
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
14
|
+
|
|
9
15
|
var _schema = require("@loaders.gl/schema");
|
|
10
16
|
|
|
11
17
|
var _laslazDecoder = require("./laslaz-decoder");
|
|
12
18
|
|
|
13
19
|
var _getLasSchema = require("./get-las-schema");
|
|
14
20
|
|
|
21
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
22
|
+
|
|
23
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
24
|
+
|
|
15
25
|
function parseLAS(arrayBuffer, options) {
|
|
16
26
|
var _options$las;
|
|
17
27
|
|
|
18
|
-
|
|
28
|
+
var mesh = parseLASMesh(arrayBuffer, options);
|
|
19
29
|
return (0, _schema.convertMesh)(mesh, (options === null || options === void 0 ? void 0 : (_options$las = options.las) === null || _options$las === void 0 ? void 0 : _options$las.shape) || 'mesh');
|
|
20
30
|
}
|
|
21
31
|
|
|
22
|
-
function parseLASMesh(arrayBuffer
|
|
32
|
+
function parseLASMesh(arrayBuffer) {
|
|
23
33
|
var _options$las2;
|
|
24
34
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
36
|
+
var pointIndex = 0;
|
|
37
|
+
var positions;
|
|
38
|
+
var colors;
|
|
39
|
+
var intensities;
|
|
40
|
+
var classifications;
|
|
41
|
+
var originalHeader;
|
|
42
|
+
var lasMesh = {
|
|
32
43
|
loader: 'las',
|
|
33
44
|
loaderData: {},
|
|
34
45
|
schema: new _schema.Schema([]),
|
|
@@ -40,15 +51,18 @@ function parseLASMesh(arrayBuffer, options = {}) {
|
|
|
40
51
|
topology: 'point-list',
|
|
41
52
|
mode: 0
|
|
42
53
|
};
|
|
43
|
-
parseLASChunked(arrayBuffer, (_options$las2 = options.las) === null || _options$las2 === void 0 ? void 0 : _options$las2.skip, (
|
|
54
|
+
parseLASChunked(arrayBuffer, (_options$las2 = options.las) === null || _options$las2 === void 0 ? void 0 : _options$las2.skip, function () {
|
|
44
55
|
var _options$las4, _options$onProgress;
|
|
45
56
|
|
|
57
|
+
var decoder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
58
|
+
var lasHeader = arguments.length > 1 ? arguments[1] : undefined;
|
|
59
|
+
|
|
46
60
|
if (!originalHeader) {
|
|
47
61
|
var _options$las3;
|
|
48
62
|
|
|
49
63
|
originalHeader = lasHeader;
|
|
50
|
-
|
|
51
|
-
|
|
64
|
+
var total = lasHeader.totalToRead;
|
|
65
|
+
var PositionsType = (_options$las3 = options.las) !== null && _options$las3 !== void 0 && _options$las3.fp64 ? Float64Array : Float32Array;
|
|
52
66
|
positions = new PositionsType(total * 3);
|
|
53
67
|
colors = lasHeader.pointsFormatId >= 2 ? new Uint8Array(total * 4) : null;
|
|
54
68
|
intensities = new Uint16Array(total);
|
|
@@ -77,20 +91,26 @@ function parseLASMesh(arrayBuffer, options = {}) {
|
|
|
77
91
|
}
|
|
78
92
|
}
|
|
79
93
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
+
var batchSize = decoder.pointsCount;
|
|
95
|
+
|
|
96
|
+
var _lasHeader$scale = (0, _slicedToArray2.default)(lasHeader.scale, 3),
|
|
97
|
+
scaleX = _lasHeader$scale[0],
|
|
98
|
+
scaleY = _lasHeader$scale[1],
|
|
99
|
+
scaleZ = _lasHeader$scale[2],
|
|
100
|
+
_lasHeader$offset = (0, _slicedToArray2.default)(lasHeader.offset, 3),
|
|
101
|
+
offsetX = _lasHeader$offset[0],
|
|
102
|
+
offsetY = _lasHeader$offset[1],
|
|
103
|
+
offsetZ = _lasHeader$offset[2];
|
|
104
|
+
|
|
105
|
+
var twoByteColor = detectTwoByteColors(decoder, batchSize, (_options$las4 = options.las) === null || _options$las4 === void 0 ? void 0 : _options$las4.colorDepth);
|
|
106
|
+
|
|
107
|
+
for (var i = 0; i < batchSize; i++) {
|
|
108
|
+
var _decoder$getPoint = decoder.getPoint(i),
|
|
109
|
+
position = _decoder$getPoint.position,
|
|
110
|
+
color = _decoder$getPoint.color,
|
|
111
|
+
intensity = _decoder$getPoint.intensity,
|
|
112
|
+
classification = _decoder$getPoint.classification;
|
|
113
|
+
|
|
94
114
|
positions[pointIndex * 3] = position[0] * scaleX + offsetX;
|
|
95
115
|
positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
|
|
96
116
|
positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
|
|
@@ -114,12 +134,13 @@ function parseLASMesh(arrayBuffer, options = {}) {
|
|
|
114
134
|
pointIndex++;
|
|
115
135
|
}
|
|
116
136
|
|
|
117
|
-
|
|
137
|
+
var meshBatch = _objectSpread(_objectSpread({}, lasMesh), {}, {
|
|
118
138
|
header: {
|
|
119
139
|
vertexCount: lasHeader.totalRead
|
|
120
140
|
},
|
|
121
141
|
progress: lasHeader.totalRead / lasHeader.totalToRead
|
|
122
|
-
};
|
|
142
|
+
});
|
|
143
|
+
|
|
123
144
|
options === null || options === void 0 ? void 0 : (_options$onProgress = options.onProgress) === null || _options$onProgress === void 0 ? void 0 : _options$onProgress.call(options, meshBatch);
|
|
124
145
|
});
|
|
125
146
|
lasMesh.header = {
|
|
@@ -134,24 +155,25 @@ function parseLASMesh(arrayBuffer, options = {}) {
|
|
|
134
155
|
return lasMesh;
|
|
135
156
|
}
|
|
136
157
|
|
|
137
|
-
function parseLASChunked(rawData, skip
|
|
138
|
-
|
|
158
|
+
function parseLASChunked(rawData, skip) {
|
|
159
|
+
var onParseData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
160
|
+
var dataHandler = new _laslazDecoder.LASFile(rawData);
|
|
139
161
|
|
|
140
162
|
try {
|
|
141
163
|
dataHandler.open();
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
164
|
+
var header = dataHandler.getHeader();
|
|
165
|
+
var Unpacker = dataHandler.getUnpacker();
|
|
166
|
+
var totalToRead = Math.ceil(header.pointsCount / Math.max(1, skip));
|
|
145
167
|
header.totalToRead = totalToRead;
|
|
146
|
-
|
|
168
|
+
var totalRead = 0;
|
|
147
169
|
|
|
148
170
|
while (true) {
|
|
149
|
-
|
|
171
|
+
var chunk = dataHandler.readData(1000 * 100, 0, skip);
|
|
150
172
|
totalRead += chunk.count;
|
|
151
173
|
header.totalRead = totalRead;
|
|
152
174
|
header.versionAsString = chunk.versionAsString;
|
|
153
175
|
header.isCompressed = chunk.isCompressed;
|
|
154
|
-
|
|
176
|
+
var unpacker = new Unpacker(chunk.buffer, chunk.count, header);
|
|
155
177
|
onParseData(unpacker, header);
|
|
156
178
|
|
|
157
179
|
if (!chunk.hasMoreData || totalRead >= totalToRead) {
|
|
@@ -165,8 +187,11 @@ function parseLASChunked(rawData, skip, onParseData = {}) {
|
|
|
165
187
|
}
|
|
166
188
|
}
|
|
167
189
|
|
|
168
|
-
function detectTwoByteColors(
|
|
169
|
-
|
|
190
|
+
function detectTwoByteColors() {
|
|
191
|
+
var decoder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
192
|
+
var batchSize = arguments.length > 1 ? arguments[1] : undefined;
|
|
193
|
+
var colorDepth = arguments.length > 2 ? arguments[2] : undefined;
|
|
194
|
+
var twoByteColor = false;
|
|
170
195
|
|
|
171
196
|
switch (colorDepth) {
|
|
172
197
|
case 8:
|
|
@@ -179,10 +204,9 @@ function detectTwoByteColors(decoder = {}, batchSize, colorDepth) {
|
|
|
179
204
|
|
|
180
205
|
case 'auto':
|
|
181
206
|
if (decoder.getPoint(0).color) {
|
|
182
|
-
for (
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
} = decoder.getPoint(i);
|
|
207
|
+
for (var i = 0; i < batchSize; i++) {
|
|
208
|
+
var _decoder$getPoint2 = decoder.getPoint(i),
|
|
209
|
+
color = _decoder$getPoint2.color;
|
|
186
210
|
|
|
187
211
|
if (color[0] > 255 || color[1] > 255 || color[2] > 255) {
|
|
188
212
|
twoByteColor = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parse-las.ts"],"names":["parseLAS","arrayBuffer","options","mesh","parseLASMesh","las","shape","pointIndex","positions","colors","intensities","classifications","originalHeader","lasMesh","loader","loaderData","schema","Schema","header","vertexCount","boundingBox","attributes","topology","mode","parseLASChunked","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","LASFile","open","getHeader","Unpacker","getUnpacker","Math","ceil","max","chunk","readData","count","versionAsString","isCompressed","unpacker","buffer","hasMoreData","e","close","console","warn"],"mappings":"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","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 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"],"file":"parse-las.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parse-las.ts"],"names":["parseLAS","arrayBuffer","options","mesh","parseLASMesh","las","shape","pointIndex","positions","colors","intensities","classifications","originalHeader","lasMesh","loader","loaderData","schema","Schema","header","vertexCount","boundingBox","attributes","topology","mode","parseLASChunked","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","getPoint","position","color","meshBatch","totalRead","progress","onProgress","rawData","onParseData","dataHandler","LASFile","open","getHeader","Unpacker","getUnpacker","Math","ceil","max","chunk","readData","count","versionAsString","isCompressed","unpacker","buffer","hasMoreData","e","close","console","warn"],"mappings":"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","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 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"],"file":"parse-las.js"}
|
package/dist/esm/las-loader.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/las-loader.ts"],"names":["VERSION","DEFAULT_LAS_OPTIONS","las","shape","fp64","skip","colorDepth","LASLoader","name","id","module","version","worker","extensions","mimeTypes","text","binary","tests","options","_typecheckLoader"],"mappings":"AAKA,MAAMA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"sources":["../../src/las-loader.ts"],"names":["VERSION","DEFAULT_LAS_OPTIONS","las","shape","fp64","skip","colorDepth","LASLoader","name","id","module","version","worker","extensions","mimeTypes","text","binary","tests","options","_typecheckLoader"],"mappings":"AAKA,MAAMA,OAAO,GAAG,mBAAuB,WAAvB,aAAmD,QAAnE;AAWA,MAAMC,mBAAqC,GAAG;AAC5CC,EAAAA,GAAG,EAAE;AACHC,IAAAA,KAAK,EAAE,MADJ;AAEHC,IAAAA,IAAI,EAAE,KAFH;AAGHC,IAAAA,IAAI,EAAE,CAHH;AAIHC,IAAAA,UAAU,EAAE;AAJT;AADuC,CAA9C;AAYA,OAAO,MAAMC,SAAS,GAAG;AACvBC,EAAAA,IAAI,EAAE,KADiB;AAEvBC,EAAAA,EAAE,EAAE,KAFmB;AAGvBC,EAAAA,MAAM,EAAE,KAHe;AAIvBC,EAAAA,OAAO,EAAEX,OAJc;AAKvBY,EAAAA,MAAM,EAAE,IALe;AAMvBC,EAAAA,UAAU,EAAE,CAAC,KAAD,EAAQ,KAAR,CANW;AAOvBC,EAAAA,SAAS,EAAE,CAAC,0BAAD,CAPY;AAQvBC,EAAAA,IAAI,EAAE,IARiB;AASvBC,EAAAA,MAAM,EAAE,IATe;AAUvBC,EAAAA,KAAK,EAAE,CAAC,KAAD,CAVgB;AAWvBC,EAAAA,OAAO,EAAEjB;AAXc,CAAlB;AAcP,OAAO,MAAMkB,gBAAwB,GAAGZ,SAAjC","sourcesContent":["// LASER (LAS) FILE FORMAT\nimport type {Loader, LoaderOptions} from '@loaders.gl/loader-utils';\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};\n\nconst DEFAULT_LAS_OPTIONS: LASLoaderOptions = {\n las: {\n shape: 'mesh',\n fp64: false,\n skip: 1,\n colorDepth: 8\n }\n};\n\n/**\n * Loader for the LAS (LASer) point cloud format\n */\nexport const LASLoader = {\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: DEFAULT_LAS_OPTIONS\n};\n\nexport const _typecheckLoader: Loader = LASLoader;\n"],"file":"las-loader.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/las",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.2",
|
|
4
4
|
"description": "Framework-independent loader for the LAS and LAZ formats",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -36,13 +36,13 @@
|
|
|
36
36
|
],
|
|
37
37
|
"scripts": {
|
|
38
38
|
"pre-build": "npm run build-bundle && npm run build-worker",
|
|
39
|
-
"build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/
|
|
39
|
+
"build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js",
|
|
40
40
|
"build-worker": "esbuild src/workers/las-worker.ts --bundle --outfile=dist/las-worker.js"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@babel/runtime": "^7.3.1",
|
|
44
|
-
"@loaders.gl/loader-utils": "3.1.
|
|
45
|
-
"@loaders.gl/schema": "3.1.
|
|
44
|
+
"@loaders.gl/loader-utils": "3.1.2",
|
|
45
|
+
"@loaders.gl/schema": "3.1.2"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "5c25bb71a2ac8558ecedf2256cc925427b2a0506"
|
|
48
48
|
}
|