Add governed bathymetry profile workflow
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-17 15:25:00 +02:00
parent c0cab9e3c5
commit 5b4e18059a
31 changed files with 1990 additions and 4 deletions
+34
View File
@@ -2055,3 +2055,37 @@ specifically, no water volume is inferred from 2D water geometry. The backend
sets an explicit Ollama context window and returns
`OLLAMA_RESPONSE_TRUNCATED` instead of accepting a response with
`done_reason=length` as a complete answer.
## Bathymetry and VHA profile acquisition
### GET `/api/v1/projects/{project_id}/datasets/bathymetry/sources`
Returns the governed bathymetry source registry in the canonical envelope.
VHA inland profiles are `operational`. MDK Belgian Continental Shelf and SPW
Walloon bathymetry remain `available_not_integrated`; they cannot be acquired
through this contract until their raster/download and vertical-datum flows
pass live validation.
### POST `/api/v1/projects/{project_id}/datasets/bathymetry/profiles/acquire`
```json
{
"bbox": {"min_x": 5.0, "min_y": 51.0, "max_x": 5.3, "max_y": 51.3, "crs": "EPSG:4326"},
"area_id": "optional persisted Area uuid",
"force_refresh": false
}
```
The endpoint creates a synchronous `vector.bathymetry_profiles.acquire` Job.
It queries the official VHA Digital Atlas in bounded pages, intersects every
point with the persisted Area when supplied and persists one ordinary
reference Dataset plus VectorFeature rows. The result reports exact profile,
document, structured-depth/width and watercourse counts and the source
measurement-date range.
The acquired Dataset uses
`source_name=vmm_vha_bathymetry_profiles`,
`dataset_role=reference` and
`reference_layer_name=bathymetry_profiles`. Existing vector content and
selection endpoints provide GeoJSON and metrics. The contract does not expose
a continuous bathymetric surface, current water depth or water volume.
+131
View File
@@ -0,0 +1,131 @@
# Bathymetry expansion roadmap
## Purpose
GeoIntel must distinguish three different questions:
1. Where were cross-sections measured and what does the source document say?
2. What is the continuous elevation of the bed at a specific survey epoch?
3. What is the water depth or volume at a specific moment?
Only the first question is operational for Mol through the VHA cross-section
profile layer. A bed model does not provide water depth without a compatible
water-surface elevation. Flood-hazard maximum depth is a scenario result and
must not be reused as current water level.
## Governed source matrix
| Source | Coverage | Data | Vertical reference | GeoIntel status |
| --- | --- | --- | --- | --- |
| VMM VHA Digital Atlas | Flanders | Point locations, structured profile fields, PDF evidence | Document-specific | Operational, bounded vector acquisition |
| MDK Belgian Continental Shelf model | Belgian North Sea | Continuous 20 x 20 m bathymetric raster | LAT | Available, not integrated |
| SPW navigable waterways and reservoir lakes | Wallonia | 0.5 m bed-elevation raster and XYZ cloud | mDNG | Available, not integrated |
| Port of Antwerp-Bruges publications | Port survey areas | Periodic soundings | Product-specific | Catalog candidate |
VHA contains approximately 129,643 profile points across Flanders at the
observed catalog state. This is a scale indication, not a fixed contractual
count. Mol contained 828 exact in-boundary points during source validation,
715 with document links and 112 with a structured depth field. Production
provisioning always records the live counts and checksums.
## Operational tier 1: Mol
- Query only an explicit EPSG:4326 bbox.
- Intersect the bbox with the exact persisted Mol Area.
- Page the official ArcGIS FeatureServer response without truncation.
- Resolve VHA watercourse names from the official atlas layer.
- Normalize profile points to EPSG:4326.
- Persist the artifact through `DatasetService.import_vector_bytes`.
- Persist every point through `VectorFeatureService`; the provider never
writes directly to `vector_features`.
- Expose document, measurement date, depth and width fields without parsing or
inventing values from scanned PDFs.
- Keep volume unsupported.
## Tier 2: all of Flanders
Flanders must be provisioned as exact municipality or other approved Area
partitions, not as one monolithic request. The backend feature limit protects
the provider and the application. A regional logical layer may group complete
partitions, but each Dataset retains its Area id, query URLs, checksums, exact
count and measurement-date range.
Before regional activation:
- add a governed Flanders boundary manifest and partition coordinator;
- prove idempotent resume and no duplicate VHA `OBJECTID` within a partition;
- benchmark PostGIS point selection and viewport delivery;
- add freshness/version probing for the VHA MapServer;
- keep individual profile dates instead of fabricating one Dataset
`observed_at`.
## Tier 3: Belgium
Belgian coverage is a federation of source adapters with one normalized
contract, not one assumed national dataset:
- Flanders: VHA profiles and future validated bed rasters;
- Wallonia: SPW bathymetry for measured navigable waterways/reservoirs;
- Brussels: hydrological context until an authoritative public bathymetric
product is identified;
- federal/maritime: MDK and legally appropriate maritime boundaries.
Every adapter must emit:
- authority and owner;
- exact geographic and temporal coverage;
- horizontal and vertical CRS/datum;
- survey/acquisition time;
- resolution or sample density;
- source URL, request identity, checksum, attribution and license;
- explicit supported and unsupported metrics.
LAT, TAW and mDNG values must never be merged or compared without a documented,
tested vertical transformation and uncertainty statement.
## Tier 4: the Belgian North Sea
The map must distinguish:
- the Belgian land boundary and baseline;
- the territoriale zee (up to 12 nautical miles);
- the Belgian EEZ and continental shelf, which are jurisdictional maritime
zones and should not be labelled ordinary municipal or provincial
"grondgebied".
The MDK bathymetry WCS is the preferred continuous source candidate. Activation
requires a live Docker validation of TLS/certificates, GetCapabilities,
coverage identifiers, bounded GeoTIFF retrieval, CRS, LAT, nodata, pixel size,
response limits and maritime clipping. WMTS can support visual context but is
not the analytical source.
## Depth and volume rules
For a compatible bed raster and water-surface raster at the same time and
vertical datum:
`volume_m3 = sum(max(0, water_surface_z - bed_z) * cell_area_m2)`
For surveyed cross-sections along a connected reach:
`volume_m3 = sum(((section_area_i + section_area_i+1) / 2) * reach_length_i)`
The second method requires complete profile geometry, ordered chainage,
contemporaneous water level and defensible interpolation. VHA profile points
alone do not satisfy those prerequisites.
Historical evolution compares only survey epochs with documented compatible
coverage, datum and method. A changed raster footprint is not automatically
bed evolution.
## Implementation order
1. Operate and validate the Mol VHA profile Dataset and map flow.
2. Add VHA municipal partition orchestration for Flanders.
3. Implement a bounded MDK WCS probe, then acquisition behind live evidence.
4. Implement SPW download staging and vertical-datum metadata validation.
5. Add maritime boundaries as separate authoritative scope layers.
6. Add cross-source vertical-datum transformation only with authoritative
grids/parameters and uncertainty tests.
7. Add volume only after a compatible measured or modeled water-surface source
is part of the same analysis contract.
+24
View File
@@ -10010,3 +10010,27 @@ Validation:
stays within its 375 px client width; the theme inventory is bounded to a
compact scrollable selector so it no longer pushes the map behind all 15
theme cards.
## Sprint 235 - Governed bathymetry profiles and Belgian expansion model (2026-07-17)
Implemented:
- Audited official VHA, MDK Belgian Continental Shelf and SPW Walloon
bathymetry services and separated profile evidence, continuous bed models
and time-specific water depth/volume.
- Added bounded, paged VHA profile acquisition with exact persisted-Area
clipping, official watercourse names, document links, checksums and standard
Dataset/VectorFeature persistence.
- Added reusable vector-byte import and governed `min`/`max` property metrics
to the existing selection aggregation path.
- Added the bathymetry source and acquisition API, environment controls, Mol
operator command, map theme, profile inspector and source inventory.
- Documented partitioned Flanders scaling and federated Belgium/maritime
scaling with explicit territorial sea, EEZ/continental shelf and
TAW/LAT/mDNG semantics.
Validation:
- Backend compilation, 914 backend tests, documentation/contract audits,
Alembic head `202607160001`, frontend TypeScript typecheck and the production
Vite build passed in the complete readiness gate.
- Full readiness and live Mol acceptance are recorded after final validation
and deployment below.
+15
View File
@@ -360,3 +360,18 @@ the composite expression index
It supports exact preclipped municipality selection without changing the
canonical `vector_features` schema or introducing operator-specific tables.
Free rectangle queries continue to use the geometry GiST index.
## Bathymetry profile persistence
VHA profile points require no new table or migration. The immutable GeoJSON
artifact is stored as one normal reference `datasets` row and
`dataset_versions` row; each exact point is a normal `vector_features` row with
EPSG:4326 geometry and source properties. Existing dataset, source-feature and
GiST indexes support selection.
Profile measurement dates remain feature properties because a bounded Dataset
can contain many historical campaigns. No artificial Dataset `observed_at` or
temporal series is assigned. A future bed raster remains file/object storage
plus Dataset metadata, not raster-in-database storage. Any national/maritime
extension keeps source vertical datum, survey epoch and Area partition
explicit and does not create a provider-specific shadow schema.
+23
View File
@@ -709,3 +709,26 @@ thematic rasters for space occupation, open space, population density, node
value and service level. The digital soil map should follow the existing
canonical vector persistence path. Watercourse/runoff additions remain in the
roadmap but no longer precede these cross-domain gaps.
## Bathymetry, inland profiles and maritime scope
The official VHA Digital Atlas profile-point layer is the first operational
bathymetry-adjacent source. GeoIntel requests an explicit bbox, clips against
the exact persisted Area and retains VHA point identifiers, watercourse names,
profile numbers, measurement dates, available structured depth/width values
and official document URLs. Scanned documents remain evidence; missing fields
are not filled by fabricated OCR output.
The following sources are audited but not yet operational:
- MDK Dieptemodel Belgisch Continentaal Plat/Noordzee: 20 x 20 m continuous
raster in LAT, exposed through WCS/WMTS.
- SPW bathymetry of navigable waterways and reservoir lakes: 0.5 m bed
elevation and XYZ data in mDNG.
- Port of Antwerp-Bruges periodic soundings: catalog candidate pending a
stable public machine contract.
See `docs/BATHYMETRY_EXPANSION_ROADMAP.md`. TAW, LAT and mDNG remain separate
until an authoritative vertical transformation is implemented and tested.
The territorial sea, EEZ and continental shelf are separate scope layers and
must be labelled according to their legal meaning.
+19
View File
@@ -438,3 +438,22 @@ Sprint 7B makes provider architecture operationally visible without performing l
- status: `configured`
- dataset mapping: `dataset_role=reference`, `source_name=fixture`
- write path: checked-in demo/test fixture flow
## Bathymetry profile vector contract
The operational VHA layer is an EPSG:4326 point FeatureCollection. Required
normalized properties are:
- `provider_record_id` and `source_feature_id`;
- `watercourse_vhag`, `watercourse_name` and alternative names;
- `profile_number` and `measurement_date`;
- nullable `recorded_depth_m`, `recorded_crown_width_m` and
`recorded_floor_width_m`;
- nullable allowlisted `source_document_url`;
- `document_available`, `structured_depth_available`;
- `measurement_semantics=historical_cross_section_profile_point`;
- `vertical_reference=document-specific`.
Null means the provider did not expose a structured value. It is never
converted to zero. Dataset metadata records exact counts, measurement range,
scope, attribution and `volume_supported=false`.
+15
View File
@@ -749,3 +749,18 @@ This file now starts with the current implementation status. Older preparation/b
- [x] Keep orthophoto pixel refresh manual through a separate
plan-stage-review-apply flow that retains the passed preflight identity and
creates a new immutable Dataset with official `YYYY.NN` source version.
# Bathymetry follow-up
- [ ] Add governed municipality partition orchestration for all of Flanders
after the Mol VHA operator passes live acceptance.
- [ ] Add read-only MDK WCS capability/TLS probe and maritime scope metadata.
- [ ] Add bounded MDK GeoTIFF acquisition only after live CRS, LAT, nodata and
response-limit validation.
- [ ] Add SPW staged-download adapter with mDNG metadata and survey-epoch
coverage validation.
- [ ] Add authoritative territorial-sea, EEZ and continental-shelf boundary
layers with legally accurate labels.
- [ ] Add vertical-datum conversion only when authoritative transforms and
uncertainty tests exist; never merge TAW, LAT and mDNG implicitly.
- [ ] Add water volume only when bed and water-surface inputs share a governed
time, datum and coverage contract.