Case study

All work

Air-gapped mission simulation and ORBAT platform

A country-scale, fully offline mission simulation and command-and-control platform that generates its 3D scene at runtime from what operators draw on a 2D tactical map, so formations drawn in 2D play out as those formations in 3D, on a timeline.

Role
Solution architect & engineering lead (10-person team)

Contains modified Copernicus Sentinel data

Illustrative concept, not a product screenshot

Context

The platform simulates missions and visualises command and control across a whole country, and it runs with no network at all. Its core is runtime generation: real-time 2D tactical drawing drives a 3D terrain engine, so formations drawn on the 2D map play out as those formations in 3D, on a timeline.

Constraints

  • Fully offline. It is delivered into high-security sites with no network, so every map, terrain, search and routing source ships with the system.
  • Country scale. Nationwide terrain, imagery, roads and urban data, prepared by the country-scale data pipeline.
  • Real time. The 3D scene has to hold frame rate while a scenario plays.
  • Many users, different clearances. Several authors and viewers work on one scenario, and sharing follows clearance.
  • Hardware in scope. The servers and projection hardware are part of the delivery.
  • Team. A 10-person team.

Architecture

Air-gapped mission simulation and ORBAT platform
Air-gapped mission simulation and ORBAT platform Components by lane. 2D authoring: 2D tactical map (OpenLayers → MapLibre, MIL-STD-2525, MGRS); Timeline. 3D scene: Procedural 3D generator (glTF and 3D Tiles at runtime); 3D terrain engine (CesiumJS, deck.gl). Services: Scenario service (Node.js, event-driven). Offline data: PostgreSQL / PostGIS; Tiles, terrain, search, routing. Flows: 2D tactical map to Procedural 3D generator (drawings); Procedural 3D generator to 3D terrain engine (3D features); Timeline to 3D terrain engine (entities); 2D tactical map to Scenario service (layers); Scenario service to PostgreSQL / PostGIS; Tiles, terrain, search, routing to 3D terrain engine; Tiles, terrain, search, routing to 2D tactical map. 2D authoring 3D scene Services Offline data 2D tactical map OpenLayers → MapLibre, MIL-STD-2525, MGRS Timeline Procedural 3D generator glTF and 3D Tiles at runtime 3D terrain engine CesiumJS, deck.gl Scenario service Node.js, event-driven PostgreSQL / PostGIS Tiles, terrain, search, routing drawings 3D features entities layers Air-gapped mission simulation and ORBAT platform Components by lane. 2D authoring: 2D tactical map (OpenLayers → MapLibre, MIL-STD-2525, MGRS); Timeline. 3D scene: Procedural 3D generator (glTF and 3D Tiles at runtime); 3D terrain engine (CesiumJS, deck.gl). Services: Scenario service (Node.js, event-driven). Offline data: PostgreSQL / PostGIS; Tiles, terrain, search, routing. Flows: 2D tactical map to Procedural 3D generator (drawings); Procedural 3D generator to 3D terrain engine (3D features); Timeline to 3D terrain engine (entities); 2D tactical map to Scenario service (layers); Scenario service to PostgreSQL / PostGIS; Tiles, terrain, search, routing to 3D terrain engine; Tiles, terrain, search, routing to 2D tactical map. 2D authoring 3D scene Services Offline data 2D tactical map OpenLayers → MapLibre, MIL-STD-2525, MGRS Timeline Procedural 3D generator glTF and 3D Tiles at runtime 3D terrain engine CesiumJS, deck.gl Scenario service Node.js, event-driven PostgreSQL / PostGIS Tiles, terrain, search, routing drawings 3D features entities layers
Components and flows

Components

2D authoring
2D tactical map (OpenLayers → MapLibre, MIL-STD-2525, MGRS)
Timeline
3D scene
Procedural 3D generator (glTF and 3D Tiles at runtime)
3D terrain engine (CesiumJS, deck.gl)
Services
Scenario service (Node.js, event-driven)
Offline data
PostgreSQL / PostGIS
Tiles, terrain, search, routing

Flows

  • 2D tactical map to Procedural 3D generator (drawings)
  • Procedural 3D generator to 3D terrain engine (3D features)
  • Timeline to 3D terrain engine (entities)
  • 2D tactical map to Scenario service (layers)
  • Scenario service to PostgreSQL / PostGIS
  • Tiles, terrain, search, routing to 3D terrain engine
  • Tiles, terrain, search, routing to 2D tactical map

The 2D map is the authoring surface. Everything in 3D is generated from it at runtime.

  • 2D tactical map (OpenLayers, moving to MapLibre, in Vue.js): MIL-STD-2525 symbology and QGIS-class layer management in the browser, including XYZ, tile and image layers, ordering, merging, import and export, MGRS and coordinate grids, switchable coordinate reference systems and measurement tools.
  • Procedural 3D generator: turns 100+ feature types drawn in 2D into terrain-following glTF and 3D Tiles at runtime. A drawn road becomes a textured road; a drawn polygon becomes buildings, forest or parkland.
  • Executable symbology on a timeline: a unit drawn in 2D becomes its entities in 3D (a single-soldier symbol a soldier, an armour symbol its formation of tanks) and moves along an editable timeline, following the terrain.
  • 3D terrain engine (CesiumJS, with deck.gl): renders the scene the timeline drives.
  • Scenario service (Node.js, event-driven, on PostgreSQL and PostGIS): multi-user scenarios, each author's own layers, per-user attribution of every drawing, and an admin panel that decides who may see or edit each saved scenario.
  • Offline data: terrain, imagery, roads, place search and routing from the country-scale pipeline, served on site.
  • Delivery: Docker and Kubernetes on air-gapped servers, with the projection hardware specified as part of the system.

Terrain MISSION SCENARIO

  • VIEWSHED
  • DRAWN AREA
  • DRAWN ROAD
  • GENERATED AT RUNTIME
  • UNIT FRAMES
  • MAP GRID

Illustrative concept, not a product screenshot. Terrain: public Terrarium elevation tiles over the Karakoram, chosen for relief.

Key decisions

  1. Chose
    Generating the 3D scene at runtime from the 2D drawing
    Over
    Authoring 3D scenes separately for each scenario
    Because
    Every scenario had to stay editable on the 2D map and play in 3D straight away, with no modelling step in between.
  2. Chose
    Sharing each saved scenario by clearance, decided in an admin panel
    Over
    Layers that every user on the system can see
    Because
    Authors and viewers on the same system hold different clearances.

My role

I was the solution architect and engineering lead for a 10-person team. I owned the requirements, the architecture and the technology decisions; set the architecture documentation from system design down to code-level standards; assigned the work, set the timelines and reviewed the code; and specified the servers and projection hardware the platform was delivered on. I also worked hands-on in the production code.

Outcome

The platform was delivered end to end into high-security offline sites, from the servers to the projection hardware. It generates 100+ feature types from the 2D drawing at runtime and sustains 30+ FPS in 3D.

  • MapLibre drawing and measuring
  • On-the-fly MGRS and H3 grid tiles
  • DEM contours
  • MIL-STD-2525 / APP-6 symbology
  • Offline tile and terrain sources
  • Built in Vue 3 and TypeScript

Stack

Each links to its entry on the stack page

Ask about this

How does a drawing on the 2D map become a 3D scene in the mission platform?

Answers come from the content on this site.

The chat needs JavaScript. Without it, ask through the contact page.