The short version
A geological visualization workflow is the path that takes raw field and source data and turns it into something a person can read and trust — a print sheet, a 3D scene, or an interactive web map — without losing the science along the way. The workflow has a fixed spine: ingest and georeference sources, separate observation from interpretation, build terrain context, style from attributes, then publish. The hard part is not any single tool; it is keeping the four data layers (observation, interpretation, derived analysis, presentation) distinct so that what you saw is never silently merged with what you inferred. This article walks the spine with concrete tools and commands.
Stage 1 — Ingest and georeference
Sources arrive as scanned map sheets, field GPS tracks, sample spreadsheets, DEMs, and earlier vector data in mixed projections. The first job is to put everything in one projected CRS suited to the area — typically a UTM zone (e.g. EPSG:32613) or a national grid — rather than working in geographic WGS84 (EPSG:4326) where distances come out in degrees.
For a scanned sheet, georeference it in the QGIS Georeferencer against known control points and a polynomial or thin-plate-spline transform, then save the result as a GeoTIFF. For vector data already in a different CRS, reproject deliberately:
ogr2ogr -t_srs EPSG:32613 units_utm.gpkg units_wgs84.gpkg
Field point data (CSV of easting/northing or lon/lat plus attributes) comes in as a delimited-text layer; confirm the X/Y columns and the source CRS at import so points do not land in the ocean.
Stage 2 — Separate observation from interpretation
This is the stage that distinguishes a defensible geologic map from a pretty one. Keep four conceptual layers apart:
- Observation — station points, samples, measured attitudes (strike/dip), photographs. These are facts; never edit them to fit a model.
- Interpretation — contacts, unit polygons, mapped faults. These are inferred and must carry a confidence and a source.
- Derived analysis — hillshade, slope, buffers, interpolated surfaces, cross-sections.
- Presentation — labels, legends, cartographic generalization.
Tag interpreted features with a confidence field (numeric LocationConfidenceMeters for lines, controlled-vocabulary identity confidence for units, following the GeMS pattern) and a DataSourceID. When a reviewer later asks "is this contact mapped or inferred?", the data answers, because observation and interpretation never got fused into one anonymous layer.
Stage 3 — Terrain context
Geology reads far better against relief. From a DEM, generate a hillshade and slope with GDAL:
gdaldem hillshade dem.tif hillshade.tif -z 1.5 -az 315 -alt 45
gdaldem slope dem.tif slope.tif
Place the hillshade as the bottom layer, then draw geology fills above it at ~60–70% opacity so the topography shows through. A multidirectional hillshade (-multidirectional) often reads better in rugged terrain. When the structural story needs depth — dipping units, fault scarps — drape the geology over the DEM in the QGIS 3D map view (or in a web viewer with terrain) using a vertical exaggeration of roughly 1.5–2× for legibility, and state the exaggeration so no one mistakes it for true scale.
Stage 4 — Style from attributes
Symbology should be categorized by the MapUnit field so each unit gets its consistent fill, ordered by stratigraphic age in the legend (youngest at top). Faults and contacts render from their Type and IsConcealed attributes — solid for certain, dashed for approximate, dotted for concealed, with thrust teeth and normal-fault ticks driven by direction. Structural points use a rotated strike-and-dip marker bound to the azimuth field, labeled with the dip. Doing all of this from attributes (not per-feature hand styling) is what keeps the legend honest and the map reproducible.
Stage 5 — Publish
For a print sheet, build a QGIS Print Layout with the map frame, a data-driven legend, scale bar, north arrow, CRS note, and source/credit block, and export to PDF/A or a high-resolution GeoPDF.
For the web, convert layers to tiles. Vectors become vector tiles:
tippecanoe -o geology.pmtiles -Z6 -z16 --drop-densest-as-needed units.geojson contacts.geojson
The hillshade becomes either raster tiles or a Cloud-Optimized GeoTIFF (gdal_translate -of COG) served directly. Render in MapLibre with the same attribute-driven styling and a click-to-identify popup that exposes unit description, age, confidence, and source — so the web map is an interface to the data model, not a screenshot of it.
A condensed end-to-end example
- Reproject all vectors to EPSG:32613 with
ogr2ogr; georeference the scanned sheet in QGIS. - Import field CSV as points; keep observation layers read-only.
- Digitize/clean interpreted contacts and polygons with topology checks; tag confidence and source.
gdaldem hillshadethe DEM; set geology fills to ~65% opacity above it.- Categorize symbology by MapUnit; data-drive fault and attitude symbols.
- Build a Print Layout for the sheet;
tippecanoe+ COG for the web. - Wire identify popups in MapLibre reading the real attributes.
Common pitfalls and why they happen
- Editing observations to match the model — moving a station so the contact looks cleaner. This destroys the record; the cause is collapsing observation and interpretation into one layer.
- Geology drawn fully opaque over terrain, hiding the relief that explains the structure; drop the fill opacity.
- Unstated vertical exaggeration in 3D, which makes gentle dips look like cliffs and misleads viewers.
- Per-feature hand styling that the legend can't track, producing legend drift after any edit. Style from attributes.
- Working in EPSG:4326, so measurements and buffers are wrong by a factor that varies with latitude.
Validation summary
Before publishing: every layer shares one projected CRS; observation and interpretation are in separate, labeled layers; interpreted features carry confidence and source; geology sits legibly over a hillshade; symbology and legend are attribute-driven and stratigraphically ordered; any vertical exaggeration is stated; and the published artifact (print or web) round-trips the attributes a reader needs.
Bathyl perspective
We treat visualization as the last mile of interpretation, not decoration applied after the fact. The workflow above keeps the chain auditable — a viewer can trace any rendered contact back to whether it was observed or inferred, and to the source that justifies it.
Related reading
- Geological Map QA Checklist
- Geological Map Viewer Features That Matter
- QGIS for Geological Mapping
- Geological visualization