@loaders.gl/potree
Version:
potree loaders for large point clouds.
8 lines (7 loc) • 27.9 kB
Source Map (JSON)
{
"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"],
"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"],
"mappings": "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",
"names": ["VERSION", "import_proj4", "COORDINATE_SYSTEM", "VERSION"]
}