@csi-foxbyte/cityjson-to-3d-tiles
Version:
A Node.js library that converts CityJSON files into Cesium 3D Tilesβcomplete with automatic texture atlas packing, Basis compression, three LOD levels, and customizable threading.
129 lines (95 loc) β’ 5.4 kB
Markdown
A Node.js library for converting [CityJSON](https://www.cityjson.org/) files into [Cesium 3D Tiles](https://cesium.com/3d-tiles/) with automatic texture packing and Basis compression. Supports generating three levels of detail (LODs) for different distance ranges.
- [Features](
- [Installation](
- [Usage](
- [API](
- [Options Overview](
- [CLI Wrapper Example](
- [Contributing](
- [License](
- **ποΈ CityJSON to Tile Database**: Parses CityJSON files and builds a tile database optimized for 3D Tiles generation. π οΈ
- **πΊοΈ 3D Tiles Generation**: Converts the tile database into Cesium 3D Tiles, including geometry, textures, and metadata. π¨
- **πΌοΈ Automatic Texture Packing**: Packs textures into atlases and compresses them with [Basis](https://github.com/BinomialLLC/basis_universal) for efficient streaming. β‘
- **π Multiple LODs**: Generates three LODs (LOD0, LOD1, LOD2) to balance detail and performance based on camera distance. π
- **π§΅ Customizable Threading**: Control the number of worker threads for CPU-bound tasks. π‘οΈ
## π₯ Installation
```bash
npm install cityjson-to-3d-tiles
```
## π» Usage
```js
import { generate3DTilesFromTileDatabase } from "cityjson-to-3d-tiles/3dtiles/index.js";
import { generateTileDatabaseFromCityJSON } from "cityjson-to-3d-tiles/cityjson/index.js";
const inputFolder = "D:\\generator_test\\src"; // Folder containing CityJSON files π
const appearance = "rgbTexture"; // Texture appearance (e.g., "rgbTexture", "vertexColor") π¨
const outputFolder = "D:\\generator_test"; // Base output folder for the tile database and tiles π
(async () => {
// Step 1: Convert CityJSON to an on-disk tile database ποΈ
const { dbFilePath } = await generateTileDatabaseFromCityJSON(
inputFolder, // Source folder
outputFolder, // Destination folder
appearance, // Appearance mode
console.log, // Progress callback π
{ threadCount: 1 } // Options: number of worker threads π§΅
);
// Step 2: Generate Cesium 3D Tiles from the tile database π οΈ
await generate3DTilesFromTileDatabase(
dbFilePath, // Path to the generated tile database
"D:\\generator_test\\tiles", // Output folder for 3D Tiles ποΈ
console.log, // Progress callback π
{ threadCount: 1 } // Options: number of worker threads π§
);
})();
export { generate3DTilesFromTileDatabase, generateTileDatabaseFromCityJSON };
```
- **inputFolder** `(string)` β Path to a directory containing CityJSON files. π
- **outputFolder** `(string)` β Directory where the tile database will be created. π
- **appearance** `(string)` β Appearance mode: `"rgbTexture"` for textured meshes or `"vertexColor"` for vertex-colored output. π
- **progressCallback** `(function)` β Function called with log messages or progress updates. π’
- **options** `(object)`:
- `threadCount` `(number)` β Number of worker threads to use (default: number of CPU cores). π§΅
**Returns:** A promise that resolves with an object containing:
- `dbFilePath` `(string)` β File path to the generated tile database (.db file). π
### `generate3DTilesFromTileDatabase(dbFilePath, tilesOutputFolder, progressCallback, options)`
- **dbFilePath** `(string)` β Path to the tile database generated in the previous step. π
- **tilesOutputFolder** `(string)` β Directory where the Cesium 3D Tiles will be written. ποΈ
- **progressCallback** `(function)` β Function called with log messages or progress updates. π
- **options** `(object)`:
- `threadCount` `(number)` β Number of worker threads for tile generation (default: number of CPU cores). π§΅
**Returns:** A promise that resolves when 3D Tiles generation is complete. β
## π οΈ Options Overview
| Option | Default | Description |
| ------------- | ------------------ | ---------------------------------------------------- |
| `appearance` | `"rgbTexture"` | Texture mode (`"rgbTexture"` or `"vertexColor"`). π¨ |
| `threadCount` | `os.cpus().length` | Number of parallel worker threads. π§΅ |
## π CLI Wrapper Example
Wrap the functions in a simple CLI script:
```js
#!/usr/bin/env node
import path from "path";
import { generateTileDatabaseFromCityJSON } from "cityjson-to-3d-tiles/cityjson/index.js";
import { generate3DTilesFromTileDatabase } from "cityjson-to-3d-tiles/3dtiles/index.js";
const [, , src, out, appearance] = process.argv;
(async () => {
const { dbFilePath } = await generateTileDatabaseFromCityJSON(
path.resolve(src),
path.resolve(out),
appearance || "rgbTexture",
console.log,
{ threadCount: 4 }
);
await generate3DTilesFromTileDatabase(
dbFilePath,
path.join(out, "tiles"),
console.log,
{ threadCount: 4 }
);
})();
```
Contributions are welcome! Please open issues or pull requests on the GitHub repository. π