Core Modules
TerraLab is organized into specialized subsystems:Terrain Engine (TerraLab/terrain/)
engine.py: Horizon raycasting with Earth curvature correctionproviders.py: DEM data source abstraction (ICGC, Copernicus)worker.py: Background processing for horizon profileslight_pollution_sampler.py: Spatial sampling of DVNL radiance data
Light Pollution Analysis (TerraLab/light_pollution/)
calibration.py: DVNL-to-SQM regression modelkernels.py: Gaussian and power-law convolution kernelsbortle.py: SQM-to-Bortle scale mappingmlim.py: Limiting magnitude calculations with atmospheric extinctiondvnl_io.py: GeoTIFF I/O for satellite light data
Astronomical Rendering (TerraLab/widgets/)
sky_widget.py: Main canvas with Skyfield integrationvisual_magnitude_engine.py: Atmospheric extinction and visibility modelsspherical_math.py: Coordinate transformations (RA/Dec ↔ Alt/Az)telescope_scope_mode.py: Field-of-view calculations
Weather System (TerraLab/weather/)
- Real-time atmospheric conditions from Met.no API
- Cloud rendering and atmospheric effects
Data Flow Pipeline
The following diagram shows how data flows from raw sources to the rendered output:Processing Stages
-
Observer Coordinates (Lat/Lon) → UTM Transformation
- Converts WGS84 geographic coordinates to EPSG:25831 (UTM 31N) for metric operations
- Source:
TerraLab/terrain/engine.py:832-834
-
DEM Tile Indexing
- Scans terrain tiles and builds spatial index with bounding boxes
- Implements LRU cache with
.npybinary serialization for fast reload - Source:
TerraLab/terrain/engine.py:203-266
-
Horizon Baking (Raycasting)
- 360° azimuth sweep with adaptive depth bands
- Applies Earth curvature correction:
- Source:
TerraLab/terrain/engine.py:649-809
-
Light Pollution Sampling
- Reads DVNL radiance from satellite GeoTIFF
- Applies Gaussian kernel (σ = 1.5 km) to simulate zenith sky brightness
- Converts to SQM via calibrated model:
- Source:
TerraLab/light_pollution/calibration.py:29-76
-
Astronomical Calculations
- Loads Gaia DR3 star catalog (RA, Dec, G magnitude, BP-RP color)
- Computes planetary positions using Skyfield + DE421 ephemerides
- Applies atmospheric refraction and extinction
- Source:
TerraLab/widgets/sky_widget.py:604-772
-
Rendering
- Projects celestial objects using stereographic projection
- Culls stars below limiting magnitude (calculated per-azimuth from Bortle + altitude)
- Renders with realistic bloom/diffraction spikes for bright stars
- Source:
TerraLab/widgets/sky_widget.py:893-1246
File Formats
Input Data
| Format | Purpose | Location |
|---|---|---|
ESRI ASCII Grid (.txt, .asc) | Digital Elevation Models | TerraLab/data/terrain/ |
| GeoTIFF | DVNL light pollution raster | TerraLab/data/light_pollution/C_DVNL 2022.tif |
| JSON | Gaia star catalog | TerraLab/data/stars/gaia_stars.json |
| BSP | JPL DE421 ephemerides | TerraLab/data/stars/de421.bsp |
Cache Files
| Format | Purpose | Generated From |
|---|---|---|
.npy | Binary DEM cache | ASCII Grid parsing (via pandas) |
.npz | Horizon profiles | Raycasting output |
gaia_cache_*.npy | Star catalog arrays | JSON parsing (RA, Dec, Mag, RGB) |
Coordinate Systems
Coordinate transformations usepyproj for precision:
TerraLab/terrain/engine.py:494-500
Performance Optimizations
1. Spatial Coherence Caching
The DEM sampler tracks the last accessed tile to avoid repeated index searches:TerraLab/terrain/engine.py:511-514
2. Adaptive Stepping
Raycasting uses variable step sizes based on distance:- 0–3 km: Fine steps (50m)
- 3–15 km: Medium steps (100m)
- 15+ km: Coarse steps (200m)
TerraLab/terrain/engine.py:783-790
3. NumPy Vectorization
Star visibility calculations use vectorized operations:TerraLab/widgets/sky_widget.py:978-983
4. Asynchronous Loading
Catalog and ephemeris loading happens in background threads:CatalogLoaderWorker: Parses Gaia JSON → NumPy arraysSkyfieldLoaderWorker: Loads DE421 without UI freeze
TerraLab/widgets/sky_widget.py:604-790
Next Steps
Explore the subsystems in detail:- Horizon Engine - Raycasting algorithm
- Light Pollution - DVNL processing pipeline
- Astronomical Rendering - Skyfield integration