Hello,
I'm looking for some help getting offline 3D elevation data working properly in a WPF/.NET 9 application (Windows 11) that uses ArcGIS Runtime SDK for .NET to power a 3D scene. The goal is to render 3D terrain with elevation and a custom imagery basemap, fully offline.
When I use this elevation service:
https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer
…and pair it with a .tpkx basemap I created, everything works perfectly. The 3D terrain renders, and the ground texture + color shows up as intended.
I need this system to function offline.
To prepare for this, I downloaded 1/3 arc-second (10m) DEM tiles from the National Map:
https://apps.nationalmap.gov/downloader/
For testing, I chose a tile covering the Tucson, AZ area. I followed this workflow in ArcGIS Pro:
Used "Manage Tile Cache" with the WGS84 V2 tiling scheme and “Elevation” format.
Then ran "Export Tile Cache" to output a .tpkx from the tile cache.
For the basemap, I also used Manage Tile Cache → Create Tile Cache → Export Tile Cache, using imagery data (configured to match Tucson area).
Both elevation and basemap caches use the tiling scheme.
Here are my current results,
Case 1: Load elevation .tpkx (no basemap)
3D terrain shows up (elevation working)
Ground is white/grid/dotted (no imagery)
Case 2: Load basemap .tpkx (no elevation)
Ground texture and color load
Terrain is flat (elevation not applied)
Case 3: Load both elevation + basemap .tpkx
Terrain becomes flat again
Imagery shows up properly
So far, I have not been able to get both the imagery basemap and 3D terrain working together in offline mode — it’s always one or the other.
Here's the code currently used to load the basemap and elevation. This version of the code loads the 3D terrain but not the colored basemap over it:
public async static Task<SceneView> 3DScene_Initialize (SceneView sceneView)
{
{
sceneView.SetFieldOfView(85);
// Basemap (imagery)
string basemapPath = @"MYPATH";
TileCache basemapCache = new TileCache(basemapPath);
ArcGISTiledLayer basemapLayer = new ArcGISTiledLayer(basemapCache);
Scene scene = new Scene(new Basemap(basemapLayer));
sceneView.Scene = scene;
// Elevation
string elevationPath = @"MYPATH";
TileCache elevationCache = new TileCache(elevationPath);
ArcGISTiledElevationSource elevationSource = new ArcGISTiledElevationSource(elevationCache);
Surface elevationSurface = new Surface();
elevationSurface.ElevationSources.Add(elevationSource);
elevationSurface.ElevationExaggeration = 1.5;scene.BaseSurface = elevationSurface;
// Clean up
sceneView.Unloaded += (s, e) =>
{
if (sceneView.Scene != null)
{
sceneView.Scene.OperationalLayers.Clear();
sceneView.GraphicsOverlays.Clear();
}
};
return sceneView;
}
From my troubleshooting so far, I suspect:
A projection mismatch or tiling scheme issue between the basemap and elevation .tpkx
Possibly something about the draw order or layer conflicts between the elevation surface and the imagery
The .tpkx basemap might not be rendering correctly over the custom elevation surface when loaded together
Questions/Thoughts?
Is there a required projection or tiling scheme for basemaps to overlay correctly on an elevation .tpkx?
Is there a known conflict when using custom ArcGISTiledLayer + ArcGISTiledElevationSource in the same scene?
Are there any tools in ArcGIS Pro that can help verify or align these two caches?
Is there a preferred export format or method (e.g., LERC, JPEG, etc.) for this use case
Any help on this would be very much appreciated and I would be very grateful for.
Thank You!