RVO crop parcels (BRP), PDOK OGC API: is it worth wiring in? #205

Merged
viberfox-agent merged 1 commit from feat/203-brp-crop-parcels into main 2026-08-30 05:57:08 +00:00
Collaborator

Closes #203

Merged by the autopilot (docs/direction.md) after every Actions job passed on the branch head.

Closes #203 Merged by the autopilot (docs/direction.md) after every Actions job passed on the branch head.
feat(map): draw each registered crop parcel in its own tone
All checks were successful
CI / test cartopolis (pull_request) Successful in 11m41s
CI / wasm & android targets (pull_request) Has been skipped
6e7cb3098d
Everything outside a Dutch city is one flat green. `land_group` collapses
grass, meadow, park, garden, farmland, orchard, scrub, heath, allotments,
village_green and recreation_ground into `SurfaceGroup::Grass`, so a potato
field, an orchard and a municipal lawn are painted the same colour. The
RVO's crop register (BRP) names the crop grown on every agricultural parcel
in the country — keyless, bbox-queryable, Public Domain Mark 1.0 — and this
is the client half that draws it.

`cartopolis_geo::crops` is the pure half: `CropParcel`, an append-only
`CropCategory`, a curated `gewascode` → tone table, and byte-bounded meshes
through the same ceiling the paving uses. `systems::crops` is the streaming
half: a `CoverageSlot`, a per-cell file, and the projection into the frame
`map_geometry`'s worker meshes in — awaited beside the surveyed paving,
because a parcel ends up baked into that cell's own meshes.

Four decisions, from `docs/direction.md`'s values:

* **Drawn over the green, not instead of it** — value 4. `SurfaceGroup::Crop`
  takes rung 2.5 and y −0.0080, half a step above `Grass` and below `Forest`:
  half the usual step because a parcel only ever overlaps grass and is never
  coplanar with a wood or a beach. With no manifest — every host that has not
  run the extractor, and everywhere outside the Netherlands — nothing is
  fetched after the coverage latches and the map is what it was.
* **`Landschapselement` is not drawn** — value 4 again. It is 60 % of the
  features and 316 of 340 sampled are ditches, which the Shortbread water
  layers already draw; filling one with land puts ground where the register
  says water. The wire position is reserved and non-drawable.
* **A parcel that leaves its cell is drawn whole** — the paving's binning
  rule could not be copied. Measured 2026-08-30: 22 % of the parcels a
  Groningen farmland cell owns leave it, 24 % over Flevoland, so dropping
  them would delete a quarter of the country's fields.
* **The client ships before the extractor** — value 6, and the order
  `surveyed.rs` already records. `server/pipeline/brp.ts` is a follow-up
  ticket; until it exists `crop_parcels` reads 0 everywhere and the unit
  tests are the whole gate. A client that can read a form the host never
  sends is inert; the reverse silently throws content away.

It also fixes a defect that already ships (value 1): `farmland` is one of
the kinds `land_group` calls `Grass`, so `GrassArea` grows near-field blades
on every arable field in the country. Arable parcels are now a third
keep-out beside the water and the roads, and nothing in the tile could have
supplied that answer — a potato field and a meadow are the same polygon
there.

`paving`'s triangulation moved to `geo::flat_fill` and is shared rather than
copied: the winding fix, the byte cap and the sRGB vertex tint are each a
bug this tree has already had once.

Measured against the live service on 2026-08-30, one request per exact z14
cell: 308 features / 921 KB over the Groningen farmland cell (122 drawn),
199 / 232 KB over Flevoland (120 drawn), 0 over the Grote Markt. Simplified
at 0.5 m that is ~40 KB of coordinates for the heaviest cell, against the
3.8 MB of surveyed paving already streamed. The honest limit is in the note:
94 % of the Groningen cell's parcel area is grassland, so half the
countryside gains a confirmed fact and very little picture.

Not verified: nothing renders this yet, so the new depth rung has never met
a real parcel. `--flicker` over farmland is the check, once a host serves a
cell.

Refs #203
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jeroen/cartopolis!205
No description provided.