Norway pilot: Kartverket mask + CORINE cover (needs the geonorge: provider) #217

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

Gated on #210 (the catalogue). Mask plus cover for Norway.

What is different about Norway's pilot

  • Mask: Kartverket Administrative enheter kommuner
    (041f1e6e-bdbc-4091-b48f-8a5990f3cc5b, CC BY 4.0) dissolved, or N50's Kommune.
    N50 also carries Territorialgrense and Grunnlinje — offshore limits, which must
    be excluded
    (R14).
  • Cover: CORINE CLC 2018 via the existing clms: provider, identity mapping (R116).
    NUTS0 is NO. N50 Arealdekke is the finer national alternative and the later
    upgrade — not the pilot.
  • A geonorge: provider is the one piece of new importer code Norway needs, and it is
    a prerequisite for this pilot if the mask comes from Geonorge. See the separate provider
    issue; if it is not ready, the pilot can be built on CORINE plus an interim mask, but say
    so explicitly rather than quietly.

The scope decision this pilot must make explicitly

Svalbard and Jan Mayen. The Geonorge area codelist is mainland (15 fylke, 357 kommune,
plus landsdekkende 0000 "Hele landet"), and Svalbard place names are a separate
Norsk Polarinstitutt dataset — which argues for mainland-only. Iceland already set the
island-territory precedent. Whichever way it goes, write it into docs/country-no.md and
into the config comment, because a later reader will otherwise read the absence as a bug.

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 #210 (the catalogue). Mask plus cover for Norway. ## What is different about Norway's pilot - **Mask**: Kartverket **Administrative enheter kommuner** (`041f1e6e-bdbc-4091-b48f-8a5990f3cc5b`, CC BY 4.0) dissolved, or N50's `Kommune`. N50 also carries `Territorialgrense` and `Grunnlinje` — **offshore limits, which must be excluded** (R14). - **Cover**: CORINE CLC 2018 via the existing `clms:` provider, identity mapping (R116). NUTS0 is `NO`. N50 `Arealdekke` is the finer national alternative and the later upgrade — not the pilot. - **A `geonorge:` provider is the one piece of new importer code Norway needs**, and it is a prerequisite for this pilot if the mask comes from Geonorge. See the separate provider issue; if it is not ready, the pilot can be built on CORINE plus an interim mask, but say so explicitly rather than quietly. ## The scope decision this pilot must make explicitly **Svalbard and Jan Mayen.** The Geonorge area codelist is mainland (15 fylke, 357 kommune, plus `landsdekkende` `0000` "Hele landet"), and Svalbard place names are a separate Norsk Polarinstitutt dataset — which argues for mainland-only. Iceland already set the island-territory precedent. Whichever way it goes, write it into `docs/country-no.md` and into the config comment, because a later reader will otherwise read the absence as a bug. ## 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:41 +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#217
No description provided.