Rijkswaterstaat water levels: is it worth wiring in? #197
Labels
No labels
agent
agent:ci
agent:done
agent:failed
agent:needs-input
agent:refined
agent:refining
agent:running
agent:shipped
agent:skip
autonomous
autopilot
driven
local
plan
proposal
qa
qa-gap
research
retro
ship
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jeroen/cartopolis#197
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
docs/direction.mdcarries Rijkswaterstaat water levels — "canal and river surfaces at their real height" as an unverified candidate. The ticket's first half is the worth-check: interface, licence, per-cell cost, and whether it changes the picture.Three of those four are already answered, from read-only HTTP probes run during this refinement on 2026-08-30 (no build, no repo change). They are recorded here so nobody repeats them:
Interface — exists, keyless, and the old one is being retired.
https://waterwebservices.rijkswaterstaat.nl/…now 301s to a migration notice. The live service ishttps://ddapi20-waterwebservices.rijkswaterstaat.nl/:POST /METADATASERVICES/OphalenCataloguswith{"CatalogusFilter":{"Compartimenten":true,"Grootheden":true}}→ 200, 1,573,954 bytes.LocatieLijstholds 2,498 locations, each withLat/Lonin ETRS89 (≈WGS84). Of those, 705 are joined to theWATHTE(Waterhoogte) quantity throughAquoMetadataLocatieLijst.POST /ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingenfor{"Locatie":{"Code":"groningen"}},Grootheid: WATHTE,ProcesType: meting, one hour → 200, 3,374 bytes, 7 measurements (10-minute cadence).Eenheid: cm,Hoedanigheid: NAP, value −91 cm NAP. AnX-API-KEYheader is requested but not enforced.Licence — CC0.
https://rijkswaterstaatdata.nl/waterdata/states "Op de inhoud van de WaterWebservices is de Creative Commons zero verklaring (CC0) van toepassing." Redistribution of a cached extract is allowed. The licence was never the obstacle.Coverage — stations, not a field. Nearest
WATHTEstation to each centre, haversine over the 705 coordinates:groningen)buiksloot)nieuwegein.doorslag)rotterdam.nieuwemaas.boompjes)katwijk)nijmegen)Unlike the NDW check, the stations are not absent from cities. But a station is a point with a code and a name; nothing in the response says which water body its level applies to. Attaching
groningen's −0.91 m to a Diepenring polygon is a nearest-point guess against value 1, and the register is Rijkswaterstaat's main-water network while a city canal is usually a water board's boezem.The fourth question is the one the code answers, and it answers "no". The client cannot draw water below the ground it sits in:
terrain.level_over(…)atcrates/cartopolis/src/systems/map/map_geometry.rs:1786, the median of the terrain field's samples under it (crates/cartopolis/src/systems/map/terrain.rs:218).crates/cartopolis/src/systems/map/height.rs:583), andFILL_PASSESdilates the banks inward over ~150 m (crates/cartopolis/src/systems/map/terrain.rs:47,:84). So today's water level is the quay level, filled in from the sides.y_offset−0.0035 m (crates/geo/src/vector_tiles.rs:1283),depth_rung4.0 (crates/geo/src/vector_tiles.rs:1350). The whole ladder spans 8 mm.crates/cartopolis/src/systems/map/map_stream.rs:884). Its finest level rests at y = −0.03 m (crates/cartopolis/src/systems/map/map_stream.rs:627), 2.65 cm below the water sheet.crates/geo/src/vector_tiles.rs:1329).Drop a canal to its register level — order of a metre below the quay — and it goes under an opaque, continuous basemap plane with no bank geometry anywhere to close the gap. There is no canal wall in this tree; the surface stack is a sheet, not a solid.
Approach
Documentation only. No crate is touched, so nothing here compiles.
docs/notes/rijkswaterstaat-water-levels.md, in the shape ofdocs/notes/ndw-traffic.md—topic:/triggers:/updated:front matter perdocs/notes/README.md, title of the form "…: checked and not taken". It records: the endpoint move offwaterwebservices.rijkswaterstaat.nl, the two request bodies and their measured sizes, the CC0 statement and where it is published, the 705-station coverage table above, the absence of any water-body identifier on a station, and the geometry finding with its citations. It also states plainly what would have to exist before the row could be revisited: a hole punched in the clipmap under water polygons, and bank/quay geometry to close the vertical gap. Filing that as a follow-up ticket is optional and not required by this ticket.Rijkswaterstaat water levelsrow indocs/direction.mdfrom Candidates, unverified to Checked and not taken, with aCheckeddate of the day the branch is written, a one-paragraph reason in the table's existing style, and a link to the new note.docs/notes/terrain-relief.md, beside its existing statement that water takes one level for the whole body — that is where the next person asking this question will land.Refs #197. Conventional Commits,docs(direction):scope, matching24f2169.The values that settle it, to be stated in the commit body as
docs/direction.mdrequires:--dump-statefield an--expectcould hold.Acceptance criteria
docs/notes/rijkswaterstaat-water-levels.mdexists, withtopic:/triggers:/updated:front matter matchingdocs/notes/README.md.METADATASERVICES/OphalenCatalogus,ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen), states that the pre-migration host is being retired, and records the request bodies that were used.https://rijkswaterstaatdata.nl/waterdata/as where that is stated.WATHTElocations, and the bytes/measurement count for one station-hour.map_geometry.rs:1786,terrain.rs:218,vector_tiles.rs:1283,map_stream.rs:627andmap_stream.rs:884.docs/direction.md's Candidates, unverified table no longer contains the Rijkswaterstaat row; the Checked and not taken table does, with a date, a reason and a link to the note.docs/notes/terrain-relief.mdlinks to the new note where it discusses water taking one level.Refs #197. NoCo-Authored-Bytrailer.docs/is modified.Verification
The numbers above were measured; re-running is optional confirmation, not a gate. Each is one read-only request:
Station counts and distances come from
/tmp/cat.jsonalone: joinAquoMetadataLijst(Grootheid.Code == "WATHTE") toLocatieLijstthroughAquoMetadataLocatieLijst, then haversine against the six centres.One number was deliberately not taken here, because getting it is work and this pass decides whether to build. The gap between today's AHN-derived canal level and the register's NAP level is measurable without the client, via one AHN DTM box over a Groningen canal:
(the request shape is
HeightRequestincrates/cartopolis/src/systems/map/height.rs; the anchor's absolute NAP datum isHeightLayer::ground_m,height.rs:295, whichdocs/notes/flood-defences.mdalready uses to convert a NAP crest into anchor-relative metres). Include it in the note if taken. It does not change the conclusion either way: above ~8 mm the coplanar stack cannot hold the drop and the basemap covers the water; below it there is nothing to show. Say which of the two the measurement lands on, or say it was not measured.Nothing to build and nothing to render. No
cargocommand applies — no crate is touched. No--shotorcargo shotsis needed, which is as well, since this container cannot render.Nothing needs a workstation. If the branch grows any non-docs change, that is out of scope and the ticket has changed shape.
Out of scope
tools/extractor, no coverage manifest, no streamer, nocartopypipeline. The "if it is worth doing" half of the ticket does not fire.peilgebied/peilbesluitpolygons (target levels as areas, published alongside thewaterkeringlinessystems::dikesalready streams). They are a different source with a different provider and would be a different frontier row, not this one. Mention as a pointer if useful; do not check or spec it here.3D basisvoorzieningrow in the same candidates table. Untouched.PROTOCOL_HISTORY, any migration,CHANGELOG.md. Docs-only;24f2169did not touch the changelog either.Open questions
None.
Branch:
docs/197-rijkswaterstaat-water-levelsOriginal request
From the frontier in
docs/direction.md: Rijkswaterstaat water levels — canal and river surfaces at their real height.The first half of this ticket is deciding whether it is worth doing at all:
Not worth it is a valid answer. Record it in
docs/direction.mdagainst this rowwith the reason, and close this ticket — that is the result, not a failure.
Decide it yourself. This ticket is not being watched, so a question asked
here is a ticket that stops. The seven values at the top of
docs/direction.mdexist to settle exactly this kind of ambiguity — pick the reading they support,
say in the commit body which one you applied and why, and build. Only a decision
that would need something nobody can derive from the repository — a credential, a
licence somebody must agree to, a choice about what the project is for — is a
reason to stop.
If it is worth doing, follow the shape the surveyed layers already use:
an extractor under
tools/, a coverage manifest, a streamer that adds to whatis drawn rather than replacing it, and no unbounded per-frame upload.
Filed by the autopilot.
🤖 Refined by the viberfox issue agent. Reply with @agent refine and what is wrong to have this rewritten.
🤖 Refining this before anything gets built — reading the code, no branch, no commits. If it turns out I'd have to guess at the requirements I'll stop and ask instead.
🤖 Refined. The description above is now the spec; I'll pick it up for implementation on the next poll.
If the direction is wrong, say so now — @agent refine with a correction rewrites it, and
agent:skipstops me.🤖 viberfox issue agent on the VPS — 40 turns · $3.40 · session
8c2429cf-3350-407a-84d7-c2e44780c2d4. Reply with @agent to continue this session.🤖 Picked this up — working on branch
docs/197-rijkswaterstaat-water-levelsin a fresh worktree on the VPS. I'll report back here when I'm done.Label an issue
agent:skipto keep me off it, ordrivento keep it in a session you are driving.Pushed. One commit, docs only.
The answer is no, and it is this codebase that says so — not Rijkswaterstaat
I re-ran every probe in the ticket rather than trusting it, and took the one measurement it left open.
What holds up. The old host
waterwebservices.rijkswaterstaat.nlnow 301s to a migration notice; the live one isddapi20-…. The catalogue is 1,573,954 bytes with 2,498 locations, 705 of them water-height stations. A station-hour is 3,374 bytes, 7 measurements, cm NAP. No API key is enforced. CC0, stated onrijkswaterstaatdata.nl/waterdata/. Four of six city centres have no station within a kilometre; Rotterdam and Nijmegen came out slightly closer than the ticket's table because I used my own centre coordinates, which the note now states.One finding sharpened. A station record has exactly seven fields and none of them names a water body.
groningen— whose −0.91 m would be attached to the Diepenring — sits 2 km out on the Van Starkenborghkanaal and carries no water name at all. So every polygon's level would be a nearest-point guess.The number the ticket deliberately left open, now taken. AHN's DTM over the Groningen canals is no-data on the water and +1.1 to +4.6 m NAP on the banks, against an anchor datum of +7.57 m at the Grote Markt and a register level of −0.91 m. The drop is two to five metres. The coplanar stack spans 8 mm and the clipmap's finest level is 2.65 cm below the water sheet, so the canal would go under an opaque basemap with no bank geometry to close the gap. That lands the measurement firmly on the "cannot hold it" side.
Files
docs/notes/rijkswaterstaat-water-levels.md— new, in the shape ofndw-traffic.md.docs/direction.md— row moved from Candidates, unverified to Checked and not taken, dated 2026-08-30.docs/notes/terrain-relief.md— cross-reference where it says water takes one level.Values applied, in the commit body: 5 and 3 as the pair that settles it, 1 as the case for the row that loses on the join, 6 because there is no
--dump-statefield an--expectcould hold.Verification
cargo fmt --checkis clean. No crate is touched, socargo checkand the test suites have nothing to say about this diff and I did not run them — CI's own path filter skips the build jobs for adocs/**-only change. Nothing needs a visual check; there is no rendering change here.For you to decide
Two pointers I recorded but did not check, because they are separate frontier rows rather than this one:
peilgebied/peilbesluit— target levels as areas, published alongside thewaterkeringlinessystems::dikesalready streams. An area answers the join question a station cannot. The geometry obstacle applies to it identically, so it is only worth a row once the ground stack changes.Branch
docs/197-rijkswaterstaat-water-levels(pushed)🤖 viberfox issue agent on the VPS — 38 turns · $3.59 · session
ad9d639a-647e-43ac-8a96-0121efb720d9. Reply with @agent to continue this session.🤖 Marked
agent:donewithout a CI verdict on004d9b0b— no workflow reported on this commit. The branch is waiting for review; check the run yourself before landing it.🤖 Merged into
mainas pull request #198 (004d9b0b).🤖 Merged, but not deployed. The deploy step exited 1:
mainhas the change; the public services are still on the previous build.agent:donenever means "CI agreed" #220hidden_tiles, which does not exist #244docs/qa/targets.md— 14 of 14 passes re-verified a shipped ticket, 9 of them documentation-only verdicts #280