#83: cover vocabulary — Poland's wetland absence is source truth, Sweden's is #14, and the grassland boundary is recorded #100

Merged
art-bot merged 1 commit from issue-83-cover-vocabulary into main 2026-08-13 04:45:41 +00:00
Owner

Refs #83 — pieces 2 and 3 of the cover-vocabulary issue. This PR deliberately carries
no closing keyword: the issue's own scope says it must not be closed without piece 1
(Sweden's wetland, tracked as #14), so #83 stays open until #14 lands.


#83: cover vocabulary — Poland's wetland absence is source truth, and the grassland boundary is recorded

Piece 1 (Sweden's missing wetland) is #14, already tracked as the dependency of this
issue — not part of this work; the configs, docs and DB were left untouched on that
front except for recording the exemption below.

Piece 2 — Poland's missing wetland: the catalogue-cited negative answer

The R6 check is done, and the answer is negative. GUGiK's published BDOT10k delivery
(opendata.geoportal.gov.pl/bdot10k/schemat2021/GPKG/<ww>/<teryt>_GPKG.zip) is the
provider's complete class catalogue, and it contains no marsh/bog class at all:

  • two county packages inspected end to end, 1401 (mazowieckie) and 2004 (grajewski —
    the county that holds most of the Biebrza marshes, Poland's largest wetland)
    ,
    carry nothing wetland-shaped in the PT group or in any other group;
  • the twelve pokrycie-terenu classes' rodzaj domains are exhaustive country-wide
    (from the loaded staging tables) with no bog value either — PTGN ("nieużytki", the
    traditional home of Polish bogs) holds only teren piaszczysty lub żwirowy
    (5 322 rows), pozostałe grunty nieużytkowane (2 029), teren kamienisty (676),
    piarg, usypisko lub rumowisko skalne (361).

All twelve PT classes are already fetched — the pt-sw-sk-oikm marker names the class
set it covers, so there is nothing to widen the fetch list with, and R9's marker rule is
not exercised. Poland's z3 cover has no wetland by source truth, not fetch gap;
the written exemption now lives in docs/country-poland.md and next to the rollups in
conf/common.yaml.

One measurement that makes the negative answer concrete: where BDOT10k does survey the
marsh ground, it classifies it as grass — over the Biebrza valley bbox (22.3–22.9 E,
53.2–53.7 N) the z13 table's 3857 geometry is 2 974 km² of pasture, the valley's
single largest class. Poland's wetland is hiding inside pasture exactly the way
Sweden's hides inside natural_grassland.

Piece 3 — the natural_grassland / pasture / moor boundary: the review is done and recorded

R44's check, four countries side by side, now written next to the landcover enum in
conf/common.yaml:

country source condition → class
IS LMÍ ships CORINE codes: 231/321/322 verbatim (z13: 1 901 / 2 088 / 2 064 polygons)
FI SYKE CORINE: 231 Laidunmaat, 321 Luonnonniityt, 322 Varvikot ja nummet (49 / 89 / 977)
SE Topo 10 2640 "Öppen mark" — catch-all for unbuilt, uncultivated, unforested land (heath, meadow, alvar, alpine heath), 1.9M polygons → 321 wholesale
PL BDOT10k PTTR "roślinność trawiasta" (agricultural permanent grass, 1.31M) → 231; PTRK kosodrzewina → 322; no 321

Decision (recorded in conf/common.yaml): the boundary is drawn at the CORINE
definitions (231 = agricultural grass, 321 = semi-natural low-productivity grass,
322 = low closed shrub cover), and the check passes — every country that can
distinguish the concepts does, and each coarse source lands on the class its mixture
is closest to. The visible cross-country mismatch (Sweden's meadows render as
natural_grassland where Poland's equivalent ground renders as pasture) is a
granularity artifact of the sources, not a concept divergence: neither survey
separates managed from semi-natural grass, so both are mapped to the aggregate-
dominant class per R137, and each judgement was already written next to the query that
makes it (semap.yaml / plmap.yaml). No mapping changes; this is the record the issue
asked for.

The z3 written exemptions (R22), now all recorded

Acceptance is "every country's z3 cover produces exactly the tier's defined vocabulary
or has a written exemption". Verified against the live DB:

country z3 set status
fi agricultural, artificial, nature, water, wetland the full level-1 vocabulary, no glacier (source has none) — nothing to record beyond that statement
is glacier, nature, water, wetland exemption recorded: artificial (791 km² at z5) absorbs at z4, agricultural (4 727 km² at z4) at z3 — whole-class totals under the 16 px² floor (1 532 / 6 128 km²), the absorption knob doing its job on a country whose arable land is 0.1% of its area
pl agricultural, artificial, nature, water exemption recorded (piece 2 above): BDOT10k has no wetland class
se agricultural, artificial, glacier, nature, water exemption recorded: Topo 10 mark has no wetland; the mires live in the sankmark overlay, whose carve-out is #14 — the dependency this issue waits for

Verification

  • importer TestRealConfigsValidate passes over all five configs (the edits to
    conf/common.yaml are comment-only, but the configs are re-validated as the loop
    requires);
  • make build and mapsrv go test ./... pass;
  • the z3/z13 cover queries above are run against the live DB, not assumed;
  • the catalogue check used the provider's own published packages (two counties
    downloaded to /tmp for inspection only — nothing was re-fetched into data/ and no
    reimport was needed, since this is a review-and-record change, not a data change).

Left undone / uncertain

  • Piece 1 (#14) — Sweden's wetland. Deliberately untouched; this issue stays open.
  • No fetch-list widening happened (nothing to widen); no reimport happened (no query or
    enum changed). If a future BDOT10k delivery adds a wetland class, the marker
    (pt-sw-sk-oikm) names the set and would need a new name — that is R9's rule, noted
    here for the record.
Refs #83 — pieces 2 and 3 of the cover-vocabulary issue. **This PR deliberately carries no closing keyword: the issue's own scope says it must not be closed without piece 1 (Sweden's wetland, tracked as #14), so #83 stays open until #14 lands.** --- # #83: cover vocabulary — Poland's wetland absence is source truth, and the grassland boundary is recorded Piece 1 (Sweden's missing wetland) is **#14**, already tracked as the dependency of this issue — **not part of this work**; the configs, docs and DB were left untouched on that front except for recording the exemption below. ## Piece 2 — Poland's missing wetland: the catalogue-cited negative answer The R6 check is done, and the answer is negative. GUGiK's published BDOT10k delivery (`opendata.geoportal.gov.pl/bdot10k/schemat2021/GPKG/<ww>/<teryt>_GPKG.zip`) is the provider's complete class catalogue, and it contains **no marsh/bog class at all**: - two county packages inspected end to end, 1401 (mazowieckie) and **2004 (grajewski — the county that holds most of the Biebrza marshes, Poland's largest wetland)**, carry nothing wetland-shaped in the PT group or in any other group; - the twelve pokrycie-terenu classes' `rodzaj` domains are exhaustive country-wide (from the loaded staging tables) with no bog value either — PTGN ("nieużytki", the traditional home of Polish bogs) holds only `teren piaszczysty lub żwirowy` (5 322 rows), `pozostałe grunty nieużytkowane` (2 029), `teren kamienisty` (676), `piarg, usypisko lub rumowisko skalne` (361). All twelve PT classes are already fetched — the `pt-sw-sk-oikm` marker names the class set it covers, so there is nothing to widen the fetch list with, and R9's marker rule is not exercised. Poland's z3 cover has no `wetland` by **source truth, not fetch gap**; the written exemption now lives in `docs/country-poland.md` and next to the rollups in `conf/common.yaml`. One measurement that makes the negative answer concrete: where BDOT10k *does* survey the marsh ground, it classifies it as grass — over the Biebrza valley bbox (22.3–22.9 E, 53.2–53.7 N) the z13 table's 3857 geometry is **2 974 km² of `pasture`**, the valley's single largest class. Poland's wetland is hiding inside `pasture` exactly the way Sweden's hides inside `natural_grassland`. ## Piece 3 — the natural_grassland / pasture / moor boundary: the review is done and recorded R44's check, four countries side by side, now written next to the `landcover` enum in `conf/common.yaml`: | country | source condition → class | |---|---| | IS | LMÍ ships CORINE codes: 231/321/322 verbatim (z13: 1 901 / 2 088 / 2 064 polygons) | | FI | SYKE CORINE: 231 Laidunmaat, 321 Luonnonniityt, 322 Varvikot ja nummet (49 / 89 / 977) | | SE | Topo 10 2640 "Öppen mark" — catch-all for unbuilt, uncultivated, unforested land (heath, meadow, alvar, alpine heath), 1.9M polygons → 321 wholesale | | PL | BDOT10k PTTR "roślinność trawiasta" (agricultural permanent grass, 1.31M) → 231; PTRK kosodrzewina → 322; no 321 | **Decision (recorded in conf/common.yaml):** the boundary is drawn at the CORINE definitions (231 = agricultural grass, 321 = semi-natural low-productivity grass, 322 = low closed shrub cover), and the check passes — every country that can distinguish the concepts does, and each coarse source lands on the class its mixture is closest to. The visible cross-country mismatch (Sweden's meadows render as `natural_grassland` where Poland's equivalent ground renders as `pasture`) is a **granularity artifact of the sources, not a concept divergence**: neither survey separates managed from semi-natural grass, so both are mapped to the aggregate- dominant class per R137, and each judgement was already written next to the query that makes it (semap.yaml / plmap.yaml). No mapping changes; this is the record the issue asked for. ## The z3 written exemptions (R22), now all recorded Acceptance is "every country's z3 cover produces exactly the tier's defined vocabulary or has a written exemption". Verified against the live DB: | country | z3 set | status | |---|---|---| | fi | agricultural, artificial, nature, water, wetland | the full level-1 vocabulary, no glacier (source has none) — nothing to record beyond that statement | | is | glacier, nature, water, wetland | **exemption recorded**: `artificial` (791 km² at z5) absorbs at z4, `agricultural` (4 727 km² at z4) at z3 — whole-class totals under the 16 px² floor (1 532 / 6 128 km²), the absorption knob doing its job on a country whose arable land is 0.1% of its area | | pl | agricultural, artificial, nature, water | **exemption recorded** (piece 2 above): BDOT10k has no wetland class | | se | agricultural, artificial, glacier, nature, water | **exemption recorded**: Topo 10 `mark` has no wetland; the mires live in the `sankmark` overlay, whose carve-out is #14 — the dependency this issue waits for | ## Verification - `importer` `TestRealConfigsValidate` passes over all five configs (the edits to `conf/common.yaml` are comment-only, but the configs are re-validated as the loop requires); - `make build` and `mapsrv` `go test ./...` pass; - the z3/z13 `cover` queries above are run against the live DB, not assumed; - the catalogue check used the provider's own published packages (two counties downloaded to /tmp for inspection only — nothing was re-fetched into `data/` and no reimport was needed, since this is a review-and-record change, not a data change). ## Left undone / uncertain - Piece 1 (#14) — Sweden's wetland. Deliberately untouched; this issue stays open. - No fetch-list widening happened (nothing to widen); no reimport happened (no query or enum changed). If a future BDOT10k delivery adds a wetland class, the marker (`pt-sw-sk-oikm`) names the set and would need a new name — that is R9's rule, noted here for the record.
Pieces 2 and 3 of the #77-audit cover-vocabulary issue. Piece 1 (Sweden's
wetland) is #14 and deliberately untouched; the issue stays open until it
lands.

Piece 2 — Poland's missing wetland. The R6 catalogue check is done and the
answer is negative, with the citation: GUGiK's published BDOT10k delivery
(opendata.geoportal.gov.pl/bdot10k/schemat2021/GPKG/) has no marsh/bog class
anywhere — two county packages inspected end to end (1401 mazowieckie and
2004 grajewski, the Biebrza county) carry nothing wetland-shaped, and the
twelve pokrycie-terenu classes' rodzaj domains are exhaustive country-wide
with no bog value (PTGN holds only sandy/gravel, unused, stony, scree; all
counts in docs/country-poland.md). All twelve PT classes are already fetched
(the pt-sw-sk-oikm marker names the set, R9), so there is nothing to widen
the fetch list with. Poland's z3 cover has no wetland by source truth, not
by fetch gap; the exemption is written in docs/country-poland.md and next to
the rollups in conf/common.yaml. Measured: the Biebrza valley's marsh ground
is surveyed as grass — 2 974 km² of `pasture` over the valley bbox in the
z13 table, the same hiding place Sweden's mires have inside 2640.

Piece 3 — the natural_grassland / pasture / moor boundary. R44's check is
done: the four countries' source conditions sit side by side next to the
landcover enum in conf/common.yaml, and the decision is recorded there — the
boundary is drawn at the CORINE definitions (231 agricultural grass, 321
semi-natural grass, 322 closed shrub), every country that can distinguish
the concepts does, and the coarse catch-alls (SE 2640 → 321, PL PTTR → 231)
are granularity artifacts of the sources, mapped to the aggregate-dominant
class per R137 with the judgement written next to each query. No mapping
changes.

Also recorded: the z3 written exemptions R22 asks for. Finland's z3 is the
full level-1 vocabulary; Iceland's loses artificial at z4 and agricultural
at z3 to the 16 px² absorption floor (whole-class totals 791 km² / 4 727 km²
under the 1 532 / 6 128 km² floors — measured); Poland and Sweden have no
wetland at any zoom (source truth; Sweden's fix is #14).

Verified: importer TestRealConfigsValidate over all configs, make build,
mapsrv go test, and the z3/z13 cover queries quoted above against the live
DB.
art-bot force-pushed issue-83-cover-vocabulary from ec597ff279 to b63fd489c1 2026-08-13 04:43:57 +00:00 Compare
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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
art/ismap!100
No description provided.