Slovakia pilot: ZBGIS mask + SAŽP CORINE cover (no provider, no credential) #216

Open
opened 2026-08-24 17:04:40 +00:00 by art-bot · 0 comments
Collaborator

Gated on #213 (the catalogue). Mask plus cover for Slovakia.

Slovakia's pilot is unblocked even though the rest of the country is not

The catalogue found ZBGIS's attribute layers behind a /query endpoint that is currently
load-shedding (HTTP 503). Neither pilot layer touches it:

  • Mask: https://zbgisws.skgeodesy.sk/zbgis_administrativne_hranice_wfs/service.svc/get
    → feature type sr, exactly one polygon, the Slovak Republic. Anonymous, verified
    live. (obec = 2 927, okres, kraj are in the same service for later.)
  • Cover: https://geos.sazp.sk/geoserver/corine/clc2018/wfs → corine:clc2018,
    22 775 polygons, CC BY 4.0, anonymous, with code_18 — the same column name
    Greece's CORINE delivery uses. So conf/sk/02-cover.yaml is the Greece/Finland identity
    CASE almost verbatim, and Slovakia needs neither the clms: provider nor any
    credential
    — the national environment agency serves CORINE directly.

That makes this the cheapest pilot of the four to build, and worth landing early even
though Slovakia is the hardest country of the four to finish.

Two Slovakia-specific things to get right:

  • CRS is S-JTSK (EPSG:5514, Krovak East North). Check what the WFS actually returns
    rather than assuming EPSG:4326.
  • CLC 2000/2006/2012/2018/2024 are all published on the same GeoServer. Pin 2018 for
    consistency with Greece and Finland, and note 2024 as a future upgrade for all CORINE
    countries at once rather than a Slovak decision.

The three things the Greece pilot got wrong — do not repeat them

  • The mask is the country's own outline and it does NOT drive the world carve. Build it
    from the national boundary source and stop. conf/world.yaml carves Natural Earth with
    Natural Earth's own admin-0 polygons and reads only the country code from
    map_country_mask_0, never its geometry (R144). Do not extend the mask over water to
    "fix" grey background land at a coast — Greece burned two rounds on exactly that, and the
    cause was in conf/world.yaml and applied to every country (#184, #186).
  • Never verify the carve by intersecting background land with the mask. That check is
    tautologically true — background_land is Natural Earth minus the carve — so it passes
    for any mask at all, including an empty one. The carve's real checks are R144/R145/R146 on
    conf/world.yaml; a country config does not need its own.
  • R34's reference is the country's LAND, not its mask (R143). Reference the land staging
    table explicitly, even when the mask happens to be the same geometry, or the check
    silently stops meaning anything the day that changes.

Deliverables

  1. conf/<cc>/ per R17: base.yaml, downloads.yaml, staging.yaml, acceptance.yaml,
    01-country_mask.yaml, 02-cover.yaml (build order is lexical), country: <cc> (R16).
  2. A Makefile import-<cc> target chaining import-world (R107) and a fetch-<cc> path
    through the importer's declared-downloads route (R10).
  3. Acceptance tests in the same commit: R119 (mask partition populated, the
    conf/fi/01-country_mask.yaml pattern), R34 (cover gapless against the land table,
    1% budget), R22 (coarse-tier vocabulary equals the level-1 rollup tier), R120 (no NULL
    cover_class), and a decoded tile (importer tiles --check).
  4. Paste the make acceptance tally in the PR — not ad-hoc SQL (AGENTS.md).

Verify against the live database before committing: partitions at every zoom, row counts,
NULLs in the columns that matter, a decoded tile.

Gated on #213 (the catalogue). Mask plus cover for Slovakia. ## Slovakia's pilot is unblocked even though the rest of the country is not The catalogue found ZBGIS's attribute layers behind a `/query` endpoint that is currently load-shedding (HTTP 503). **Neither pilot layer touches it**: - **Mask**: `https://zbgisws.skgeodesy.sk/zbgis_administrativne_hranice_wfs/service.svc/get` → feature type `sr`, **exactly one polygon**, the Slovak Republic. Anonymous, verified live. (`obec` = 2 927, `okres`, `kraj` are in the same service for later.) - **Cover**: `https://geos.sazp.sk/geoserver/corine/clc2018/wfs` → `corine:clc2018`, **22 775 polygons**, **CC BY 4.0**, anonymous, with **`code_18`** — the same column name Greece's CORINE delivery uses. So `conf/sk/02-cover.yaml` is the Greece/Finland identity `CASE` almost verbatim, and **Slovakia needs neither the `clms:` provider nor any credential** — the national environment agency serves CORINE directly. That makes this the cheapest pilot of the four to *build*, and worth landing early even though Slovakia is the hardest country of the four to finish. Two Slovakia-specific things to get right: - CRS is S-JTSK (**EPSG:5514**, Krovak East North). Check what the WFS actually returns rather than assuming EPSG:4326. - CLC 2000/2006/2012/2018/**2024** are all published on the same GeoServer. Pin **2018** for consistency with Greece and Finland, and note 2024 as a future upgrade for all CORINE countries at once rather than a Slovak decision. ## The three things the Greece pilot got wrong — do not repeat them - **The mask is the country's own outline and it does NOT drive the world carve.** Build it from the national boundary source and stop. `conf/world.yaml` carves Natural Earth with Natural Earth's *own* admin-0 polygons and reads only the `country` code from `map_country_mask_0`, never its geometry (R144). Do not extend the mask over water to "fix" grey background land at a coast — Greece burned two rounds on exactly that, and the cause was in `conf/world.yaml` and applied to every country (#184, #186). - **Never verify the carve by intersecting background land with the mask.** That check is tautologically true — `background_land` is Natural Earth *minus* the carve — so it passes for any mask at all, including an empty one. The carve's real checks are R144/R145/R146 on `conf/world.yaml`; a country config does not need its own. - **R34's reference is the country's LAND, not its mask** (R143). Reference the land staging table explicitly, even when the mask happens to be the same geometry, or the check silently stops meaning anything the day that changes. ## Deliverables 1. `conf/<cc>/` per R17: `base.yaml`, `downloads.yaml`, `staging.yaml`, `acceptance.yaml`, `01-country_mask.yaml`, `02-cover.yaml` (build order is lexical), `country: <cc>` (R16). 2. A Makefile `import-<cc>` target chaining `import-world` (R107) and a `fetch-<cc>` path through the importer's declared-downloads route (R10). 3. Acceptance tests **in the same commit**: R119 (mask partition populated, the `conf/fi/01-country_mask.yaml` pattern), R34 (cover gapless against the *land* table, 1% budget), R22 (coarse-tier vocabulary equals the level-1 rollup tier), R120 (no NULL `cover_class`), and a decoded tile (`importer tiles --check`). 4. Paste the `make acceptance` tally in the PR — not ad-hoc SQL (AGENTS.md). Verify against the live database before committing: partitions at every zoom, row counts, NULLs in the columns that matter, a decoded tile.
art-bot self-assigned this 2026-08-24 17:04:40 +00:00
Sign in to join this conversation.
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
art/ismap#216
No description provided.