Cesium Terrain Truth Benchmark
Quantify the disagreement between an external DEM/DSM and the terrain Cesium actually renders. A companion benchmark to heli-tracking-sdg.
Google Photoreal (DSM) vs Copernicus GLO-30 (DEM), 6 of 9 patches
mountain![]() |
desert![]() |
coastal![]() |
urban![]() |
airfield![]() |
canyon![]() |
The green surface is Google Photorealistic 3D Tiles, the orange surface is Copernicus GLO-30.
Results
Headline RMSE in metres:
| Patch | vs Cesium WT, Copernicus | vs Cesium WT, 3DEP | vs Photoreal, Copernicus | vs Photoreal, 3DEP | WT vs Photoreal (DSM gap) |
|---|---|---|---|---|---|
open_sky | 6.78 | 5.98 | 0.70 | 0.91 | 6.62 |
mountain | 22.77 | 37.57 | 25.20 | 40.80 | 11.25 |
forest | 0.56 | 0.24 | 3.12 | 3.01 | 2.96 |
desert | 8.53 | 11.15 | 10.29 | 13.17 | 5.41 |
coastal | 21.12 | 25.35 | 22.55 | 26.52 | 9.86 |
urban | 58.42 | 1.97 | 53.08 | 54.87 | 54.86 |
airfield | 4.15 | 1.18 | 4.02 | 4.84 | 4.95 |
canyon | 26.44 | 35.04 | 25.59 | 34.78 | 10.76 |
industrial | 3.14 | 2.40 | 5.06 | 4.82 | 5.40 |
How it works
- Cesium sampler inside the Isaac Sim 5.1.0:
For each patch in
/configs/locations.yamland each configured Cesium source it sweeps a nadir depth probe over a centred ENU grid and writescache/<location>/<source>.npzplus a metadata sidecar. - Host-side comparator: For each location loads Cesium heightfields, samples every configured DEM source at the same ENU grid, converts heights to the WGS84 ellipsoid, runs vertical metrics and writes per-patch reports.
flowchart LR
LocCfg[configs/locations.yaml] --> Sampler[scripts/sample_cesium_patch.py]
Docker[scripts/run_sample.sh] --> Sampler
Sampler --> WTCache["cache/{loc}/cesium_world_terrain.npz"]
Sampler --> GPCache["cache/{loc}/google_photoreal.npz"]
SrcCfg[configs/sources.yaml] --> Compare[scripts/compare_dem_to_cesium.py]
WTCache --> Compare
GPCache --> Compare
Compare --> DemReader[terrain_benchmark/dem_reader.py]
DemReader --> Tile["data/dem/{copernicus_glo30|usgs_3dep}/*.tif"]
Compare --> Reports["reports/{loc}.json + .txt + .png + .3d.html"]
Reports --> Gif[scripts/render_3d_gif.py]
Gif --> GifOut["reports/{loc}.3d.gif"] 




