Short answer
A reproducible spatial analysis product is a deliverable that can be rebuilt, re-queried and re-verified long after the original analyst has moved on. It separates raw sources from processing code, from derived outputs, from the publishing layer; it versions both data and code; it carries machine-readable metadata and lineage; and it runs its quality checks automatically. The difference from a normal GIS job is that every update improves the asset instead of recreating the deliverable, and any past result can be reproduced on demand.
A product is an architecture, not a file
A map export is a snapshot. A product is the system that can regenerate that snapshot and a hundred variations of it. Designing one means committing to a layered architecture where each layer has a single responsibility:
- Source / ingestion — raw external data, captured immutably with its vintage, licence and checksum. Never edit source in place.
- Normalised storage — a canonical model in one CRS with consistent schemas, typically PostGIS or partitioned cloud-native files (GeoParquet, Cloud-Optimized GeoTIFF).
- Analysis / derivation — scripted transformations (GDAL, SQL, Python) that produce the analytical outputs, run from code under version control.
- Publishing — the formats and endpoints consumers actually touch: GeoPackage downloads, vector tiles, an OGC API, a dashboard.
Keeping these separate is what makes the product reproducible: you can blow away everything from layer 2 onward and rebuild it from layer 1 plus the code.
Version the data and the code
Reproducibility fails the moment "the latest data" overwrites "the data the report was based on." Two kinds of versioning are needed:
- Code: git, including the processing scripts, the schema definitions and the validation rules.
- Data: immutable, dated snapshots of source and derived datasets. For larger assets, a data-versioning layer such as DVC or lakeFS lets you tag a dataset state and roll back to it. At minimum, name snapshots by vintage (
hazard_zones_2026q1.gpkg) and never mutate a published version in place.
Record, in the metadata of every output, the source vintage, the processing version (a git tag or commit), and the CRS. With those three facts, any historical result can be reproduced exactly — which is precisely what an auditor or a contesting stakeholder will ask for.
Choose access patterns from the question, not the tech
Different consumers need different doors into the same data:
- OGC API - Features when clients need to query and filter live feature data over HTTP with pagination and CQL filters. It is the modern, JSON-native successor to WFS, and tools such as pygeoapi or GeoServer implement it directly on top of PostGIS.
- OGC API - Tiles / vector tiles for fast cartographic rendering of large datasets in a web map.
- Static download (GeoPackage, COG, GeoParquet) for consumers who want the whole dataset for offline or heavy analysis. A Cloud-Optimized GeoTIFF served from object storage with HTTP range requests gives partial reads without a server.
- Dashboard or managed report only when the need is a curated view, not raw data.
A frequent mistake is building a dashboard when the real requirement is a maintained, queryable dataset underneath. The dashboard is the easy part; the durable asset is the data layer and its update logic.
Worked example: a regional hazard layer as a product
Suppose the recurring need is "where are the active landslide-susceptibility zones, updated quarterly?"
- Ingest new source rasters and field updates into dated source folders with checksums and a licence note.
- Normalise into PostGIS in EPSG:2154, harmonised schema, geometries validated with
ST_MakeValid. - Derive susceptibility with a scripted model (slope, lithology, drainage); the script is versioned and produces a COG plus a vectorised zone layer.
- Validate automatically: geometry validity, extent inside the area of interest, class areas within expected ranges, checksum diff against the prior quarter to flag unexpected change.
- Publish via pygeoapi (OGC API - Features) for the GIS team and a tiled web map for stakeholders, plus a versioned GeoPackage download.
- Tag the release
hazard_v2026q1in git and snapshot the data, so the published map can always be traced back to its inputs.
Next quarter, only step 1's inputs change; everything downstream rebuilds deterministically. That is the test of a product.
Metadata and lineage make it auditable
Structure the metadata to recognised standards so it survives handover:
- ISO 19115 / 19139 for dataset-level metadata, including the lineage element that describes processing history.
- STAC (SpatioTemporal Asset Catalog) for indexing raster/imagery collections in a searchable, web-friendly way.
- W3C PROV concepts (entity, activity, agent) when you need a fine-grained chain linking each output to the activities and inputs that produced it.
Embed CRS, units, scale, source vintage and licence directly in the file or its sidecar (GeoPackage metadata tables, COG tags, STAC item properties) so the facts travel with the data rather than living in a forgotten email.
Automated quality control
Manual QA does not scale across quarterly updates. Encode the checks:
- Geometry validity and topology (
ST_IsValid, gap/overlap checks for zone layers). - CRS and extent assertions on every published artefact.
- Attribute domain checks (no nulls in required fields, codes within the controlled vocabulary).
- Regression diffs of class areas or feature counts against the previous version, with a threshold that fails the run.
Run these in CI so a release cannot publish unless it passes, the same way software ships behind a test suite.
Common pitfalls and why they happen
- Calling a folder of files a product. Without update logic and metadata, it cannot be maintained or trusted on the next cycle — there is no way to reproduce or audit it.
- Designing the API before the questions. Endpoints built without knowing who queries them and how end up exposing the storage schema, which leaks complexity to consumers.
- Ignoring licensing and provenance. Redistribution rights and source attribution are easy to skip and expensive to retrofit when a client asks where the data came from.
- Mutable "latest" data. Overwriting published versions destroys reproducibility; always snapshot.
Bathyl perspective
Our aim is to turn geological and geospatial work into durable, traceable assets rather than disposable maps. A strong product keeps the science auditable — every figure links back to its source vintage and processing version — while making the output far easier to reuse than a PDF ever could be.
Related reading
- From Consulting Output to Data Product
- Metadata Strategy for Earth Data Platforms
- From PDF Report to Spatial System
- Reproducible GIS Pipelines
- Spatial data products