Stereo photogrammetry & 3D terrain

From a stereo pair to a city model — on one desk, air-gapped.

Two RPC-bearing images go in. Pure-C# epipolar rectification and RPC triangulation with a pluggable dense matcher produce a geocoded Float32 DSM that registers as both a served COG and a terrain source — so viewshed, line-of-sight, slope and threat domes use it immediately. Footprint extraction and roofer take it on to LoD2.2 building models rendered as meshes in the scene.

RPC triangulation (Grodecki & Dial)Epipolar rectificationStereoSGBM sidecarDual registration: COG + DemSourceMoore-boundary footprintsroofer LoD 1.2 / 1.3 / 2.2Mesh viewshed

At a glance

  • Stereo → DSM7-stage async job: RPC extract (inline or .rpc / .rpb) → epipolar grid → dense match → triangulate → tiled DEFLATE Float32 GeoTIFF → register COG → register DemSource
  • TriangulationForward intersection by bounded height search, golden-section refinement to 0.05 m; 17 unit tests
  • FootprintsnDSM (DSM − DTM, or morphological opening), 4-connected labeling, Moore-neighbor boundary tracing, Visvalingam-Whyatt simplify → MULTIPOLYGON GPKG
  • LoD2.2roofer CLI (LoD 1.2 / 1.3 / 2.2) from footprints + LAS / LAZ / COPC → CityJSONSeq → esri/geometry/Mesh per building
  • 3D analysisViewshed (KNN horizon-angle and mesh ray-cast against BIM / city meshes), LOS with breach points, elevation profile, slope / aspect
  • Routes/api/stereo/* · /api/footprint/* · /api/roof/* · /api/spatial3d/*
SOCET GXP ATE / NGATE workflow analogHeight always metres HAEFirst producer to wire the terrain stackLAS / LAZ / COPC → I3S point clouds

Capabilities

The extraction chain and what it feeds

Stereo → DSM

Extract RPCs, build the epipolar grid, run the dense matcher and triangulate every disparity into height above ellipsoid. Options cover disparity range, block size, height search window and output EPSG.

  • POST /api/stereo/dsm → job → validPixelFraction
  • Default matcher: OpenCV StereoSGBM through a small Python sidecar; the matcher contract is two rasters in, one Float32 disparity out
  • NaN NoData, tiled DEFLATE GeoTIFF

Dual registration

The DSM lands as both a served ImageServer COG and a DemSource. Viewshed, LOS, slope, threat-dome radar masking and the game-engine terrain endpoints consume it with no extra step.

  • Also true for S-102 / BAG bathymetry, ODM DSMs and Terra-alt DTMs
  • Quantized-mesh, heightmap PNG and LERC tiles served from the same source

DSM → footprints

A pure-C# normalized DSM, component labeling and Moore-neighbor boundary tracing turn the surface into building polygons, simplified and written to a GeoPackage in EPSG:4326.

  • /api/footprint/*
  • Morphological opening when no DTM is available
  • Feeds roofer and the force-protection inventory

Footprints + point cloud → LoD2.2

Wraps the 3DBAG roofer CLI to reconstruct LoD 1.2, 1.3 or 2.2 roofs from footprints and a LAS / LAZ / COPC cloud, emitting CityJSONSeq rendered as one mesh per building.

  • POST /api/roof/reconstruct — 1–10 minutes per city block
  • Meshes become occlusion geometry for viewshed and sensor coverage

3D analysis on the result

Viewshed by KNN horizon angle or by ray-casting against BIM and city meshes; line-of-sight with breach points; elevation profiles; slope and aspect; range fans, HLZ and multi-observer RLOS on the client.

  • /api/spatial3d/* and per-layer GPKG routes
  • Threat domes with radar LOS masking against the DEM
  • Dynamic map projection: Polar Stereographic, Gnomonic, LCC, Azimuthal Equidistant

3D content in the same scene

I3S SceneServer from .slpk (1.6 / 1.7 / 1.8), OGC 3D Tiles, Gaussian splats (.ply / .splat / .ksplat / .spz), LAS / LAZ / COPC to I3S point-cloud SLPK with LEPCC and octree LOD, CityJSON, BIM meshes.

  • Splat training via Postshot or OpenSplat + COLMAP (optional)
  • Camera-synced iTowns / Spark viewer

Analyst workflow

Pair to product

The chain is asynchronous and durable on the headless server: each stage is a job that survives restarts and reports on the job board.

  1. Register the pairTwo RPC-bearing images (inline GeoTIFF RPCs or sidecar .rpc / .rpb files).
  2. Run stereo → DSMSet disparity range, block size and height window; poll the job for validPixelFraction; the DSM appears as a layer and a terrain source.
  3. Extract footprintsnDSM thresholding and boundary tracing produce a building GeoPackage.
  4. Reconstruct roofsFeed footprints and a point cloud to roofer for LoD2.2 CityJSON meshes.
  5. AnalyzeViewshed from an observer against the new meshes, LOS to a target, sensor-coverage gap analysis, threat dome over the new terrain.

Specifications

Parameters, formats, math

Stereo job

  • InputsGeoTIFF with RPC metadata or .rpc / .rpb sidecars
  • DefaultsMinDisp / MaxDisp −64 / 64 · BlockSize 7 · HeightMin / Max 0 / 9000 m · HeightSteps 64 · EPSG 4326 or 3857
  • OutputFloat32 DSM, tiled DEFLATE, NaN NoData, metres HAE
  • RoutesGET /api/stereo/capabilities · POST /api/stereo/dsm · GET /api/stereo/jobs/{id}

Footprints & roofs

  • nDSMDSM − DTM, or morphological opening
  • Tracing4-connected labeling · Moore neighbor · Visvalingam-Whyatt
  • OutputMULTIPOLYGON GPKG EPSG:4326
  • rooferLoD 1.2 / 1.3 / 2.2; .las / .laz / .copc.laz + footprint GPKG → CityJSONSeq; MaxBuildings 5000 default

3D analysis & content

  • ViewshedKNN horizon-angle or mesh ray-cast (BIM / city meshes)
  • LOSBreach points; elevation profile; slope / aspect
  • 3D formatsI3S / SLPK · 3D Tiles · CityJSON · splats · LAS / LAZ / COPC · E57 via PDAL sidecar
  • Terrain outQuantized-mesh · heightmap PNG · LERC · WMTS / TMS

Honest scope

What ships, what is optional, what is next

Defense buyers get burned by overclaims. This is the plain-language scope for this capability, drawn from the product’s own documentation.

  • Shipped RPC triangulation, dual registration, footprints, roofer wrapper, 3D analysis — The extraction chain and the terrain stack are in the engine core with unit tests on the triangulation math.
  • Optional sidecar / gated Dense matcher sidecar — The default matcher is OpenCV StereoSGBM in a capability-gated Python sidecar; a pure-C# SGM matcher is on the roadmap.
  • Optional sidecar / gated roofer is GPLv3 — roofer is an external CLI you install; redistributing its binary carries GPLv3 obligations. The product wraps it, it does not bundle it.
  • Optional sidecar / gated LiDAR → I3S is Windows-only — The LEPCC / lazperf natives ship for win-x64; the headless Linux server returns a documented 503 for that converter.
  • Roadmap Anaglyph stereo viewer — No stereo viewing UI yet — the chain is extraction, not stereo compilation. This is a GXP-class workflow analog, not a replacement for an accredited triangulation program.

GeoTactical Insights · powered by 3D Map Explorer

See it on a disconnected machine.

A 30-minute guided demo on your own data: ingest, exploit, fuse, share to TAK and export — with the network cable out. We will also tell you exactly what is a sidecar, what is gated and what is still roadmap.

GeoTactical Insights

GEOINT and defense workflows powered by 3D Map Explorer, the air-gapped geospatial intelligence platform from Tech Maven Geospatial.

info@techmavengeospatial.com
3dmapexplorer.techmaven.net