Files
superset2/superset-frontend/plugins/plugin-chart-country-map/scripts
Evan Rusackas d7edbf747a feat(country-map): build script — split Admin 1 per country
The monolithic ukr_admin1.geo.json (15MB / 4595 features) was a single
file that any chart would have to download in full just to render one
country's subdivisions. Replace with per-country files keyed by
adm0_a3, each individually simplified.

Also drops single-subdivision countries (useless as choropleths) at
this stage, mirroring the notebook's auto-purge.

Output stats from full run:
  Files: 220 total
    1 × admin0 (world) ............ 2.1 MB
    4 × regional aggregations ..... 23-32 KB each
    1 × composite (france_overseas) 322 KB
  214 × per-country admin1 ........ 17 KB - 662 KB each (GBR largest)

Per-chart payload:
  world choropleth   → ukr_admin0.geo.json                  2.1 MB
  France departments → ukr_admin1_FRA.geo.json              308 KB
  US states          → ukr_admin1_USA.geo.json              ~250 KB
  Türkiye NUTS-1     → regional_TUR_nuts_1_ukr.geo.json     23 KB
  France w/ overseas → composite_france_overseas_ukr.geo.json 322 KB

All well within usable browser payload range. The plugin will lazy-load
only what's needed for the current chart's worldview/admin-level/country.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 16:39:47 -07:00
..

Country Map data pipeline

This directory contains the build pipeline that turns upstream Natural Earth data into the GeoJSON files consumed by @superset-ui/plugin-chart-country-map.

It replaces the legacy scripts/Country Map GeoJSON Generator.ipynb notebook. See SIP_DRAFT.md in the parent directory for the full design rationale.

Layout

scripts/
  build.sh                   # one-shot reproducible build
  README.md                  # this file
  config/                    # declarative YAML — handles ~95% of fixes
    name_overrides.yaml      # typos, deprecated ISO codes, admin renames
    flying_islands.yaml      # repositioning + bbox drops for far-flung territories
    territory_assignments.yaml   # add features from sibling Admin 0 records
    regional_aggregations.yaml   # dissolve Admin 1 into administrative regions
    composite_maps.yaml      # multi-country composites (e.g. France-with-Overseas)
  procedural/                # escape hatch — handles the rare 5%
    README.md                # when to use, when not
    NN_<descriptive_name>.py # one focused script per genuine edge case
  output/                    # gitignored — build artifacts

Operating principles

  • Default tool: declarative YAML. Most touchups are renames, repositions, dissolves, or filters — all expressible in YAML. Diffs are small, conflicts localize cleanly to one entry, contributors can submit "fix typo X" as a one-line PR.
  • Escape hatch: procedural/ directory of small, named, single-purpose Python scripts for the rare cases YAML can't express cleanly. Each script has a header comment explaining why it's not in YAML. See procedural/README.md for the bar.
  • Build is reproducible from a pinned NE version. build.sh records the NE git SHA it consumed; outputs are deterministic given inputs.
  • CI regenerates on schema change and opens a PR if outputs differ. Maintainers review the cartographic diff in legible GeoJSON, not opaque notebook JSON.

Workflow for adding a fix

  1. Identify the upstream NE issue (wrong name, missing territory, etc.).
  2. Try YAML first. Add the smallest possible entry to the appropriate config file with a description field explaining the fix.
  3. If YAML can't express it cleanly, add a numbered script in procedural/ with a header comment explaining why YAML didn't fit.
  4. Run build.sh locally, verify the output GeoJSON looks right.
  5. Open PR. Reviewer sees the YAML diff (or new procedural script) plus the regenerated GeoJSON.

See also

  • SIP_DRAFT.md (parent dir) — design rationale, notebook audit, obsolescence check
  • procedural/README.md — when to use the escape hatch