@loaders.gl/potree 4.4.0-alpha.2 → 4.4.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/dist.dev.js +6135 -710
- package/dist/dist.min.js +20 -17
- package/dist/index.cjs +106 -12
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/octree.js +1 -0
- package/dist/lib/octree.js.map +1 -0
- package/dist/lib/potree-node-source.d.ts +42 -6
- package/dist/lib/potree-node-source.d.ts.map +1 -1
- package/dist/lib/potree-node-source.js +91 -9
- package/dist/lib/potree-node-source.js.map +1 -0
- package/dist/parsers/parse-potree-bin.js +1 -0
- package/dist/parsers/parse-potree-bin.js.map +1 -0
- package/dist/parsers/parse-potree-hierarchy-chunk.d.ts +10 -0
- package/dist/parsers/parse-potree-hierarchy-chunk.d.ts.map +1 -1
- package/dist/parsers/parse-potree-hierarchy-chunk.js +3 -0
- package/dist/parsers/parse-potree-hierarchy-chunk.js.map +1 -0
- package/dist/potree-bin-loader.js +1 -0
- package/dist/potree-bin-loader.js.map +1 -0
- package/dist/potree-hierarchy-chunk-loader.js +2 -1
- package/dist/potree-hierarchy-chunk-loader.js.map +1 -0
- package/dist/potree-loader.js +2 -1
- package/dist/potree-loader.js.map +1 -0
- package/dist/potree-source.js +1 -0
- package/dist/potree-source.js.map +1 -0
- package/dist/types/potree-metadata.js +1 -0
- package/dist/types/potree-metadata.js.map +1 -0
- package/dist/utils/bounding-box-utils.d.ts +9 -0
- package/dist/utils/bounding-box-utils.d.ts.map +1 -0
- package/dist/utils/bounding-box-utils.js +23 -0
- package/dist/utils/bounding-box-utils.js.map +1 -0
- package/dist/utils/parse-version.js +1 -0
- package/dist/utils/parse-version.js.map +1 -0
- package/dist/utils/projection-utils.d.ts +8 -0
- package/dist/utils/projection-utils.d.ts.map +1 -0
- package/dist/utils/projection-utils.js +16 -0
- package/dist/utils/projection-utils.js.map +1 -0
- package/package.json +7 -6
- package/src/index.ts +2 -0
- package/src/lib/potree-node-source.ts +110 -15
- package/src/parsers/parse-potree-hierarchy-chunk.ts +12 -0
- package/src/utils/bounding-box-utils.ts +27 -0
- package/src/utils/projection-utils.ts +16 -0
package/dist/index.cjs
CHANGED
|
@@ -28,7 +28,7 @@ __export(dist_exports, {
|
|
|
28
28
|
module.exports = __toCommonJS(dist_exports);
|
|
29
29
|
|
|
30
30
|
// dist/potree-loader.js
|
|
31
|
-
var VERSION = true ? "4.4.0-alpha.
|
|
31
|
+
var VERSION = true ? "4.4.0-alpha.9" : "latest";
|
|
32
32
|
var PotreeLoader = {
|
|
33
33
|
dataType: null,
|
|
34
34
|
batchType: null,
|
|
@@ -103,6 +103,8 @@ function buildHierarchy(flatNodes, options = {}) {
|
|
|
103
103
|
node.children = [];
|
|
104
104
|
node.childrenByIndex = new Array(8).fill(null);
|
|
105
105
|
node.spacing = ((options == null ? void 0 : options.spacing) || 0) / Math.pow(2, level);
|
|
106
|
+
node.type = "pointcloud";
|
|
107
|
+
node.id = node.name;
|
|
106
108
|
if (parentNode) {
|
|
107
109
|
parentNode.children.push(node);
|
|
108
110
|
parentNode.childrenByIndex[index] = node;
|
|
@@ -113,7 +115,7 @@ function buildHierarchy(flatNodes, options = {}) {
|
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
// dist/potree-hierarchy-chunk-loader.js
|
|
116
|
-
var VERSION2 = true ? "4.4.0-alpha.
|
|
118
|
+
var VERSION2 = true ? "4.4.0-alpha.9" : "latest";
|
|
117
119
|
var PotreeHierarchyChunkLoader = {
|
|
118
120
|
dataType: null,
|
|
119
121
|
batchType: null,
|
|
@@ -172,6 +174,47 @@ function parseVersion(version) {
|
|
|
172
174
|
}
|
|
173
175
|
|
|
174
176
|
// dist/lib/potree-node-source.js
|
|
177
|
+
var import_proj42 = require("@math.gl/proj4");
|
|
178
|
+
|
|
179
|
+
// dist/utils/projection-utils.js
|
|
180
|
+
var import_proj4 = require("@math.gl/proj4");
|
|
181
|
+
var createProjection = (projectionData) => {
|
|
182
|
+
if (!projectionData) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
return new import_proj4.Proj4Projection({
|
|
186
|
+
from: projectionData,
|
|
187
|
+
to: "WGS84"
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
// dist/utils/bounding-box-utils.js
|
|
192
|
+
var getCartographicOriginFromBoundingBox = (projection, boundingBox) => {
|
|
193
|
+
if (!boundingBox) {
|
|
194
|
+
return [0, 0, 0];
|
|
195
|
+
}
|
|
196
|
+
const [minXOriginal, minYOriginal, minZ] = boundingBox[0];
|
|
197
|
+
const [maxXOriginal, maxYOriginal, maxZ] = boundingBox[1];
|
|
198
|
+
let minX = minXOriginal;
|
|
199
|
+
let minY = minYOriginal;
|
|
200
|
+
let maxX = maxXOriginal;
|
|
201
|
+
let maxY = maxYOriginal;
|
|
202
|
+
if (projection) {
|
|
203
|
+
[minX, minY] = projection.project([minX, minY]);
|
|
204
|
+
[maxX, maxY] = projection.project([maxX, maxY]);
|
|
205
|
+
}
|
|
206
|
+
return [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2, minZ + (maxZ - minZ) / 2];
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
// dist/lib/potree-node-source.js
|
|
210
|
+
var COORDINATE_SYSTEM;
|
|
211
|
+
(function(COORDINATE_SYSTEM2) {
|
|
212
|
+
COORDINATE_SYSTEM2[COORDINATE_SYSTEM2["DEFAULT"] = -1] = "DEFAULT";
|
|
213
|
+
COORDINATE_SYSTEM2[COORDINATE_SYSTEM2["LNGLAT"] = 1] = "LNGLAT";
|
|
214
|
+
COORDINATE_SYSTEM2[COORDINATE_SYSTEM2["METER_OFFSETS"] = 2] = "METER_OFFSETS";
|
|
215
|
+
COORDINATE_SYSTEM2[COORDINATE_SYSTEM2["LNGLAT_OFFSETS"] = 3] = "LNGLAT_OFFSETS";
|
|
216
|
+
COORDINATE_SYSTEM2[COORDINATE_SYSTEM2["CARTESIAN"] = 0] = "CARTESIAN";
|
|
217
|
+
})(COORDINATE_SYSTEM || (COORDINATE_SYSTEM = {}));
|
|
175
218
|
var PotreeNodesSource = class extends import_loader_utils.DataSource {
|
|
176
219
|
/** Dataset base URL */
|
|
177
220
|
baseUrl = "";
|
|
@@ -181,6 +224,10 @@ var PotreeNodesSource = class extends import_loader_utils.DataSource {
|
|
|
181
224
|
root = null;
|
|
182
225
|
/** Is data source ready to use after initial loading */
|
|
183
226
|
isReady = false;
|
|
227
|
+
/** local CRS to WGS84 projection */
|
|
228
|
+
projection = null;
|
|
229
|
+
/** The data set minimum bounding box */
|
|
230
|
+
boundingBox;
|
|
184
231
|
initPromise = null;
|
|
185
232
|
/**
|
|
186
233
|
* @constructor
|
|
@@ -195,11 +242,14 @@ var PotreeNodesSource = class extends import_loader_utils.DataSource {
|
|
|
195
242
|
}
|
|
196
243
|
/** Initial data source loading */
|
|
197
244
|
async init() {
|
|
245
|
+
var _a;
|
|
198
246
|
if (this.initPromise) {
|
|
199
247
|
await this.initPromise;
|
|
200
248
|
return;
|
|
201
249
|
}
|
|
202
250
|
this.metadata = await (0, import_core.load)(`${this.baseUrl}/cloud.js`, PotreeLoader);
|
|
251
|
+
this.projection = createProjection((_a = this.metadata) == null ? void 0 : _a.projection);
|
|
252
|
+
this.parseBoundingVolume();
|
|
203
253
|
await this.loadHierarchy();
|
|
204
254
|
this.isReady = true;
|
|
205
255
|
}
|
|
@@ -226,30 +276,51 @@ var PotreeNodesSource = class extends import_loader_utils.DataSource {
|
|
|
226
276
|
}
|
|
227
277
|
/**
|
|
228
278
|
* Load octree node content
|
|
229
|
-
* @param
|
|
279
|
+
* @param nodeName name of a node, string of numbers in range 0..7
|
|
230
280
|
* @return node content geometry or null if the node doesn't exist
|
|
231
281
|
*/
|
|
232
|
-
async loadNodeContent(
|
|
233
|
-
var _a;
|
|
282
|
+
async loadNodeContent(nodeName) {
|
|
283
|
+
var _a, _b, _c;
|
|
234
284
|
await this.initPromise;
|
|
235
285
|
if (!this.isSupported()) {
|
|
236
286
|
return null;
|
|
237
287
|
}
|
|
238
|
-
const isAvailable = await this.isNodeAvailable(
|
|
288
|
+
const isAvailable = await this.isNodeAvailable(nodeName);
|
|
239
289
|
if (isAvailable) {
|
|
240
|
-
|
|
290
|
+
const result = await (0, import_core.load)(`${this.baseUrl}/${(_a = this.metadata) == null ? void 0 : _a.octreeDir}/r/r${nodeName}.${this.getContentExtension()}`, import_las.LASLoader);
|
|
291
|
+
if (result) {
|
|
292
|
+
result.cartographicOrigin = getCartographicOriginFromBoundingBox(this.projection, (_b = result.header) == null ? void 0 : _b.boundingBox);
|
|
293
|
+
const position = result.attributes.POSITION.value;
|
|
294
|
+
for (let i = 0; i < (((_c = result.header) == null ? void 0 : _c.vertexCount) ?? 0); i++) {
|
|
295
|
+
let vertex = position.slice(i * 3, i * 3 + 2);
|
|
296
|
+
if (this.projection) {
|
|
297
|
+
vertex = this.projection.project(Array.from(vertex));
|
|
298
|
+
}
|
|
299
|
+
const offsets = [
|
|
300
|
+
vertex[0] - result.cartographicOrigin[0],
|
|
301
|
+
vertex[1] - result.cartographicOrigin[1],
|
|
302
|
+
position[i * 3 + 2] - result.cartographicOrigin[2]
|
|
303
|
+
];
|
|
304
|
+
position.set(offsets, i * 3);
|
|
305
|
+
}
|
|
306
|
+
result.attributes.positions = result.attributes.POSITION;
|
|
307
|
+
result.attributes.colors = result.attributes.COLOR_0;
|
|
308
|
+
result.attributes.normals = result.attributes.NORMAL;
|
|
309
|
+
result.coordinateSystem = COORDINATE_SYSTEM.LNGLAT_OFFSETS;
|
|
310
|
+
return result;
|
|
311
|
+
}
|
|
241
312
|
}
|
|
242
313
|
return null;
|
|
243
314
|
}
|
|
244
315
|
/**
|
|
245
316
|
* Check if a node exists in the octree
|
|
246
|
-
* @param
|
|
317
|
+
* @param nodeName name of a node, string of numbers in range 0..7
|
|
247
318
|
* @returns true - the node does exist, false - the nodes doesn't exist
|
|
248
319
|
*/
|
|
249
|
-
async isNodeAvailable(
|
|
320
|
+
async isNodeAvailable(nodeName) {
|
|
250
321
|
var _a;
|
|
251
322
|
if ((_a = this.metadata) == null ? void 0 : _a.hierarchy) {
|
|
252
|
-
return this.metadata.hierarchy.findIndex((item) => item[0] === `r${
|
|
323
|
+
return this.metadata.hierarchy.findIndex((item) => item[0] === `r${nodeName}`) !== -1;
|
|
253
324
|
}
|
|
254
325
|
if (!this.root) {
|
|
255
326
|
return false;
|
|
@@ -257,8 +328,8 @@ var PotreeNodesSource = class extends import_loader_utils.DataSource {
|
|
|
257
328
|
let currentParent = this.root;
|
|
258
329
|
let name = "";
|
|
259
330
|
let result = true;
|
|
260
|
-
for (const
|
|
261
|
-
const newName = `${name}${
|
|
331
|
+
for (const char of nodeName) {
|
|
332
|
+
const newName = `${name}${char}`;
|
|
262
333
|
const node = currentParent.children.find((child) => child.name === newName);
|
|
263
334
|
if (node) {
|
|
264
335
|
currentParent = node;
|
|
@@ -290,6 +361,29 @@ var PotreeNodesSource = class extends import_loader_utils.DataSource {
|
|
|
290
361
|
this.baseUrl = this.baseUrl.substring(0, -1);
|
|
291
362
|
}
|
|
292
363
|
}
|
|
364
|
+
parseBoundingVolume() {
|
|
365
|
+
var _a, _b;
|
|
366
|
+
if (((_a = this.metadata) == null ? void 0 : _a.projection) && this.metadata.tightBoundingBox) {
|
|
367
|
+
const projection = new import_proj42.Proj4Projection({
|
|
368
|
+
from: this.metadata.projection,
|
|
369
|
+
to: "WGS84"
|
|
370
|
+
});
|
|
371
|
+
const { lx, ly, ux, uy } = this.metadata.tightBoundingBox;
|
|
372
|
+
const lCoord = [lx, ly];
|
|
373
|
+
const wgs84LCood = projection.project(lCoord);
|
|
374
|
+
const uCoord = [ux, uy];
|
|
375
|
+
const wgs84UCood = projection.project(uCoord);
|
|
376
|
+
this.boundingBox = {
|
|
377
|
+
...this.metadata.tightBoundingBox,
|
|
378
|
+
lx: wgs84LCood[0],
|
|
379
|
+
ly: wgs84LCood[1],
|
|
380
|
+
ux: wgs84UCood[0],
|
|
381
|
+
uy: wgs84UCood[1]
|
|
382
|
+
};
|
|
383
|
+
} else {
|
|
384
|
+
this.boundingBox = (_b = this.metadata) == null ? void 0 : _b.tightBoundingBox;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
293
387
|
};
|
|
294
388
|
|
|
295
389
|
// dist/potree-source.js
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["index.
|
|
4
|
-
"sourcesContent": ["export { PotreeLoader } from \"./potree-loader.js\";\nexport { PotreeHierarchyChunkLoader } from \"./potree-hierarchy-chunk-loader.js\";\nexport { PotreeBinLoader } from \"./potree-bin-loader.js\";\nexport { PotreeSource } from \"./potree-source.js\";\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof \"4.4.0-alpha.1\" !== 'undefined' ? \"4.4.0-alpha.1\" : 'latest';\n/** Potree loader */\nexport const PotreeLoader = {\n dataType: null,\n batchType: null,\n name: 'potree metadata',\n id: 'potree',\n module: 'potree',\n version: VERSION,\n extensions: ['js'],\n mimeTypes: ['application/json'],\n testText: (text) => text.indexOf('octreeDir') >= 0,\n parse: (data) => JSON.parse(new TextDecoder().decode(data)),\n parseTextSync: (text) => JSON.parse(text),\n options: {\n potree: {}\n }\n};\n", "// This file is derived from the Cesium code base under BSD 2-clause license\n// See LICENSE.md and https://github.com/potree/potree/blob/develop/LICENSE\n/**\n * load hierarchy\n * @param arrayBuffer - binary index data\n * @returns root node\n **/\nexport function parsePotreeHierarchyChunk(arrayBuffer) {\n const tileHeaders = parseBinaryChunk(arrayBuffer);\n return buildHierarchy(tileHeaders);\n}\n/**\n * Parses the binary rows\n * @param arrayBuffer - binary index data to parse\n * @param byteOffset - byte offset to start from\n * @returns flat nodes array\n * */\nfunction parseBinaryChunk(arrayBuffer, byteOffset = 0) {\n const dataView = new DataView(arrayBuffer);\n const stack = [];\n // Get root mask\n // @ts-expect-error\n const topTileHeader = {};\n byteOffset = decodeRow(dataView, byteOffset, topTileHeader);\n stack.push(topTileHeader);\n const tileHeaders = [topTileHeader];\n while (stack.length > 0) {\n const snode = stack.shift();\n let mask = 1;\n for (let i = 0; i < 8; i++) {\n if (snode && (snode.header.childMask & mask) !== 0) {\n // @ts-expect-error\n const tileHeader = {};\n byteOffset = decodeRow(dataView, byteOffset, tileHeader);\n tileHeader.name = snode.name + i;\n stack.push(tileHeader);\n tileHeaders.push(tileHeader);\n snode.header.childCount++;\n }\n mask = mask * 2;\n }\n if (byteOffset === dataView.byteLength) {\n break;\n }\n }\n return tileHeaders;\n}\n/**\n * Reads next row from binary index file\n * @param dataView - index data\n * @param byteOffset - current offset in the index data\n * @param tileHeader - container to read to\n * @returns new offset\n */\nfunction decodeRow(dataView, byteOffset, tileHeader) {\n tileHeader.header = tileHeader.header || {};\n tileHeader.header.childMask = dataView.getUint8(byteOffset);\n tileHeader.header.childCount = 0;\n tileHeader.pointCount = dataView.getUint32(byteOffset + 1, true);\n tileHeader.name = '';\n byteOffset += 5;\n return byteOffset;\n}\n/** Resolves the binary rows into a hierarchy (tree structure) */\nfunction buildHierarchy(flatNodes, options = {}) {\n const DEFAULT_OPTIONS = { spacing: 100 }; // TODO assert instead of default?\n options = { ...DEFAULT_OPTIONS, ...options };\n const topNode = flatNodes[0];\n const nodes = {};\n for (const node of flatNodes) {\n const { name } = node;\n const index = parseInt(name.charAt(name.length - 1), 10);\n const parentName = name.substring(0, name.length - 1);\n const parentNode = nodes[parentName];\n const level = name.length - 1;\n // assert(parentNode && level >= 0);\n node.level = level;\n node.hasChildren = Boolean(node.header.childCount);\n node.children = [];\n node.childrenByIndex = new Array(8).fill(null);\n node.spacing = (options?.spacing || 0) / Math.pow(2, level);\n // tileHeader.boundingVolume = Utils.createChildAABB(parentNode.boundingBox, index);\n if (parentNode) {\n parentNode.children.push(node);\n parentNode.childrenByIndex[index] = node;\n }\n // Add the node to the map\n nodes[name] = node;\n }\n // First node is the root\n return topNode;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\nimport { parsePotreeHierarchyChunk } from \"./parsers/parse-potree-hierarchy-chunk.js\";\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof \"4.4.0-alpha.1\" !== 'undefined' ? \"4.4.0-alpha.1\" : 'latest';\n/** Potree hierarchy chunk loader */\nexport const PotreeHierarchyChunkLoader = {\n dataType: null,\n batchType: null,\n name: 'potree Hierarchy Chunk',\n id: 'potree-hrc',\n module: 'potree',\n version: VERSION,\n extensions: ['hrc'],\n mimeTypes: ['application/octet-stream'],\n // binary potree files have no header bytes, no content test function possible\n // test: ['...'],\n parse: async (arrayBuffer, options) => parsePotreeHierarchyChunk(arrayBuffer),\n parseSync: (arrayBuffer, options) => parsePotreeHierarchyChunk(arrayBuffer),\n options: {\n potree: {}\n },\n binary: true\n};\n", "export function parsePotreeBin(arrayBuffer, byteOffset, options, index) {\n return null;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\nimport { parsePotreeBin } from \"./parsers/parse-potree-bin.js\";\n/**\n * Loader for potree Binary Point Attributes\n * */\nexport const PotreeBinLoader = {\n dataType: null,\n batchType: null,\n name: 'potree Binary Point Attributes',\n id: 'potree',\n extensions: ['bin'],\n mimeTypes: ['application/octet-stream'],\n // Unfortunately binary potree files have no header bytes, no test possible\n // test: ['...'],\n parseSync,\n binary: true,\n options: {}\n // @ts-ignore\n};\nfunction parseSync(arrayBuffer, options) {\n const index = {};\n const byteOffset = 0;\n parsePotreeBin(arrayBuffer, byteOffset, options, index);\n return index;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { load } from '@loaders.gl/core';\nimport { DataSource, resolvePath } from '@loaders.gl/loader-utils';\nimport { LASLoader } from '@loaders.gl/las';\nimport { PotreeHierarchyChunkLoader } from \"../potree-hierarchy-chunk-loader.js\";\nimport { PotreeLoader } from \"../potree-loader.js\";\nimport { parseVersion } from \"../utils/parse-version.js\";\n/**\n * A Potree data source\n * @version 1.0 - @see https://github.com/potree/potree/blob/1.0RC/docs/file_format.md\n * @version 1.7 - @see https://github.com/potree/potree/blob/1.7/docs/potree-file-format.md\n * @note Point cloud nodes tile source\n */\nexport class PotreeNodesSource extends DataSource {\n /** Dataset base URL */\n baseUrl = '';\n /** Meta information from `cloud.js` */\n metadata = null;\n /** Root node */\n root = null;\n /** Is data source ready to use after initial loading */\n isReady = false;\n initPromise = null;\n /**\n * @constructor\n * @param data - if string - data set path url or path to `cloud.js` metadata file\n * - if Blob - single file data\n * @param options - data source properties\n */\n constructor(data, options) {\n super(data, options);\n this.makeBaseUrl(this.data);\n this.initPromise = this.init();\n }\n /** Initial data source loading */\n async init() {\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n this.metadata = await load(`${this.baseUrl}/cloud.js`, PotreeLoader);\n await this.loadHierarchy();\n this.isReady = true;\n }\n /** Is data set supported */\n isSupported() {\n const { minor, major } = parseVersion(this.metadata?.version ?? '');\n return (this.isReady &&\n major === 1 &&\n minor <= 8 &&\n typeof this.metadata?.pointAttributes === 'string' &&\n ['LAS', 'LAZ'].includes(this.metadata?.pointAttributes));\n }\n /** Get content files extension */\n getContentExtension() {\n if (!this.isReady) {\n return null;\n }\n switch (this.metadata?.pointAttributes) {\n case 'LAS':\n return 'las';\n case 'LAZ':\n return 'laz';\n default:\n return 'bin';\n }\n }\n /**\n * Load octree node content\n * @param path array of numbers between 0-7 specifying successive octree divisions.\n * @return node content geometry or null if the node doesn't exist\n */\n async loadNodeContent(path) {\n await this.initPromise;\n if (!this.isSupported()) {\n return null;\n }\n const isAvailable = await this.isNodeAvailable(path);\n if (isAvailable) {\n return load(`${this.baseUrl}/${this.metadata?.octreeDir}/r/r${path.join('')}.${this.getContentExtension()}`, LASLoader);\n }\n return null;\n }\n /**\n * Check if a node exists in the octree\n * @param path array of numbers between 0-7 specifying successive octree divisions\n * @returns true - the node does exist, false - the nodes doesn't exist\n */\n async isNodeAvailable(path) {\n if (this.metadata?.hierarchy) {\n return this.metadata.hierarchy.findIndex((item) => item[0] === `r${path.join()}`) !== -1;\n }\n if (!this.root) {\n return false;\n }\n let currentParent = this.root;\n let name = '';\n let result = true;\n for (const nodeLevel of path) {\n const newName = `${name}${nodeLevel}`;\n const node = currentParent.children.find((child) => child.name === newName);\n if (node) {\n currentParent = node;\n name = newName;\n }\n else {\n result = false;\n break;\n }\n }\n return result;\n }\n /**\n * Load data source hierarchy into tree of available nodes\n */\n async loadHierarchy() {\n this.root = await load(`${this.baseUrl}/${this.metadata?.octreeDir}/r/r.hrc`, PotreeHierarchyChunkLoader);\n }\n /**\n * Deduce base url from the input url sring\n * @param data - data source input data\n */\n makeBaseUrl(data) {\n this.baseUrl = typeof data === 'string' ? resolvePath(data) : '';\n if (this.baseUrl.endsWith('cloud.js')) {\n this.baseUrl = this.baseUrl.substring(0, -8);\n }\n if (this.baseUrl.endsWith('/')) {\n this.baseUrl = this.baseUrl.substring(0, -1);\n }\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function parseVersion(version) {\n const parts = version.split('.').map(Number);\n return { major: parts[0], minor: parts[1] };\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { PotreeNodesSource } from \"./lib/potree-node-source.js\";\nconst VERSION = '1.7';\n/**\n * Creates point cloud data sources for Potree urls\n */\nexport const PotreeSource = {\n name: 'Potree',\n id: 'potree',\n module: 'potree',\n version: VERSION,\n extensions: ['bin', 'las', 'laz'],\n mimeTypes: ['application/octet-stream'],\n type: 'potree',\n fromUrl: true,\n fromBlob: true,\n defaultOptions: {\n potree: {}\n },\n testURL: (url) => url.endsWith('.js'),\n createDataSource: (url, options) => new PotreeNodesSource(url, options) // , PotreeNodesSource.defaultOptions)\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA
|
|
6
|
-
"names": ["VERSION", "VERSION"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/potree-loader.ts", "../src/parsers/parse-potree-hierarchy-chunk.ts", "../src/potree-hierarchy-chunk-loader.ts", "../src/parsers/parse-potree-bin.ts", "../src/potree-bin-loader.ts", "../src/lib/potree-node-source.ts", "../src/utils/parse-version.ts", "../src/utils/projection-utils.ts", "../src/utils/bounding-box-utils.ts", "../src/potree-source.ts"],
|
|
4
|
+
"sourcesContent": ["export {PotreeLoader} from './potree-loader';\nexport {PotreeHierarchyChunkLoader} from './potree-hierarchy-chunk-loader';\nexport {PotreeBinLoader} from './potree-bin-loader';\nexport {PotreeSource} from './potree-source';\n\nexport {type POTreeNode} from './parsers/parse-potree-hierarchy-chunk';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\nimport type {LoaderWithParser, 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 POTreeLoaderOptions = LoaderOptions & {\n potree?: {};\n};\n\n/** Potree loader */\nexport const PotreeLoader = {\n dataType: null as unknown as any,\n batchType: null as never,\n\n name: 'potree metadata',\n id: 'potree',\n module: 'potree',\n version: VERSION,\n extensions: ['js'],\n mimeTypes: ['application/json'],\n testText: (text) => text.indexOf('octreeDir') >= 0,\n parse: (data: ArrayBuffer) => JSON.parse(new TextDecoder().decode(data)),\n parseTextSync: (text) => JSON.parse(text),\n options: {\n potree: {}\n }\n} as const satisfies LoaderWithParser<any, never, POTreeLoaderOptions>;\n", "// This file is derived from the Cesium code base under BSD 2-clause license\n// See LICENSE.md and https://github.com/potree/potree/blob/develop/LICENSE\n\n// Potree Hierarchy Chunk file format\n// https://github.com/potree/potree/blob/develop/docs/potree-file-format.md#index-files\n\n/*\n### Hierarchy Chunk Files\n\nAs mentioned in the former section, the `.hrc` files contain the index structure\nmeaning a list of all the files stored within the directory tree.\n\nAn index file contains a list of tuple values with the first being a `uint8`\n\"mask\" and the second being `uint32` \"number of points\" of a hierarchy level\nin a [breadth first level order][breadth-first].\n\nPer hierarchy level we have 8 possible nodes. To indicate whether a node exists\na simple binary mask is used:\n\n| Position | Mask | [Binary][bin] |\n|----------|------|---------------|\n| 0 | 1 | 0b00000001 |\n| 1 | 2 | 0b00000010 |\n| 2 | 4 | 0b00000100 |\n| 3 | 8 | 0b00001000 |\n| 4 | 16 | 0b00010000 |\n| 5 | 32 | 0b00100000 |\n| 6 | 64 | 0b01000000 |\n| 7 | 128 | 0b10000000 |\n\nSo if in a hierarchy the child node 3 and node 7 exist then the hierarchies\nmask has to be `0b00001000 | 0b10000000` \u2192 `0b10001000` (=136).\n\n_Example:_ A simple, non-realistic tree:\n\n```\n|- r1\n| |\n| \\- r14 (2 Points)\n|\n\\- r3\n |\n \\- r36 (1 Point)\n```\n\nWould have an index looking like this:\n\n| name | mask | points |\n|------|--------------------|--------|\n| r | `0b00001010` (=10) | `3` |\n| r1 | `0b00010000` (=16) | `2` |\n| r3 | `0b01000000` (=64) | `1` |\n| r14 | `0b00000000` (=0) | `2` |\n| r36 | `0b00000000` (=0) | `1` |\n*/\n\n/** Node metadata from index file */\nexport type POTreeTileHeader = {\n /** Number of child nodes */\n childCount: number;\n /** Human readable name */\n name: string;\n /** Child availability mask */\n childMask: number;\n};\n\n/** Hierarchical potree node structure */\nexport type POTreeNode = {\n id: string;\n type: 'pointcloud';\n /** Index data */\n header: POTreeTileHeader;\n /** Human readable name */\n name: string;\n /** Number of points */\n pointCount: number;\n /** Node's level in the tree */\n level: number;\n /** Has children */\n hasChildren: boolean;\n /** Space between points */\n spacing: number;\n /** Available children */\n children: POTreeNode[];\n /** All children including unavailable */\n childrenByIndex: POTreeNode[];\n /** Is tile selected for rendering */\n selected: boolean;\n /** Points content data */\n content?: unknown;\n /** Is content loading */\n isContentLoading?: boolean;\n /** Viewport Ids */\n viewportIds: unknown[];\n};\n\n/**\n * load hierarchy\n * @param arrayBuffer - binary index data\n * @returns root node\n **/\nexport function parsePotreeHierarchyChunk(arrayBuffer: ArrayBuffer): POTreeNode {\n const tileHeaders = parseBinaryChunk(arrayBuffer);\n return buildHierarchy(tileHeaders);\n}\n\n/**\n * Parses the binary rows\n * @param arrayBuffer - binary index data to parse\n * @param byteOffset - byte offset to start from\n * @returns flat nodes array\n * */\nfunction parseBinaryChunk(arrayBuffer: ArrayBuffer, byteOffset = 0): POTreeNode[] {\n const dataView = new DataView(arrayBuffer);\n\n const stack: POTreeNode[] = [];\n\n // Get root mask\n // @ts-expect-error\n const topTileHeader: POTreeNode = {};\n byteOffset = decodeRow(dataView, byteOffset, topTileHeader);\n\n stack.push(topTileHeader);\n const tileHeaders: POTreeNode[] = [topTileHeader];\n\n while (stack.length > 0) {\n const snode = stack.shift();\n let mask = 1;\n\n for (let i = 0; i < 8; i++) {\n if (snode && (snode.header.childMask & mask) !== 0) {\n // @ts-expect-error\n const tileHeader: POTreeNode = {};\n byteOffset = decodeRow(dataView, byteOffset, tileHeader);\n tileHeader.name = snode.name + i;\n\n stack.push(tileHeader);\n tileHeaders.push(tileHeader);\n snode.header.childCount++;\n }\n mask = mask * 2;\n }\n\n if (byteOffset === dataView.byteLength) {\n break;\n }\n }\n\n return tileHeaders;\n}\n\n/**\n * Reads next row from binary index file\n * @param dataView - index data\n * @param byteOffset - current offset in the index data\n * @param tileHeader - container to read to\n * @returns new offset\n */\nfunction decodeRow(dataView: DataView, byteOffset: number, tileHeader: POTreeNode): number {\n tileHeader.header = tileHeader.header || {};\n tileHeader.header.childMask = dataView.getUint8(byteOffset);\n tileHeader.header.childCount = 0;\n tileHeader.pointCount = dataView.getUint32(byteOffset + 1, true);\n tileHeader.name = '';\n byteOffset += 5;\n return byteOffset;\n}\n\n/** Resolves the binary rows into a hierarchy (tree structure) */\nfunction buildHierarchy(flatNodes: POTreeNode[], options: {spacing?: number} = {}): POTreeNode {\n const DEFAULT_OPTIONS = {spacing: 100}; // TODO assert instead of default?\n options = {...DEFAULT_OPTIONS, ...options};\n\n const topNode: POTreeNode = flatNodes[0];\n const nodes = {};\n\n for (const node of flatNodes) {\n const {name} = node;\n\n const index = parseInt(name.charAt(name.length - 1), 10);\n const parentName = name.substring(0, name.length - 1);\n const parentNode = nodes[parentName];\n const level = name.length - 1;\n // assert(parentNode && level >= 0);\n\n node.level = level;\n node.hasChildren = Boolean(node.header.childCount);\n node.children = [];\n node.childrenByIndex = new Array(8).fill(null);\n node.spacing = (options?.spacing || 0) / Math.pow(2, level);\n node.type = 'pointcloud';\n node.id = node.name;\n // tileHeader.boundingVolume = Utils.createChildAABB(parentNode.boundingBox, index);\n\n if (parentNode) {\n parentNode.children.push(node);\n parentNode.childrenByIndex[index] = node;\n }\n\n // Add the node to the map\n nodes[name] = node;\n }\n\n // First node is the root\n return topNode;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\nimport type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {POTreeLoaderOptions} from './potree-loader';\nimport type {POTreeNode} from './parsers/parse-potree-hierarchy-chunk';\nimport {parsePotreeHierarchyChunk} from './parsers/parse-potree-hierarchy-chunk';\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\n/** Potree hierarchy chunk loader */\nexport const PotreeHierarchyChunkLoader = {\n dataType: null as unknown as POTreeNode,\n batchType: null as never,\n\n name: 'potree Hierarchy Chunk',\n id: 'potree-hrc',\n module: 'potree',\n version: VERSION,\n extensions: ['hrc'],\n mimeTypes: ['application/octet-stream'],\n // binary potree files have no header bytes, no content test function possible\n // test: ['...'],\n parse: async (arrayBuffer, options) => parsePotreeHierarchyChunk(arrayBuffer),\n parseSync: (arrayBuffer, options) => parsePotreeHierarchyChunk(arrayBuffer),\n options: {\n potree: {}\n },\n binary: true\n} as const satisfies LoaderWithParser<POTreeNode, never, POTreeLoaderOptions>;\n", "export function parsePotreeBin(\n arrayBuffer: ArrayBuffer,\n byteOffset: number,\n options: unknown,\n index: any\n) {\n return null;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {parsePotreeBin} from './parsers/parse-potree-bin';\n\n/**\n * Loader for potree Binary Point Attributes\n * */\nexport const PotreeBinLoader = {\n dataType: null as unknown as {},\n batchType: null as never,\n\n name: 'potree Binary Point Attributes',\n id: 'potree',\n extensions: ['bin'],\n mimeTypes: ['application/octet-stream'],\n // Unfortunately binary potree files have no header bytes, no test possible\n // test: ['...'],\n parseSync,\n binary: true,\n options: {}\n // @ts-ignore\n} as const satisfies LoaderWithParser<{}, never, LoaderOptions>;\n\nfunction parseSync(arrayBuffer: ArrayBuffer, options?: LoaderOptions): {} {\n const index = {};\n const byteOffset = 0;\n parsePotreeBin(arrayBuffer, byteOffset, options, index);\n return index;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {PotreeSourceOptions} from '../potree-source';\nimport {load} from '@loaders.gl/core';\nimport {Mesh} from '@loaders.gl/schema';\nimport {DataSource, resolvePath} from '@loaders.gl/loader-utils';\nimport {LASLoader} from '@loaders.gl/las';\nimport {PotreeBoundingBox, PotreeMetadata} from '../types/potree-metadata';\nimport {POTreeNode} from '../parsers/parse-potree-hierarchy-chunk';\nimport {PotreeHierarchyChunkLoader} from '../potree-hierarchy-chunk-loader';\nimport {PotreeLoader} from '../potree-loader';\nimport {parseVersion} from '../utils/parse-version';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {LASMesh} from '@loaders.gl/las/src/lib/las-types';\nimport {createProjection} from '../utils/projection-utils';\nimport {getCartographicOriginFromBoundingBox} from '../utils/bounding-box-utils';\n\n// https://github.com/visgl/deck.gl/blob/9548f43cba2234a1f4877b6b17f6c88eb35b2e08/modules/core/src/lib/constants.js#L27\n// Describes the format of positions\nexport enum COORDINATE_SYSTEM {\n /**\n * `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise\n */\n DEFAULT = -1,\n /**\n * Positions are interpreted as [lng, lat, elevation]\n * lng lat are degrees, elevation is meters. distances as meters.\n */\n LNGLAT = 1,\n /**\n * Positions are interpreted as meter offsets, distances as meters\n */\n METER_OFFSETS = 2,\n /**\n * Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]\n * deltaLng, deltaLat are delta degrees, elevation is meters.\n * distances as meters.\n */\n LNGLAT_OFFSETS = 3,\n /**\n * Non-geospatial\n */\n CARTESIAN = 0\n}\n\nexport interface PotreeNodeMesh extends LASMesh {\n cartographicOrigin: number[];\n coordinateSystem: number;\n}\n\n/**\n * A Potree data source\n * @version 1.0 - @see https://github.com/potree/potree/blob/1.0RC/docs/file_format.md\n * @version 1.7 - @see https://github.com/potree/potree/blob/1.7/docs/potree-file-format.md\n * @note Point cloud nodes tile source\n */\nexport class PotreeNodesSource extends DataSource<string, PotreeSourceOptions> {\n /** Dataset base URL */\n baseUrl: string = '';\n /** Meta information from `cloud.js` */\n metadata: PotreeMetadata | null = null;\n /** Root node */\n root: POTreeNode | null = null;\n /** Is data source ready to use after initial loading */\n isReady = false;\n /** local CRS to WGS84 projection */\n projection: Proj4Projection | null = null;\n /** The data set minimum bounding box */\n boundingBox?: PotreeBoundingBox;\n\n private initPromise: Promise<void> | null = null;\n\n /**\n * @constructor\n * @param data - if string - data set path url or path to `cloud.js` metadata file\n * - if Blob - single file data\n * @param options - data source properties\n */\n constructor(data: string, options: PotreeSourceOptions) {\n super(data, options);\n this.makeBaseUrl(this.data);\n\n this.initPromise = this.init();\n }\n\n /** Initial data source loading */\n async init() {\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n this.metadata = await load(`${this.baseUrl}/cloud.js`, PotreeLoader);\n this.projection = createProjection(this.metadata?.projection);\n this.parseBoundingVolume();\n\n await this.loadHierarchy();\n this.isReady = true;\n }\n\n /** Is data set supported */\n isSupported(): boolean {\n const {minor, major} = parseVersion(this.metadata?.version ?? '');\n return (\n this.isReady &&\n major === 1 &&\n minor <= 8 &&\n typeof this.metadata?.pointAttributes === 'string' &&\n ['LAS', 'LAZ'].includes(this.metadata?.pointAttributes)\n );\n }\n\n /** Get content files extension */\n getContentExtension(): string | null {\n if (!this.isReady) {\n return null;\n }\n switch (this.metadata?.pointAttributes) {\n case 'LAS':\n return 'las';\n case 'LAZ':\n return 'laz';\n default:\n return 'bin';\n }\n }\n\n /**\n * Load octree node content\n * @param nodeName name of a node, string of numbers in range 0..7\n * @return node content geometry or null if the node doesn't exist\n */\n async loadNodeContent(nodeName: string): Promise<Mesh | null> {\n await this.initPromise;\n\n if (!this.isSupported()) {\n return null;\n }\n\n const isAvailable = await this.isNodeAvailable(nodeName);\n if (isAvailable) {\n const result: PotreeNodeMesh = (await load(\n `${this.baseUrl}/${this.metadata?.octreeDir}/r/r${nodeName}.${this.getContentExtension()}`,\n LASLoader\n )) as PotreeNodeMesh;\n\n if (result) {\n result.cartographicOrigin = getCartographicOriginFromBoundingBox(\n this.projection,\n result.header?.boundingBox\n );\n const position = result.attributes.POSITION.value as Float32Array;\n for (let i = 0; i < (result.header?.vertexCount ?? 0); i++) {\n let vertex: Float32Array | number[] = position.slice(i * 3, i * 3 + 2);\n if (this.projection) {\n vertex = this.projection.project(Array.from(vertex));\n }\n\n const offsets = [\n vertex[0] - result.cartographicOrigin[0],\n vertex[1] - result.cartographicOrigin[1],\n position[i * 3 + 2] - result.cartographicOrigin[2]\n ];\n position.set(offsets, i * 3);\n }\n result.attributes.positions = result.attributes.POSITION;\n result.attributes.colors = result.attributes.COLOR_0;\n result.attributes.normals = result.attributes.NORMAL;\n\n result.coordinateSystem = COORDINATE_SYSTEM.LNGLAT_OFFSETS;\n return result;\n }\n }\n return null;\n }\n\n /**\n * Check if a node exists in the octree\n * @param nodeName name of a node, string of numbers in range 0..7\n * @returns true - the node does exist, false - the nodes doesn't exist\n */\n async isNodeAvailable(nodeName: string): Promise<boolean> {\n if (this.metadata?.hierarchy) {\n return this.metadata.hierarchy.findIndex((item) => item[0] === `r${nodeName}`) !== -1;\n }\n\n if (!this.root) {\n return false;\n }\n let currentParent = this.root;\n let name = '';\n let result = true;\n for (const char of nodeName) {\n const newName = `${name}${char}`;\n const node = currentParent.children.find((child) => child.name === newName);\n if (node) {\n currentParent = node;\n name = newName;\n } else {\n result = false;\n break;\n }\n }\n return result;\n }\n\n /**\n * Load data source hierarchy into tree of available nodes\n */\n private async loadHierarchy(): Promise<void> {\n this.root = await load(\n `${this.baseUrl}/${this.metadata?.octreeDir}/r/r.hrc`,\n PotreeHierarchyChunkLoader\n );\n }\n\n /**\n * Deduce base url from the input url sring\n * @param data - data source input data\n */\n private makeBaseUrl(data: string | Blob): void {\n this.baseUrl = typeof data === 'string' ? resolvePath(data) : '';\n if (this.baseUrl.endsWith('cloud.js')) {\n this.baseUrl = this.baseUrl.substring(0, -8);\n }\n if (this.baseUrl.endsWith('/')) {\n this.baseUrl = this.baseUrl.substring(0, -1);\n }\n }\n\n private parseBoundingVolume(): void {\n if (this.metadata?.projection && this.metadata.tightBoundingBox) {\n const projection = new Proj4Projection({\n from: this.metadata.projection,\n to: 'WGS84'\n });\n\n const {lx, ly, ux, uy} = this.metadata.tightBoundingBox;\n const lCoord = [lx, ly];\n const wgs84LCood = projection.project(lCoord);\n\n const uCoord = [ux, uy];\n const wgs84UCood = projection.project(uCoord);\n\n this.boundingBox = {\n ...this.metadata.tightBoundingBox,\n lx: wgs84LCood[0],\n ly: wgs84LCood[1],\n ux: wgs84UCood[0],\n uy: wgs84UCood[1]\n };\n } else {\n this.boundingBox = this.metadata?.tightBoundingBox;\n }\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport function parseVersion(version: string): {major: number; minor: number} {\n const parts = version.split('.').map(Number);\n return {major: parts[0], minor: parts[1]};\n}\n", "import {Proj4Projection} from '@math.gl/proj4';\n\n/**\n * Create projection from proj4 definition to WGS84\n * @param projectionData - proj4 definition\n * @returns projection instance\n */\nexport const createProjection = (projectionData?: string): Proj4Projection | null => {\n if (!projectionData) {\n return null;\n }\n return new Proj4Projection({\n from: projectionData,\n to: 'WGS84'\n });\n};\n", "import {Proj4Projection} from '@math.gl/proj4';\n\n/**\n * Calculate cartographic origin from Potree bounding box\n * @param projection - Proj4Projection instance to reproject coordinates\n * @param boundingBox - bounding box data\n * @returns - origin of boudngin box in [lng, lat, z] mode\n */\nexport const getCartographicOriginFromBoundingBox = (\n projection: Proj4Projection | null,\n boundingBox?: [number[], number[]]\n): number[] => {\n if (!boundingBox) {\n return [0, 0, 0];\n }\n const [minXOriginal, minYOriginal, minZ] = boundingBox[0];\n const [maxXOriginal, maxYOriginal, maxZ] = boundingBox[1];\n let minX = minXOriginal;\n let minY = minYOriginal;\n let maxX = maxXOriginal;\n let maxY = maxYOriginal;\n if (projection) {\n [minX, minY] = projection.project([minX, minY]);\n [maxX, maxY] = projection.project([maxX, maxY]);\n }\n return [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2, minZ + (maxZ - minZ) / 2];\n};\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Source, DataSourceOptions} from '@loaders.gl/loader-utils';\nimport {PotreeNodesSource} from './lib/potree-node-source';\n\nconst VERSION = '1.7';\n\nexport type PotreeSourceOptions = DataSourceOptions & {\n potree?: {};\n};\n\n/**\n * Creates point cloud data sources for Potree urls\n */\nexport const PotreeSource = {\n name: 'Potree',\n id: 'potree',\n module: 'potree',\n version: VERSION,\n extensions: ['bin', 'las', 'laz'],\n mimeTypes: ['application/octet-stream'],\n type: 'potree',\n fromUrl: true,\n fromBlob: true,\n\n defaultOptions: {\n potree: {}\n },\n\n testURL: (url: string) => url.endsWith('.js'),\n createDataSource: (url: string, options: PotreeSourceOptions) =>\n new PotreeNodesSource(url, options) // , PotreeNodesSource.defaultOptions)\n} as const satisfies Source<PotreeNodesSource>;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;ACQA,IAAM,UAAU,OAAoC,kBAAe;AAO5D,IAAM,eAAe;EAC1B,UAAU;EACV,WAAW;EAEX,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,YAAY,CAAC,IAAI;EACjB,WAAW,CAAC,kBAAkB;EAC9B,UAAU,CAAC,SAAS,KAAK,QAAQ,WAAW,KAAK;EACjD,OAAO,CAAC,SAAsB,KAAK,MAAM,IAAI,YAAW,EAAG,OAAO,IAAI,CAAC;EACvE,eAAe,CAAC,SAAS,KAAK,MAAM,IAAI;EACxC,SAAS;IACP,QAAQ,CAAA;;;;;ACwEN,SAAU,0BAA0B,aAAwB;AAChE,QAAM,cAAc,iBAAiB,WAAW;AAChD,SAAO,eAAe,WAAW;AACnC;AAQA,SAAS,iBAAiB,aAA0B,aAAa,GAAC;AAChE,QAAM,WAAW,IAAI,SAAS,WAAW;AAEzC,QAAM,QAAsB,CAAA;AAI5B,QAAM,gBAA4B,CAAA;AAClC,eAAa,UAAU,UAAU,YAAY,aAAa;AAE1D,QAAM,KAAK,aAAa;AACxB,QAAM,cAA4B,CAAC,aAAa;AAEhD,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,QAAQ,MAAM,MAAK;AACzB,QAAI,OAAO;AAEX,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,UAAU,MAAM,OAAO,YAAY,UAAU,GAAG;AAElD,cAAM,aAAyB,CAAA;AAC/B,qBAAa,UAAU,UAAU,YAAY,UAAU;AACvD,mBAAW,OAAO,MAAM,OAAO;AAE/B,cAAM,KAAK,UAAU;AACrB,oBAAY,KAAK,UAAU;AAC3B,cAAM,OAAO;MACf;AACA,aAAO,OAAO;IAChB;AAEA,QAAI,eAAe,SAAS,YAAY;AACtC;IACF;EACF;AAEA,SAAO;AACT;AASA,SAAS,UAAU,UAAoB,YAAoB,YAAsB;AAC/E,aAAW,SAAS,WAAW,UAAU,CAAA;AACzC,aAAW,OAAO,YAAY,SAAS,SAAS,UAAU;AAC1D,aAAW,OAAO,aAAa;AAC/B,aAAW,aAAa,SAAS,UAAU,aAAa,GAAG,IAAI;AAC/D,aAAW,OAAO;AAClB,gBAAc;AACd,SAAO;AACT;AAGA,SAAS,eAAe,WAAyB,UAA8B,CAAA,GAAE;AAC/E,QAAM,kBAAkB,EAAC,SAAS,IAAG;AACrC,YAAU,EAAC,GAAG,iBAAiB,GAAG,QAAO;AAEzC,QAAM,UAAsB,UAAU,CAAC;AACvC,QAAM,QAAQ,CAAA;AAEd,aAAW,QAAQ,WAAW;AAC5B,UAAM,EAAC,KAAI,IAAI;AAEf,UAAM,QAAQ,SAAS,KAAK,OAAO,KAAK,SAAS,CAAC,GAAG,EAAE;AACvD,UAAM,aAAa,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;AACpD,UAAM,aAAa,MAAM,UAAU;AACnC,UAAM,QAAQ,KAAK,SAAS;AAG5B,SAAK,QAAQ;AACb,SAAK,cAAc,QAAQ,KAAK,OAAO,UAAU;AACjD,SAAK,WAAW,CAAA;AAChB,SAAK,kBAAkB,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI;AAC7C,SAAK,YAAW,mCAAS,YAAW,KAAK,KAAK,IAAI,GAAG,KAAK;AAC1D,SAAK,OAAO;AACZ,SAAK,KAAK,KAAK;AAGf,QAAI,YAAY;AACd,iBAAW,SAAS,KAAK,IAAI;AAC7B,iBAAW,gBAAgB,KAAK,IAAI;IACtC;AAGA,UAAM,IAAI,IAAI;EAChB;AAGA,SAAO;AACT;;;AClMA,IAAMA,WAAU,OAAoC,kBAAe;AAG5D,IAAM,6BAA6B;EACxC,UAAU;EACV,WAAW;EAEX,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,SAASA;EACT,YAAY,CAAC,KAAK;EAClB,WAAW,CAAC,0BAA0B;;;EAGtC,OAAO,OAAO,aAAa,YAAY,0BAA0B,WAAW;EAC5E,WAAW,CAAC,aAAa,YAAY,0BAA0B,WAAW;EAC1E,SAAS;IACP,QAAQ,CAAA;;EAEV,QAAQ;;;;AC/BJ,SAAU,eACd,aACA,YACA,SACA,OAAU;AAEV,SAAO;AACT;;;ACGO,IAAM,kBAAkB;EAC7B,UAAU;EACV,WAAW;EAEX,MAAM;EACN,IAAI;EACJ,YAAY,CAAC,KAAK;EAClB,WAAW,CAAC,0BAA0B;;;EAGtC;EACA,QAAQ;EACR,SAAS,CAAA;;;AAIX,SAAS,UAAU,aAA0B,SAAuB;AAClE,QAAM,QAAQ,CAAA;AACd,QAAM,aAAa;AACnB,iBAAe,aAAa,YAAY,SAAS,KAAK;AACtD,SAAO;AACT;;;AC1BA,kBAAmB;AAEnB,0BAAsC;AACtC,iBAAwB;;;ACJlB,SAAU,aAAa,SAAe;AAC1C,QAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3C,SAAO,EAAC,OAAO,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,EAAC;AAC1C;;;ADOA,IAAAC,gBAA8B;;;AEd9B,mBAA8B;AAOvB,IAAM,mBAAmB,CAAC,mBAAmD;AAClF,MAAI,CAAC,gBAAgB;AACnB,WAAO;EACT;AACA,SAAO,IAAI,6BAAgB;IACzB,MAAM;IACN,IAAI;GACL;AACH;;;ACPO,IAAM,uCAAuC,CAClD,YACA,gBACY;AACZ,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC,GAAG,GAAG,CAAC;EACjB;AACA,QAAM,CAAC,cAAc,cAAc,IAAI,IAAI,YAAY,CAAC;AACxD,QAAM,CAAC,cAAc,cAAc,IAAI,IAAI,YAAY,CAAC;AACxD,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,YAAY;AACd,KAAC,MAAM,IAAI,IAAI,WAAW,QAAQ,CAAC,MAAM,IAAI,CAAC;AAC9C,KAAC,MAAM,IAAI,IAAI,WAAW,QAAQ,CAAC,MAAM,IAAI,CAAC;EAChD;AACA,SAAO,CAAC,QAAQ,OAAO,QAAQ,GAAG,QAAQ,OAAO,QAAQ,GAAG,QAAQ,OAAO,QAAQ,CAAC;AACtF;;;AHLA,IAAY;CAAZ,SAAYC,oBAAiB;AAI3B,EAAAA,mBAAAA,mBAAA,SAAA,IAAA,EAAA,IAAA;AAKA,EAAAA,mBAAAA,mBAAA,QAAA,IAAA,CAAA,IAAA;AAIA,EAAAA,mBAAAA,mBAAA,eAAA,IAAA,CAAA,IAAA;AAMA,EAAAA,mBAAAA,mBAAA,gBAAA,IAAA,CAAA,IAAA;AAIA,EAAAA,mBAAAA,mBAAA,WAAA,IAAA,CAAA,IAAA;AACF,GAxBY,sBAAA,oBAAiB,CAAA,EAAA;AAqCvB,IAAO,oBAAP,cAAiC,+BAAuC;;EAE5E,UAAkB;;EAElB,WAAkC;;EAElC,OAA0B;;EAE1B,UAAU;;EAEV,aAAqC;;EAErC;EAEQ,cAAoC;;;;;;;EAQ5C,YAAY,MAAc,SAA4B;AACpD,UAAM,MAAM,OAAO;AACnB,SAAK,YAAY,KAAK,IAAI;AAE1B,SAAK,cAAc,KAAK,KAAI;EAC9B;;EAGA,MAAM,OAAI;AAxFZ;AAyFI,QAAI,KAAK,aAAa;AACpB,YAAM,KAAK;AACX;IACF;AACA,SAAK,WAAW,UAAM,kBAAK,GAAG,KAAK,oBAAoB,YAAY;AACnE,SAAK,aAAa,kBAAiB,UAAK,aAAL,mBAAe,UAAU;AAC5D,SAAK,oBAAmB;AAExB,UAAM,KAAK,cAAa;AACxB,SAAK,UAAU;EACjB;;EAGA,cAAW;AAtGb;AAuGI,UAAM,EAAC,OAAO,MAAK,IAAI,eAAa,UAAK,aAAL,mBAAe,YAAW,EAAE;AAChE,WACE,KAAK,WACL,UAAU,KACV,SAAS,KACT,SAAO,UAAK,aAAL,mBAAe,qBAAoB,YAC1C,CAAC,OAAO,KAAK,EAAE,UAAS,UAAK,aAAL,mBAAe,eAAe;EAE1D;;EAGA,sBAAmB;AAlHrB;AAmHI,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO;IACT;AACA,aAAQ,UAAK,aAAL,mBAAe,iBAAiB;MACtC,KAAK;AACH,eAAO;MACT,KAAK;AACH,eAAO;MACT;AACE,eAAO;IACX;EACF;;;;;;EAOA,MAAM,gBAAgB,UAAgB;AArIxC;AAsII,UAAM,KAAK;AAEX,QAAI,CAAC,KAAK,YAAW,GAAI;AACvB,aAAO;IACT;AAEA,UAAM,cAAc,MAAM,KAAK,gBAAgB,QAAQ;AACvD,QAAI,aAAa;AACf,YAAM,SAA0B,UAAM,kBACpC,GAAG,KAAK,YAAW,UAAK,aAAL,mBAAe,gBAAgB,YAAY,KAAK,oBAAmB,KACtF,oBAAS;AAGX,UAAI,QAAQ;AACV,eAAO,qBAAqB,qCAC1B,KAAK,aACL,YAAO,WAAP,mBAAe,WAAW;AAE5B,cAAM,WAAW,OAAO,WAAW,SAAS;AAC5C,iBAAS,IAAI,GAAG,OAAK,YAAO,WAAP,mBAAe,gBAAe,IAAI,KAAK;AAC1D,cAAI,SAAkC,SAAS,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;AACrE,cAAI,KAAK,YAAY;AACnB,qBAAS,KAAK,WAAW,QAAQ,MAAM,KAAK,MAAM,CAAC;UACrD;AAEA,gBAAM,UAAU;YACd,OAAO,CAAC,IAAI,OAAO,mBAAmB,CAAC;YACvC,OAAO,CAAC,IAAI,OAAO,mBAAmB,CAAC;YACvC,SAAS,IAAI,IAAI,CAAC,IAAI,OAAO,mBAAmB,CAAC;;AAEnD,mBAAS,IAAI,SAAS,IAAI,CAAC;QAC7B;AACA,eAAO,WAAW,YAAY,OAAO,WAAW;AAChD,eAAO,WAAW,SAAS,OAAO,WAAW;AAC7C,eAAO,WAAW,UAAU,OAAO,WAAW;AAE9C,eAAO,mBAAmB,kBAAkB;AAC5C,eAAO;MACT;IACF;AACA,WAAO;EACT;;;;;;EAOA,MAAM,gBAAgB,UAAgB;AAtLxC;AAuLI,SAAI,UAAK,aAAL,mBAAe,WAAW;AAC5B,aAAO,KAAK,SAAS,UAAU,UAAU,CAAC,SAAS,KAAK,CAAC,MAAM,IAAI,UAAU,MAAM;IACrF;AAEA,QAAI,CAAC,KAAK,MAAM;AACd,aAAO;IACT;AACA,QAAI,gBAAgB,KAAK;AACzB,QAAI,OAAO;AACX,QAAI,SAAS;AACb,eAAW,QAAQ,UAAU;AAC3B,YAAM,UAAU,GAAG,OAAO;AAC1B,YAAM,OAAO,cAAc,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,OAAO;AAC1E,UAAI,MAAM;AACR,wBAAgB;AAChB,eAAO;MACT,OAAO;AACL,iBAAS;AACT;MACF;IACF;AACA,WAAO;EACT;;;;EAKQ,MAAM,gBAAa;AAlN7B;AAmNI,SAAK,OAAO,UAAM,kBAChB,GAAG,KAAK,YAAW,UAAK,aAAL,mBAAe,qBAClC,0BAA0B;EAE9B;;;;;EAMQ,YAAY,MAAmB;AACrC,SAAK,UAAU,OAAO,SAAS,eAAW,iCAAY,IAAI,IAAI;AAC9D,QAAI,KAAK,QAAQ,SAAS,UAAU,GAAG;AACrC,WAAK,UAAU,KAAK,QAAQ,UAAU,GAAG,EAAE;IAC7C;AACA,QAAI,KAAK,QAAQ,SAAS,GAAG,GAAG;AAC9B,WAAK,UAAU,KAAK,QAAQ,UAAU,GAAG,EAAE;IAC7C;EACF;EAEQ,sBAAmB;AAvO7B;AAwOI,UAAI,UAAK,aAAL,mBAAe,eAAc,KAAK,SAAS,kBAAkB;AAC/D,YAAM,aAAa,IAAI,8BAAgB;QACrC,MAAM,KAAK,SAAS;QACpB,IAAI;OACL;AAED,YAAM,EAAC,IAAI,IAAI,IAAI,GAAE,IAAI,KAAK,SAAS;AACvC,YAAM,SAAS,CAAC,IAAI,EAAE;AACtB,YAAM,aAAa,WAAW,QAAQ,MAAM;AAE5C,YAAM,SAAS,CAAC,IAAI,EAAE;AACtB,YAAM,aAAa,WAAW,QAAQ,MAAM;AAE5C,WAAK,cAAc;QACjB,GAAG,KAAK,SAAS;QACjB,IAAI,WAAW,CAAC;QAChB,IAAI,WAAW,CAAC;QAChB,IAAI,WAAW,CAAC;QAChB,IAAI,WAAW,CAAC;;IAEpB,OAAO;AACL,WAAK,eAAc,UAAK,aAAL,mBAAe;IACpC;EACF;;;;AIxPF,IAAMC,WAAU;AAST,IAAM,eAAe;EAC1B,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,SAASA;EACT,YAAY,CAAC,OAAO,OAAO,KAAK;EAChC,WAAW,CAAC,0BAA0B;EACtC,MAAM;EACN,SAAS;EACT,UAAU;EAEV,gBAAgB;IACd,QAAQ,CAAA;;EAGV,SAAS,CAAC,QAAgB,IAAI,SAAS,KAAK;EAC5C,kBAAkB,CAAC,KAAa,YAC9B,IAAI,kBAAkB,KAAK,OAAO;;;",
|
|
6
|
+
"names": ["VERSION", "import_proj4", "COORDINATE_SYSTEM", "VERSION"]
|
|
7
7
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { PotreeLoader } from "./potree-loader.js";
|
|
|
2
2
|
export { PotreeHierarchyChunkLoader } from "./potree-hierarchy-chunk-loader.js";
|
|
3
3
|
export { PotreeBinLoader } from "./potree-bin-loader.js";
|
|
4
4
|
export { PotreeSource } from "./potree-source.js";
|
|
5
|
+
export { type POTreeNode } from "./parsers/parse-potree-hierarchy-chunk.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,0BAA0B,EAAC,2CAAwC;AAC3E,OAAO,EAAC,eAAe,EAAC,+BAA4B;AACpD,OAAO,EAAC,YAAY,EAAC,2BAAwB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,0BAA0B,EAAC,2CAAwC;AAC3E,OAAO,EAAC,eAAe,EAAC,+BAA4B;AACpD,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAE7C,OAAO,EAAC,KAAK,UAAU,EAAC,kDAA+C"}
|
package/dist/index.js
CHANGED
|
@@ -2,3 +2,4 @@ export { PotreeLoader } from "./potree-loader.js";
|
|
|
2
2
|
export { PotreeHierarchyChunkLoader } from "./potree-hierarchy-chunk-loader.js";
|
|
3
3
|
export { PotreeBinLoader } from "./potree-bin-loader.js";
|
|
4
4
|
export { PotreeSource } from "./potree-source.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,0BAA0B,EAAC,2CAAwC;AAC3E,OAAO,EAAC,eAAe,EAAC,+BAA4B;AACpD,OAAO,EAAC,YAAY,EAAC,2BAAwB"}
|
package/dist/lib/octree.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"octree.js","sourceRoot":"","sources":["../../src/lib/octree.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,39 @@
|
|
|
1
|
+
import type { PotreeSourceOptions } from "../potree-source.js";
|
|
1
2
|
import { Mesh } from '@loaders.gl/schema';
|
|
2
3
|
import { DataSource } from '@loaders.gl/loader-utils';
|
|
3
|
-
import { PotreeMetadata } from "../types/potree-metadata.js";
|
|
4
|
+
import { PotreeBoundingBox, PotreeMetadata } from "../types/potree-metadata.js";
|
|
4
5
|
import { POTreeNode } from "../parsers/parse-potree-hierarchy-chunk.js";
|
|
5
|
-
import
|
|
6
|
+
import { Proj4Projection } from '@math.gl/proj4';
|
|
7
|
+
import { LASMesh } from '@loaders.gl/las/src/lib/las-types';
|
|
8
|
+
export declare enum COORDINATE_SYSTEM {
|
|
9
|
+
/**
|
|
10
|
+
* `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise
|
|
11
|
+
*/
|
|
12
|
+
DEFAULT = -1,
|
|
13
|
+
/**
|
|
14
|
+
* Positions are interpreted as [lng, lat, elevation]
|
|
15
|
+
* lng lat are degrees, elevation is meters. distances as meters.
|
|
16
|
+
*/
|
|
17
|
+
LNGLAT = 1,
|
|
18
|
+
/**
|
|
19
|
+
* Positions are interpreted as meter offsets, distances as meters
|
|
20
|
+
*/
|
|
21
|
+
METER_OFFSETS = 2,
|
|
22
|
+
/**
|
|
23
|
+
* Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]
|
|
24
|
+
* deltaLng, deltaLat are delta degrees, elevation is meters.
|
|
25
|
+
* distances as meters.
|
|
26
|
+
*/
|
|
27
|
+
LNGLAT_OFFSETS = 3,
|
|
28
|
+
/**
|
|
29
|
+
* Non-geospatial
|
|
30
|
+
*/
|
|
31
|
+
CARTESIAN = 0
|
|
32
|
+
}
|
|
33
|
+
export interface PotreeNodeMesh extends LASMesh {
|
|
34
|
+
cartographicOrigin: number[];
|
|
35
|
+
coordinateSystem: number;
|
|
36
|
+
}
|
|
6
37
|
/**
|
|
7
38
|
* A Potree data source
|
|
8
39
|
* @version 1.0 - @see https://github.com/potree/potree/blob/1.0RC/docs/file_format.md
|
|
@@ -18,6 +49,10 @@ export declare class PotreeNodesSource extends DataSource<string, PotreeSourceOp
|
|
|
18
49
|
root: POTreeNode | null;
|
|
19
50
|
/** Is data source ready to use after initial loading */
|
|
20
51
|
isReady: boolean;
|
|
52
|
+
/** local CRS to WGS84 projection */
|
|
53
|
+
projection: Proj4Projection | null;
|
|
54
|
+
/** The data set minimum bounding box */
|
|
55
|
+
boundingBox?: PotreeBoundingBox;
|
|
21
56
|
private initPromise;
|
|
22
57
|
/**
|
|
23
58
|
* @constructor
|
|
@@ -34,16 +69,16 @@ export declare class PotreeNodesSource extends DataSource<string, PotreeSourceOp
|
|
|
34
69
|
getContentExtension(): string | null;
|
|
35
70
|
/**
|
|
36
71
|
* Load octree node content
|
|
37
|
-
* @param
|
|
72
|
+
* @param nodeName name of a node, string of numbers in range 0..7
|
|
38
73
|
* @return node content geometry or null if the node doesn't exist
|
|
39
74
|
*/
|
|
40
|
-
loadNodeContent(
|
|
75
|
+
loadNodeContent(nodeName: string): Promise<Mesh | null>;
|
|
41
76
|
/**
|
|
42
77
|
* Check if a node exists in the octree
|
|
43
|
-
* @param
|
|
78
|
+
* @param nodeName name of a node, string of numbers in range 0..7
|
|
44
79
|
* @returns true - the node does exist, false - the nodes doesn't exist
|
|
45
80
|
*/
|
|
46
|
-
isNodeAvailable(
|
|
81
|
+
isNodeAvailable(nodeName: string): Promise<boolean>;
|
|
47
82
|
/**
|
|
48
83
|
* Load data source hierarchy into tree of available nodes
|
|
49
84
|
*/
|
|
@@ -53,5 +88,6 @@ export declare class PotreeNodesSource extends DataSource<string, PotreeSourceOp
|
|
|
53
88
|
* @param data - data source input data
|
|
54
89
|
*/
|
|
55
90
|
private makeBaseUrl;
|
|
91
|
+
private parseBoundingVolume;
|
|
56
92
|
}
|
|
57
93
|
//# sourceMappingURL=potree-node-source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"potree-node-source.d.ts","sourceRoot":"","sources":["../../src/lib/potree-node-source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"potree-node-source.d.ts","sourceRoot":"","sources":["../../src/lib/potree-node-source.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,mBAAmB,EAAC,4BAAyB;AAE1D,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAC,UAAU,EAAc,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAC,iBAAiB,EAAE,cAAc,EAAC,oCAAiC;AAC3E,OAAO,EAAC,UAAU,EAAC,mDAAgD;AAInE,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAC,OAAO,EAAC,MAAM,mCAAmC,CAAC;AAM1D,oBAAY,iBAAiB;IAC3B;;OAEG;IACH,OAAO,KAAK;IACZ;;;OAGG;IACH,MAAM,IAAI;IACV;;OAEG;IACH,aAAa,IAAI;IACjB;;;;OAIG;IACH,cAAc,IAAI;IAClB;;OAEG;IACH,SAAS,IAAI;CACd;AAED,MAAM,WAAW,cAAe,SAAQ,OAAO;IAC7C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAC5E,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAM;IACrB,uCAAuC;IACvC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAQ;IACvC,gBAAgB;IAChB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAQ;IAC/B,wDAAwD;IACxD,OAAO,UAAS;IAChB,oCAAoC;IACpC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAQ;IAC1C,wCAAwC;IACxC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEhC,OAAO,CAAC,WAAW,CAA8B;IAEjD;;;;;OAKG;gBACS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB;IAOtD,kCAAkC;IAC5B,IAAI;IAaV,4BAA4B;IAC5B,WAAW,IAAI,OAAO;IAWtB,kCAAkC;IAClC,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAcpC;;;;OAIG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA4C7D;;;;OAIG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBzD;;OAEG;YACW,aAAa;IAO3B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,mBAAmB;CAyB5B"}
|
|
@@ -7,6 +7,37 @@ import { LASLoader } from '@loaders.gl/las';
|
|
|
7
7
|
import { PotreeHierarchyChunkLoader } from "../potree-hierarchy-chunk-loader.js";
|
|
8
8
|
import { PotreeLoader } from "../potree-loader.js";
|
|
9
9
|
import { parseVersion } from "../utils/parse-version.js";
|
|
10
|
+
import { Proj4Projection } from '@math.gl/proj4';
|
|
11
|
+
import { createProjection } from "../utils/projection-utils.js";
|
|
12
|
+
import { getCartographicOriginFromBoundingBox } from "../utils/bounding-box-utils.js";
|
|
13
|
+
// https://github.com/visgl/deck.gl/blob/9548f43cba2234a1f4877b6b17f6c88eb35b2e08/modules/core/src/lib/constants.js#L27
|
|
14
|
+
// Describes the format of positions
|
|
15
|
+
export var COORDINATE_SYSTEM;
|
|
16
|
+
(function (COORDINATE_SYSTEM) {
|
|
17
|
+
/**
|
|
18
|
+
* `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise
|
|
19
|
+
*/
|
|
20
|
+
COORDINATE_SYSTEM[COORDINATE_SYSTEM["DEFAULT"] = -1] = "DEFAULT";
|
|
21
|
+
/**
|
|
22
|
+
* Positions are interpreted as [lng, lat, elevation]
|
|
23
|
+
* lng lat are degrees, elevation is meters. distances as meters.
|
|
24
|
+
*/
|
|
25
|
+
COORDINATE_SYSTEM[COORDINATE_SYSTEM["LNGLAT"] = 1] = "LNGLAT";
|
|
26
|
+
/**
|
|
27
|
+
* Positions are interpreted as meter offsets, distances as meters
|
|
28
|
+
*/
|
|
29
|
+
COORDINATE_SYSTEM[COORDINATE_SYSTEM["METER_OFFSETS"] = 2] = "METER_OFFSETS";
|
|
30
|
+
/**
|
|
31
|
+
* Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]
|
|
32
|
+
* deltaLng, deltaLat are delta degrees, elevation is meters.
|
|
33
|
+
* distances as meters.
|
|
34
|
+
*/
|
|
35
|
+
COORDINATE_SYSTEM[COORDINATE_SYSTEM["LNGLAT_OFFSETS"] = 3] = "LNGLAT_OFFSETS";
|
|
36
|
+
/**
|
|
37
|
+
* Non-geospatial
|
|
38
|
+
*/
|
|
39
|
+
COORDINATE_SYSTEM[COORDINATE_SYSTEM["CARTESIAN"] = 0] = "CARTESIAN";
|
|
40
|
+
})(COORDINATE_SYSTEM || (COORDINATE_SYSTEM = {}));
|
|
10
41
|
/**
|
|
11
42
|
* A Potree data source
|
|
12
43
|
* @version 1.0 - @see https://github.com/potree/potree/blob/1.0RC/docs/file_format.md
|
|
@@ -22,6 +53,10 @@ export class PotreeNodesSource extends DataSource {
|
|
|
22
53
|
root = null;
|
|
23
54
|
/** Is data source ready to use after initial loading */
|
|
24
55
|
isReady = false;
|
|
56
|
+
/** local CRS to WGS84 projection */
|
|
57
|
+
projection = null;
|
|
58
|
+
/** The data set minimum bounding box */
|
|
59
|
+
boundingBox;
|
|
25
60
|
initPromise = null;
|
|
26
61
|
/**
|
|
27
62
|
* @constructor
|
|
@@ -41,6 +76,8 @@ export class PotreeNodesSource extends DataSource {
|
|
|
41
76
|
return;
|
|
42
77
|
}
|
|
43
78
|
this.metadata = await load(`${this.baseUrl}/cloud.js`, PotreeLoader);
|
|
79
|
+
this.projection = createProjection(this.metadata?.projection);
|
|
80
|
+
this.parseBoundingVolume();
|
|
44
81
|
await this.loadHierarchy();
|
|
45
82
|
this.isReady = true;
|
|
46
83
|
}
|
|
@@ -69,28 +106,49 @@ export class PotreeNodesSource extends DataSource {
|
|
|
69
106
|
}
|
|
70
107
|
/**
|
|
71
108
|
* Load octree node content
|
|
72
|
-
* @param
|
|
109
|
+
* @param nodeName name of a node, string of numbers in range 0..7
|
|
73
110
|
* @return node content geometry or null if the node doesn't exist
|
|
74
111
|
*/
|
|
75
|
-
async loadNodeContent(
|
|
112
|
+
async loadNodeContent(nodeName) {
|
|
76
113
|
await this.initPromise;
|
|
77
114
|
if (!this.isSupported()) {
|
|
78
115
|
return null;
|
|
79
116
|
}
|
|
80
|
-
const isAvailable = await this.isNodeAvailable(
|
|
117
|
+
const isAvailable = await this.isNodeAvailable(nodeName);
|
|
81
118
|
if (isAvailable) {
|
|
82
|
-
|
|
119
|
+
const result = (await load(`${this.baseUrl}/${this.metadata?.octreeDir}/r/r${nodeName}.${this.getContentExtension()}`, LASLoader));
|
|
120
|
+
if (result) {
|
|
121
|
+
result.cartographicOrigin = getCartographicOriginFromBoundingBox(this.projection, result.header?.boundingBox);
|
|
122
|
+
const position = result.attributes.POSITION.value;
|
|
123
|
+
for (let i = 0; i < (result.header?.vertexCount ?? 0); i++) {
|
|
124
|
+
let vertex = position.slice(i * 3, i * 3 + 2);
|
|
125
|
+
if (this.projection) {
|
|
126
|
+
vertex = this.projection.project(Array.from(vertex));
|
|
127
|
+
}
|
|
128
|
+
const offsets = [
|
|
129
|
+
vertex[0] - result.cartographicOrigin[0],
|
|
130
|
+
vertex[1] - result.cartographicOrigin[1],
|
|
131
|
+
position[i * 3 + 2] - result.cartographicOrigin[2]
|
|
132
|
+
];
|
|
133
|
+
position.set(offsets, i * 3);
|
|
134
|
+
}
|
|
135
|
+
result.attributes.positions = result.attributes.POSITION;
|
|
136
|
+
result.attributes.colors = result.attributes.COLOR_0;
|
|
137
|
+
result.attributes.normals = result.attributes.NORMAL;
|
|
138
|
+
result.coordinateSystem = COORDINATE_SYSTEM.LNGLAT_OFFSETS;
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
83
141
|
}
|
|
84
142
|
return null;
|
|
85
143
|
}
|
|
86
144
|
/**
|
|
87
145
|
* Check if a node exists in the octree
|
|
88
|
-
* @param
|
|
146
|
+
* @param nodeName name of a node, string of numbers in range 0..7
|
|
89
147
|
* @returns true - the node does exist, false - the nodes doesn't exist
|
|
90
148
|
*/
|
|
91
|
-
async isNodeAvailable(
|
|
149
|
+
async isNodeAvailable(nodeName) {
|
|
92
150
|
if (this.metadata?.hierarchy) {
|
|
93
|
-
return this.metadata.hierarchy.findIndex((item) => item[0] === `r${
|
|
151
|
+
return this.metadata.hierarchy.findIndex((item) => item[0] === `r${nodeName}`) !== -1;
|
|
94
152
|
}
|
|
95
153
|
if (!this.root) {
|
|
96
154
|
return false;
|
|
@@ -98,8 +156,8 @@ export class PotreeNodesSource extends DataSource {
|
|
|
98
156
|
let currentParent = this.root;
|
|
99
157
|
let name = '';
|
|
100
158
|
let result = true;
|
|
101
|
-
for (const
|
|
102
|
-
const newName = `${name}${
|
|
159
|
+
for (const char of nodeName) {
|
|
160
|
+
const newName = `${name}${char}`;
|
|
103
161
|
const node = currentParent.children.find((child) => child.name === newName);
|
|
104
162
|
if (node) {
|
|
105
163
|
currentParent = node;
|
|
@@ -131,4 +189,28 @@ export class PotreeNodesSource extends DataSource {
|
|
|
131
189
|
this.baseUrl = this.baseUrl.substring(0, -1);
|
|
132
190
|
}
|
|
133
191
|
}
|
|
192
|
+
parseBoundingVolume() {
|
|
193
|
+
if (this.metadata?.projection && this.metadata.tightBoundingBox) {
|
|
194
|
+
const projection = new Proj4Projection({
|
|
195
|
+
from: this.metadata.projection,
|
|
196
|
+
to: 'WGS84'
|
|
197
|
+
});
|
|
198
|
+
const { lx, ly, ux, uy } = this.metadata.tightBoundingBox;
|
|
199
|
+
const lCoord = [lx, ly];
|
|
200
|
+
const wgs84LCood = projection.project(lCoord);
|
|
201
|
+
const uCoord = [ux, uy];
|
|
202
|
+
const wgs84UCood = projection.project(uCoord);
|
|
203
|
+
this.boundingBox = {
|
|
204
|
+
...this.metadata.tightBoundingBox,
|
|
205
|
+
lx: wgs84LCood[0],
|
|
206
|
+
ly: wgs84LCood[1],
|
|
207
|
+
ux: wgs84UCood[0],
|
|
208
|
+
uy: wgs84UCood[1]
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
this.boundingBox = this.metadata?.tightBoundingBox;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
134
215
|
}
|
|
216
|
+
//# sourceMappingURL=potree-node-source.js.map
|