@csi-foxbyte/mesh-dem-to-terrain
Version:
A Node.js library that converts DEM meshes (DXF, GeoJSON, etc.) into Cesium Terrain Tiles (quantized-mesh or heightmap) with flexible zoom-level control and multi-threading support.
2 lines • 1.53 kB
JavaScript
import {PromisePool}from'@supercharge/promise-pool';import u,{readFile}from'fs/promises';import w,{dirname}from'path';import Y from'proj4';import k from'slippy-grid';import {Worker}from'worker_threads';import {WorkerPool}from'./workerPool.js';async function G(n,y,g){const{endZoom:a=16,startZoom:i=0,writeFile:s=async(r,e)=>{await u.mkdir(dirname(r),{recursive:true}),await u.writeFile(r,e);},threadCount:m=4,skipLevel:W=10}=g,t=JSON.parse((await readFile(w.join(n,"metadata.json"))).toString()),l=Y("+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs","+proj=longlat +datum=WGS84 +no_defs +type=crs"),[S,b]=l.forward([t.minX,t.minY]),[P,j]=l.forward([t.maxX,t.maxY]),d=[S,b,P,j],x=k.all(d,i,a),c=k.levels(d,i,a),h=c.reduce((r,[e,o])=>r+e.length*o.length,0);await s(w.join(n,"layer.json"),JSON.stringify({tiles:["{z}/{x}/{y}.terrain"],projection:"EPSG:3857",bounds:[-180,-90,180,90],format:"quantized-mesh-1.0",available:c.map(([r,e])=>[{startX:r[0],startY:e[0],endX:r.slice(-1)[0],endY:e.slice(-1)[0]}])},void 0,4));const p=new WorkerPool(()=>new Worker(new URL("./worker.js",import.meta.url),{}),m);await p.messageWorkers({type:"init",tree:t.tiles,outputFolder:n,skipLevel:W});let f=0;await new PromisePool(x).withConcurrency(m).process(async([r,e,o])=>{const{file:v,path:R}=await p.run({type:"work",x:r,y:e,zoom:o});await s(R,v,{x:r,y:e,zoom:o}),f++,y(f/h);});}export{G as default};//# sourceMappingURL=generate.js.map
//# sourceMappingURL=generate.js.map