UPG-100: an ADM1 territory always knows its country (the baked table split into India's 34 and China's 12, same data), so the regroup warning is right even for a territory whose feature did not say; gated

This commit is contained in:
Doxa Maps 2026-09-30 22:35:31 +00:00
parent 05794c3aa7
commit c8d6d2cb48
2 changed files with 16 additions and 4 deletions

View file

@ -103,6 +103,12 @@ for (const [name, sel] of Object.entries(REGROUP_CASES)) {
const tool = dry(X.selectionClipboard(sel, {})) === 'ok'
if (X.regroupable(sel) !== tool) disagree.push(`${name}: regroupable ${X.regroupable(sel)}, apply-grouping ${tool ? 'accepts' : 'refuses'}`)
}
// …and the COUNTRY an ADM1 territory needs for that verdict is always known: from the feature's own props on a
// map tap, else from the baked table (a props-only toggle once left it null, which read as a false warning).
const { resolveTerritory, ADM1_COUNTS, ADM1_COUNTRY } = await import(pathToFileURL(P('plugin-designs/my-upg-100-list/data/territory-counts.js')).href)
const noCountry = Object.keys(ADM1_COUNTS).filter((n) => !['IND', 'CHN'].includes(ADM1_COUNTRY[n]))
ok(!noCountry.length && resolveTerritory({ shapeName: 'Mahārāshtra' }).country === 'IND' && resolveTerritory({ shapeName: 'Guizhou Province' }).country === 'CHN',
`an ADM1 territory without a known country: ${noCountry.slice(0, 5).join(', ') || 'a props-only toggle'}`, 'every ADM1 name resolves its country, even from a props-only toggle')
ok(!disagree.length, `Copy's regroup warning disagrees with apply-grouping: ${disagree.join('; ')}`,
`the regroup warning matches apply-grouping's own verdict in all ${Object.keys(REGROUP_CASES).length} cases (India, China, countries, and the three it refuses)`)

View file

@ -26,8 +26,8 @@
// ── (1) ADM1 territory counts (India states + China provinces) ───────────────
// Verbatim from data/admin-counts.json (IND 34 + CHN 12 = 46), keyed by the
// EXACT shapeName the gb-IND-ADM1 / gb-CHN-ADM1 features carry.
export const ADM1_COUNTS = {
// IND (34)
// India's 34 and China's 12, kept apart so each name's COUNTRY is known too (ADM1_COUNTRY below).
const ADM1_COUNTS_IND = {
'Andaman and Nicobar Islands': 9,
'Andhra Pradesh': 81,
'Arunāchal Pradesh': 7,
@ -62,7 +62,8 @@ export const ADM1_COUNTS = {
'Uttar Pradesh': 23,
'Uttarākhand': 7,
'West Bengal': 30,
// CHN (12)
};
const ADM1_COUNTS_CHN = {
'Gansu Province': 3,
'Guangxi Zhuang Autonomous Region': 6,
'Guizhou Province': 34,
@ -76,6 +77,11 @@ export const ADM1_COUNTS = {
'Xinjiang Uyghur Autonomous Region': 7,
'Yunnan Province': 61,
};
export const ADM1_COUNTS = { ...ADM1_COUNTS_IND, ...ADM1_COUNTS_CHN };
// name → 'IND' | 'CHN': the fallback when a feature does not carry shapeGroup / iso3 (a gate's props-only toggle).
export const ADM1_COUNTRY = Object.fromEntries([
...Object.keys(ADM1_COUNTS_IND).map((n) => [n, 'IND']), ...Object.keys(ADM1_COUNTS_CHN).map((n) => [n, 'CHN']),
]);
// ── (2) ADM0 per-country counts (iso3 → # records in admin-membership.json) ──
// Covers ALL 161 ADM0 countries rendered in world-adm0.geojson; every one has a
@ -159,7 +165,7 @@ export function resolveTerritory(props, opts = {}) {
const count = Object.prototype.hasOwnProperty.call(ADM1_COUNTS, name)
? ADM1_COUNTS[name] : null;
// country: which ADM1 set it belongs to (IND / CHN), because data/apply-grouping.mjs regroups one kind at a time.
return { key: 'adm1:' + name, name, count, kind: 'adm1', country: props.shapeGroup || props.iso3 || null };
return { key: 'adm1:' + name, name, count, kind: 'adm1', country: props.shapeGroup || props.iso3 || ADM1_COUNTRY[name] || null };
}
// (2) ADM0 — country (only iso3 on the feature)