Hi everyone,
I’m is looking for the most performant architectural approach to drape large-scale Vector data (originally MVT) over 3D Terrain in CesiumJS.
My Core Constraints:
-
Visuals Only (No Interaction): I strictly need this for presentation purposes. Zero feature pickability or hovering is required.
-
Maximum Performance: Client-side framerate is our top priority.
A quick background on my work so far: First, I looked into the hybrid MapLibre + Three.js + 3d-tiles-renderer architecture (as discussed in this thread: https://community.cesium.com/t/best-practices-for-hybrid-maplibre-cesium-architecture-handling-mvt-terrain-and-complex-styling-in-production/46031/6). However, manually syncing camera matrices, handling custom WebGL contexts and so on, is just too much overhead. I’m not a Three.js master, so we had to drop that approach.
I’ve also been closely following Vector data... in glTF? · Issue #825 · CesiumGS/3d-tiles · GitHub and https://github.com/CesiumGS/cesium/pull/13404 regarding MVT support in Cesium.
Given that client-side clampToGround is too heavy for our dataset, we are shifting the workload to a server-side preprocessing pipeline. We extract our MVT data into flat GeoJSON, and currently, we are torn between two architectural plans:
Plan A: Adaptive Densification via Local GeoTIFF I built a backend-native pipeline using Node.js and a local DEM (GeoTIFF).
-
The approach: Instead of blindly densifying vertices every 5m (which bloats the file), I use a recursive midpoint checking logic (Adaptive Densification) combined with Bilinear Interpolation to avoid the “stair-case” effect.
-
The problem: It’s incredibly fast offline (~110ms), but because MVT is already a lossy/simplified format, densifying these straight segments over uneven terrain still occasionally results in messy, overlapping lines or weird geometry artifacts in short depressions.
Plan B: Server-side Rasterization (ImageryLayer) To avoid the geometry/topology mess entirely, I built an alternative pipeline.
-
The approach: I use a headless browser (Puppeteer + Canvas) to render the MVT vector tiles directly into standard PNG raster tiles. I then package these into a ZIP with a
tilemapresource.xmlto upload to Cesium ion as anImageryLayer. Cesium handles the draping perfectly. -
**The problem:**I’m constantly hitting the dreaded
One or more files are not georeferencederror when uploading the TMS ZIP to Cesium ion, presumably because Ion’s parser is incredibly strict about the XML SRS and BoundingBox formats.
My questions for the community:
-
Has anyone successfully dealt with this specific “MVT-to-Terrain” scenario in production?
-
Is there a better “best practice” I am completely missing?
-
Between Plan A (refining the geometry math) and Plan B (pushing through the TMS upload errors), which path would you recommend investing more engineering time into?
Any insights, tips, or pointers would be massively appreciated!
Thanks in advance
.