@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.
2 lines • 2.44 kB
JavaScript
import {rm,mkdir,writeFile}from'fs/promises';import {Box3,Vector3,Box2,Vector2}from'three';import {Cartographic}from'cesium';import {Worker}from'worker_threads';import {PromisePool}from'@supercharge/promise-pool/dist/index.js';import {Grid2D}from'../grid2d/index.js';import {calculateBBoxVolume}from'./calculateBoundingVolume.js';import {WorkerPool}from'../cityjson/workerPool.js';import {createDatabase}from'../database/index.js';import p from'path';async function N(c,o,f,w={}){try{await rm(o,{force:!0,recursive:!0});}catch{}try{await mkdir(o,{recursive:!0});}catch{}const{threadCount:l=4}=w,d=[],e=new Box3;await(await createDatabase(c,false)).each("SELECT name, bbMinX, bbMinY, bbMinZ, bbMaxX, bbMaxY, isInstanced, bbMaxZ, attributes, type FROM data",(i,t)=>{const n=new Cartographic(t.bbMinX,t.bbMinY,t.bbMinZ),r=new Cartographic(t.bbMaxX,t.bbMaxY,t.bbMaxZ),M=new Box3(new Vector3(n.longitude,n.latitude,n.height),new Vector3(r.longitude,r.latitude,r.height));e.union(M);const W=t.name;d.push({minX:n.longitude,maxX:r.longitude,minY:n.latitude,maxY:r.latitude,name:W,isInstanced:t.isInstanced===1,minHeight:n.height,maxHeight:r.height,attributes:JSON.parse(t.attributes??{}),type:t.type,region:[n.longitude,n.latitude,r.longitude,r.latitude,n.height,r.height]});});const a={refine:"ADD",geometricError:calculateBBoxVolume(e),boundingVolume:{region:[e.min.x,e.min.y,e.max.x,e.max.y,e.min.z,e.max.z]},children:[]},m=new Grid2D(new Box2(new Vector2(e.min.x,e.min.y),new Vector2(e.max.x,e.max.y)),2e-4);for(const i of d)m.add((i.maxX-i.minX)*.5+i.minX,(i.maxY-i.minY)*.5+i.minY,i);let b=0;const k=new WorkerPool(()=>new Worker(new URL("./worker.js",import.meta.url)),l);await PromisePool.withConcurrency(l).for(m.cells).process(async i=>{try{const t=await k.run({data:{cell:i,outputFolder:o,databasePath:c},type:"work"});if(!t)return;a.children.push(t),await writeFile(p.join(o,"tileset.json"),JSON.stringify({asset:{version:"1.1"},geometricError:calculateBBoxVolume(e),boundingVolume:{region:[e.min.x,e.min.y,e.max.x,e.max.y,e.min.z,e.max.z]},root:a},void 0,4));}catch(t){console.error(t);}b++,f(b/m.cells.length);}),await writeFile(p.join(o,"tileset.json"),JSON.stringify({asset:{version:"1.1"},geometricError:calculateBBoxVolume(e),boundingVolume:{region:[e.min.x,e.min.y,e.max.x,e.max.y,e.min.z,e.max.z]},root:a},void 0,4));}export{N as generate3DTilesFromTileDatabase};//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map