Terrain Tile Specification
SimVector serves continuous global elevation data as compressed 24-bit PNG tiles using the standard Terrain-RGB encoding scheme. It is engineered for low-bandwidth 3D terrain rendering, hypsometric tinting (color-relief), and dynamic hillshading.
Metadata
| Property | Value |
|---|---|
| Schema Name | SimVector Global Elevation 90m |
| HTTPS Endpoint | https://tiles.simvector.net/global_elevation_90m/{z}/{x}/{y}.png |
| Protocol Endpoint | simvector://global_elevation_90m/{z}/{x}/{y}.png |
| Source Resolution | 3 arc-second (~90m nominal grid spacing) |
| Format / Encoding | Terrain-RGB (24-bit PNG) |
| Tile Size | 512 x 512 px |
| Zoom Range | Min: 0 / Max: 10 |
| Spatial Bounds | [-180.0, -89.9511287, 180.0, 85.0511287] (Global WGS84) |
| Elevation Unit | Meters MSL |
MapLibre GL JS Integration
1. Source Definition
map.addSource('elevation-dem', {
type: 'raster-dem',
tiles: ['simvector://global_elevation_90m/{z}/{x}/{y}.png'],
tileSize: 512,
maxzoom: 10,
bounds: [-180, -89.9511287798066, 180, 85.0511287798066]
});2. Hillshade Layer
map.addLayer({
id: 'vfr-hillshade',
type: 'hillshade',
source: 'elevation-dem',
paint: {
'hillshade-exaggeration': 0.3,
'hillshade-shadow-color': '#21160e',
'hillshade-highlight-color': '#ffffff',
'hillshade-accent-color': '#000000'
}
});3. 3D Mesh Terrain Rendering
To enable native 3D mesh rendering in MapLibre:
map.setTerrain({
source: 'elevation-dem',
exaggeration: 1.0
});Tile Size Requirement
Always set tileSize: 512 when consuming SimVector DEM tiles. Standard 256px configurations may cause sampling mismatches and visual elevation tearing along tile boundaries.
Example: VFR Color Banding
The following example demonstrates how to apply standard VFR sectional hypsometric tinting to the DEM tile source using MapLibre's color-relief layer type. Altitude bands and color specifications are derived from the FAA's Aeronautical Chart User's Guide.
Altitude Color Bands
| Elevation Range (MSL) | Elevation Range (Meters) | Hex Color | Visual Band |
|---|---|---|---|
| Below Sea Level – 1,000 ft | -70m to 304m | #cce3b6 | Light Lowland Green |
| 1,000 ft – 2,000 ft | 305m to 609m | #dcedc2 | Pale Green |
| 2,000 ft – 3,000 ft | 610m to 913m | #fff7cb | Soft Yellow |
| 3,000 ft – 5,000 ft | 914m to 1,523m | #f6e398 | Warm Yellow |
| 5,000 ft – 7,000 ft | 1,524m to 2,133m | #e8cb83 | Low Mountain Tan |
| 7,000 ft – 9,000 ft | 2,134m to 2,742m | #ddb07e | Ochre |
| 9,000 ft – 12,000 ft | 2,743m to 3,657m | #edaa6e | High Mountain Brown |
| 12,000 ft – 19,633 ft+ | 3,658m to 5,983m | #b27d35 | Dark Alpine Brown |
Layer Implementation Snippet
Place this layer above your background fill and below hydrology or aeronautical overlays:
map.addLayer({
id: 'vfr-terrain-tint',
type: 'color-relief',
source: 'elevation-dem',
paint: {
'color-relief-color': [
'interpolate',
['linear'],
['elevation'],
// Below Sea Level to 1,000 ft (-70m to 304m)
-70, '#cce3b6',
0, '#cce3b6',
304, '#cce3b6',
// 1,000 ft to 2,000 ft (305m to 609m)
305, '#dcedc2',
609, '#dcedc2',
// 2,000 ft to 3,000 ft (610m to 913m)
610, '#fff7cb',
913, '#fff7cb',
// 3,000 ft to 5,000 ft (914m to 1523m)
914, '#f6e398',
1523, '#f6e398',
// 5,000 ft to 7,000 ft (1524m to 2133m)
1524, '#e8cb83',
2133, '#e8cb83',
// 7,000 ft to 9,000 ft (2134m to 2742m)
2134, '#ddb07e',
2742, '#ddb07e',
// 9,000 ft to 12,000 ft (2743m to 3657m)
2743, '#edaa6e',
3657, '#edaa6e',
// 12,000 ft to 19,633 ft (3658m to 5983m)
3658, '#b27d35',
5983, '#b27d35'
],
'color-relief-opacity': 1.0
}
});