Path-traced terrain and cartography for Python.
Rust + WebGPU underneath. Real elevation data in, print-resolution maps out.
Mount Shasta, path-traced with global illumination and terrain shadows.
Drag to orbit it live › · USGS 3DEP elevation · 23 cloud-free Sentinel-2 composites
pip install forge3dOptional extras
pip install "forge3d[jupyter]" # notebook widget support
pip install "forge3d[datasets]" # on-demand sample datasets
pip install "forge3d[all]" # everythingimport forge3d as f3d
dem_path = f3d.fetch_dem("rainier")
with f3d.open_viewer_async(terrain_path=dem_path, width=1440, height=900) as viewer:
viewer.set_z_scale(0.1)
viewer.set_orbit_camera(phi_deg=28, theta_deg=49, radius=5400, fov_deg=42)
viewer.set_sun(azimuth_deg=302, elevation_deg=24)
viewer.snapshot("rainier.png", width=1920, height=1080)fetch_dem pulls the elevation model, the viewer opens a real window you can orbit,
and snapshot writes the frame at whatever resolution you ask for.
You can now turn a population raster into a continuous raised, shaded surface, give each land-cover class its own colour, or show two variables together with a 3×3 colour matrix. For example, height can show population density while colour shows how it has changed.
RasterHeightSurfaceStyle, CategoricalRasterStyle and BivariateRasterStyle
plug into MapScene using prepared arrays or local raster files. Missing cells
stay empty, units and class boundaries remain explicit, and the styles return
legend data with the labels and ranges needed to explain the map. You can save
and reload the styled scene through the existing scene-bundle workflow.
See the raster styling guide and the runnable public-API example.
Every map below is rendered end to end by forge3d — titles, legends and scale bars included. Nothing here was hand-edited or composited in another tool.
![]() Lyon, LOD2 buildings CityGML extrusion over RGE ALTI terrain |
![]() Egypt, population GHSL R2023A density over shaded relief |
![]() France, climate TerraClimate temperature × precipitation |
![]() Iberia, land cover 2024 — Sentinel-2 at 10 m classified over terrain, legend composed in-engine |
![]() Germany, hydrology — HydroSHEDS rivers and lakes over a hypsometric DEM |
Türkiye, population density — a million WorldPop 2020 cells extruded on a log scale, labelled and lit in a single pass
The renders above are downsampled for this page. Full-resolution masters — up to 7200×7200 — are on the gallery.
| Terrain | Interactive viewing via open_viewer_async() and ViewerHandle; snapshots from GeoTIFF or numpy DEMs; clipmaps for large regions |
| Rendering | Path tracing, PBR materials, subsurface scattering, water and reflections, cloud and contact shadows, AOV and EXR output |
| Data | COG streaming, CRS helpers, LAZ/COPC/EPT point clouds, 3D Tiles, GeoJSON, CityJSON, on-demand sample datasets |
| Cartography | Raster and vector overlays, labels with halo and occlusion, graticules, Legend, ScaleBar, NorthArrow, MapPlate |
| Offscreen | Scene, Session, TerrainRenderer and TerrainRenderParams for headless and batch work |
| Output | PNG and PNG16, SVG and PDF vector export, scene bundles, notebook widgets |
MapPlate composition, vector export and the building import pipelines are Pro
features; set a key with forge3d.set_license_key(...) to unlock them.
- Quickstart — install, first viewer session, first overlay, first notebook widget
- Feature Map — repo-wide overview of the supported workflows
- Tutorials — guided GIS and Python tracks
- Gallery — finished recipes at full resolution
- API Reference — the full public Python surface
The open-source core is released under Apache-2.0 OR MIT. Pro-gated features require a commercial license key.






