Module:Boundaries
More actions
This is a documentation subpage for Boundaries. It contains usage information, categories, and other content that is not part of the original template.
This module stores boundary polygons for geographic entities on the wiki. Growing regions, growing areas, and appellations all read their polygon from a single keyed entry here, replacing the inline boundary= parameters that previously lived on each page.
Schema
Each entry is a Lua table with five fields:
| Field | Type | Description |
|---|---|---|
polygon |
string | Vertex string in lat,lng;lat,lng format. See format below.
|
style |
string | Provenance signal: editorial, admin, or derived.
|
source |
string | Human-readable note on origin, e.g. "Freehand trace, geojson.io" or "OSM relation 18547452". |
vertices |
number | Vertex count. |
area_km2 |
number | Computed area in square kilometres. |
Functions
All functions are called via {{#invoke:Boundaries|function}}. Each looks up an entry using the lookup priority described below.
| Function | Returns |
|---|---|
get |
Polygon string. Empty if no entry. |
getStyle |
Style value (editorial, admin, or derived). Empty if no entry.
|
getSource |
Provenance string. |
getMeta |
Formatted summary: Source: X · N vertices · ~Y km². Useful on talk pages.
|
has |
"yes" if entry exists, empty otherwise.
|
listKeys |
Bulleted list of all registered keys, sorted alphabetically. |
Lookup priority
The key used to look up an entry is resolved in this order:
- Explicit positional argument:
{{#invoke:Boundaries|get|Some Name}} - Parent template's
boundary_keyparameter, when invoked from inside a template that exposes one {{PAGENAME}}as fallback
Most page-level usage works without arguments. An infobox calls {{#invoke:Boundaries|get}} and the page name resolves the lookup automatically.
Polygon string format
Polygons are stored as flat strings rather than nested tables for compatibility with SMW Text properties and direct embedding in HTML data- attributes:
lat,lngper vertex, comma-separated;separates vertices within one polygon:separates polygons in a multipolygon- No closing repeat: the rendering layer closes the ring implicitly
Single polygon:
32.07413,77.27155;32.07296,77.27128;...;32.07156,77.27403
Multipolygon (used for entities with disconnected lobes, e.g. The Dooars):
26.57477,89.14644;...;26.56641,89.15261:26.33025,88.72855;...;26.29716,88.73344
Style values
The style field signals provenance and is read by the JS renderer to apply visual styling.
| Style | Meaning |
|---|---|
editorial |
Hand-traced polygon, typically via geojson.io. Default rendering: slate-blue fill, palette-by-neighbour on the multi-polygon home map view. |
admin |
Fetched from OSM administrative relations. Solid grey, thin stroke, minimal fill. |
derived |
Computed by derive_boundaries.py as the morphological union of child entries (e.g. a growing region derived from its growing areas, or a valley derived from its appellations). Rendered identically to editorial.
|
Adding or modifying entries
Editorial entries can be edited directly in this module. Derived entries (regions, valleys) regenerate via the local derive_boundaries.py pipeline:
- Edit
boundaries_config.jsonto add or modify entries. - For editorial polygons, paste the polygon string directly into the local
Module_Boundaries.lua. The script preserves editorial polygons from its input. - Run
python derive_boundaries.py --module Module_Boundaries.lua --config boundaries_config.json --out Module_Boundaries.lua.new --verbose. - Inspect the verbose summary table for sane vertex counts and area_km2.
- Paste
Module_Boundaries.lua.newinto this module on-wiki. - Null-edit affected pages so SMW reindexes the new boundary.
Used by
{{Infobox Growing Region}}{{Infobox Growing Area}}{{Infobox Appellation}}{{Infobox Admin Subdivision}}(whenboundary_keyis set){{Home/ConservationPanel}}(indirectly, via SMWHas boundaryqueries)
Semantic properties
Each infobox that reads from this module also writes the polygon to Has boundary (type Text), enabling tier-specific queries from the home map and other contexts:+|?Has boundary|?Has area name|?Has conservation status
See also
- Property:Has boundary
- MediaWiki:Common.js
- Template:Infobox Growing Area
- Template:Infobox Appellation
-- Module:Boundaries
-- Generated by derive_boundaries.py on 2026-04-29
-- Schema: polygon, style, source, vertices, area_km2
local p = {}
local entries = {
-- REGIONS
["Southern Cambodia"] = {
polygon = "10.60211,104.74996;10.61849,104.75383;10.62590,104.75676;10.63785,104.76516;10.64930,104.76720;10.65910,104.77075;10.66975,104.77714;10.67682,104.78421;10.68398,104.79521;10.68918,104.80899;10.69306,104.83279;10.69318,104.84925;10.68888,104.86671;10.68299,104.87992;10.67673,104.88909;10.66982,104.89619;10.66153,104.90162;10.62979,104.91436;10.61266,104.92027;10.60119,104.92177;10.57784,104.92177;10.56720,104.91918;10.55934,104.91569;10.55229,104.91077;10.54630,104.90461;10.54159,104.89742;10.53676,104.88393;10.52781,104.87845;10.52099,104.87215;10.51556,104.86532;10.51154,104.85863;10.50761,104.84895;10.50583,104.84135;10.50505,104.83408;10.50600,104.82048;10.50817,104.81107;10.51109,104.80351;10.51649,104.79500;10.52628,104.78457;10.54163,104.77286;10.54932,104.76941;10.55932,104.76698;10.57357,104.75636;10.58393,104.75171;10.59293,104.74990",
style = "derived",
source = "Derived from 1 children (2026-04-29)",
vertices = 45,
area_km2 = 297.37,
},
["The Dooars"] = {
polygon = "26.57477,89.14644;26.61471,89.14020;26.64173,89.14695;26.65340,89.14731;26.66405,89.14530;26.68199,89.13741;26.69346,89.13537;26.70612,89.13711;26.71514,89.14121;26.72208,89.14829;26.72600,89.15739;26.72650,89.18834;26.72830,89.19637;26.76857,89.27282;26.77135,89.28047;26.77171,89.29036;26.76858,89.30050;26.75195,89.33537;26.74501,89.34306;26.72884,89.35347;26.71726,89.36677;26.71168,89.38350;26.71322,89.40428;26.71175,89.41510;26.70941,89.42006;26.70200,89.42808;26.68877,89.43323;26.65182,89.43747;26.62568,89.44938;26.59860,89.45507;26.58744,89.45496;26.56103,89.44769;26.55250,89.44737;26.52800,89.45267;26.51882,89.45154;26.49507,89.44451;26.48399,89.43825;26.47006,89.41842;26.46583,89.40659;26.46607,89.39635;26.47223,89.35390;26.47737,89.32995;26.48463,89.31167;26.49143,89.26415;26.49960,89.23719;26.50659,89.22541;26.54504,89.19412;26.55038,89.18795;26.55452,89.18091;26.56100,89.16147;26.56641,89.15261:26.33025,88.72855;26.35019,88.72189;26.36155,88.72217;26.38674,88.73282;26.41705,88.75579;26.42313,88.76454;26.42536,88.77495;26.42423,88.78865;26.41841,88.80361;26.41574,88.82045;26.41955,88.83708;26.42374,88.84455;26.43595,88.85645;26.46107,88.86942;26.48215,88.87647;26.49208,88.88279;26.49912,88.89030;26.50639,88.90472;26.51210,88.91185;26.52305,88.92104;26.53280,88.93220;26.54075,88.93809;26.55901,88.94574;26.56336,88.94871;26.56994,88.95689;26.57291,88.96696;26.57288,88.97224;26.56978,88.98227;26.56111,88.99722;26.55425,89.01930;26.55176,89.03033;26.55144,89.05706;26.54685,89.06621;26.53772,89.07852;26.52843,89.08479;26.50549,89.09129;26.48937,89.10063;26.46977,89.10394;26.45181,89.09824;26.42997,89.08230;26.41180,89.07800;26.39336,89.07824;26.38362,89.07405;26.36610,89.06231;26.34800,89.05898;26.33009,89.06319;26.32216,89.06794;26.30758,89.08199;26.29749,89.08668;26.28092,89.08955;26.25585,89.09016;26.24777,89.08861;26.23828,89.08440;26.22331,89.07013;26.21703,89.06111;26.21441,89.04514;26.21762,88.99084;26.21275,88.96437;26.21551,88.94876;26.22037,88.93502;26.22204,88.91836;26.21750,88.90225;26.20762,88.88397;26.20430,88.84454;26.20614,88.83138;26.21300,88.81870;26.22180,88.80781;26.24176,88.79061;26.25540,88.78337;26.26238,88.77765;26.27225,88.76266;26.27819,88.74612;26.28501,88.73870;26.29716,88.73344",
style = "derived",
source = "Derived from 4 children (2026-04-29)",
vertices = 125,
area_km2 = 1841.95,
},
-- AREAS
["Chilapata"] = {
polygon = "26.68237,89.35152;26.67731,89.32700;26.63171,89.34435;26.60262,89.34234;26.56261,89.35420;26.54693,89.34401;26.53418,89.34335;26.51083,89.32925;26.50387,89.33473;26.49860,89.35976;26.49237,89.40333;26.50198,89.41848;26.52740,89.42605;26.54115,89.41321;26.55188,89.41341;26.56618,89.41993;26.59328,89.42897;26.60193,89.42413;26.61773,89.42391;26.62994,89.41570;26.64742,89.40895;26.65869,89.40958;26.68665,89.40641;26.67539,89.37761;26.68102,89.36332",
style = "editorial",
source = "Freehand trace, geojson.io",
vertices = 25,
area_km2 = 155.32,
},
["Jaldapara"] = {
polygon = "26.72907,89.32166;26.73018,89.30296;26.72776,89.29078;26.72083,89.28680;26.69307,89.28197;26.68125,89.26853;26.67093,89.27105;26.64445,89.25697;26.63619,89.24268;26.60555,89.21892;26.54837,89.22501;26.52560,89.24415;26.51694,89.27275;26.51071,89.32934;26.53462,89.34321;26.54705,89.34426;26.56342,89.35413;26.60254,89.34254;26.63205,89.34443;26.64896,89.33810;26.66642,89.33200;26.68988,89.32169;26.71164,89.32987;26.72251,89.32565",
style = "editorial",
source = "Freehand trace, geojson.io",
vertices = 24,
area_km2 = 212.73,
},
["Khairbari-Deogaon"] = {
polygon = "26.69890,89.18216;26.69993,89.16311;26.69226,89.16195;26.67234,89.17287;26.65261,89.17450;26.63224,89.18008;26.61562,89.16683;26.60293,89.17124;26.58610,89.17055;26.57903,89.19728;26.60544,89.21889;26.63682,89.24283;26.64450,89.25723;26.67088,89.27114;26.68063,89.26881;26.69329,89.28204;26.72047,89.28667;26.72772,89.29060;26.73973,89.29871;26.74530,89.28636;26.69807,89.19912",
style = "editorial",
source = "Freehand trace, geojson.io",
vertices = 21,
area_km2 = 118.98,
},
["Kirivong"] = {
polygon = "10.55132,104.82335;10.55063,104.82699;10.54982,104.83109;10.55075,104.83708;10.55467,104.84259;10.56020,104.84329;10.56759,104.84283;10.57439,104.83860;10.58396,104.83790;10.58742,104.83121;10.59654,104.82147;10.60230,104.82006;10.60957,104.81619;10.61360,104.80809;10.60922,104.80141;10.60576,104.79683;10.60115,104.79871;10.59723,104.79448;10.59215,104.79801;10.58904,104.80833;10.57901,104.81056;10.57485,104.81385;10.56793,104.81420;10.56378,104.81185;10.56170,104.81678;10.55582,104.81830:10.63637,104.81019;10.63266,104.81188;10.63052,104.81920;10.62894,104.82965;10.62388,104.83286;10.61733,104.83286;10.61258,104.83608;10.60523,104.83303;10.60128,104.83857;10.60271,104.84669;10.59812,104.84669;10.59575,104.85023;10.59093,104.84903;10.58777,104.84718;10.58223,104.84911;10.57773,104.85675;10.58018,104.86784;10.58192,104.87050;10.58753,104.87001;10.58129,104.87661;10.58548,104.87757;10.59646,104.87283;10.60136,104.87693;10.61503,104.87178;10.62096,104.86881;10.62863,104.86583;10.62792,104.85795;10.63203,104.86117;10.63685,104.86334;10.64135,104.86165;10.64570,104.85457;10.64435,104.85112;10.64894,104.84251;10.64807,104.83793;10.64783,104.83230;10.64277,104.83190;10.64554,104.82933;10.64672,104.82499;10.64427,104.82418;10.64554,104.81936;10.64467,104.81662;10.64182,104.81212",
style = "editorial",
source = "Freehand trace, geojson.io (Bayang Kor mountain range, two cirques)",
vertices = 68,
area_km2 = 47.23,
},
["Malana Valley"] = {
polygon = "32.098451,77.295232;32.100129,77.296650;32.100464,77.298659;32.101913,77.300866;32.103076,77.303341;32.103142,77.306114;32.104749,77.308890;32.104879,77.311620;32.100992,77.317187;32.099690,77.318789;32.096741,77.318879;32.096361,77.314360;32.099267,77.310606;32.099193,77.308290;32.099128,77.308159;32.098020,77.307262;32.095751,77.307029;32.095171,77.304930;32.095319,77.302429;32.096905,77.301404;32.098077,77.299185;32.099033,77.297050;32.098813,77.296120:32.048741,77.201851;32.051989,77.202831;32.052885,77.207057;32.056990,77.211445;32.059379,77.212151;32.060277,77.217022;32.061312,77.219577;32.062278,77.223749;32.062239,77.226040;32.061251,77.228149;32.061398,77.228275;32.063647,77.228585;32.066152,77.231295;32.067471,77.237107;32.071602,77.244634;32.074723,77.246080;32.078938,77.249383;32.084064,77.250324;32.084194,77.250541;32.087789,77.251637;32.090919,77.253965;32.095033,77.255381;32.097880,77.255740;32.100515,77.255944;32.102669,77.257918;32.104891,77.258950;32.107316,77.258163;32.110741,77.259255;32.114156,77.261073;32.116576,77.263729;32.117122,77.266182;32.116847,77.268136;32.116103,77.270200;32.116607,77.274217;32.117609,77.276830;32.115140,77.277689;32.112953,77.277542;32.111540,77.278589;32.110007,77.278754;32.109851,77.278888;32.109955,77.279098;32.111589,77.279801;32.112079,77.285449;32.108705,77.286314;32.107282,77.287143;32.105236,77.288812;32.097610,77.293989;32.096928,77.292313;32.095458,77.290233;32.093722,77.289141;32.092158,77.288026;32.090376,77.286037;32.090312,77.285882;32.089121,77.284800;32.088516,77.282592;32.086666,77.280376;32.084888,77.279173;32.082301,77.276277;32.078552,77.273078;32.074263,77.271560;32.074078,77.271600;32.071640,77.273953;32.071587,77.274104;32.072451,77.276856;32.073059,77.280615;32.073168,77.283124;32.073969,77.285530;32.073871,77.289219;32.074180,77.293282;32.074340,77.297410;32.074988,77.301889;32.073679,77.306709;32.069607,77.309076;32.065570,77.310579;32.061290,77.310239;32.058524,77.303746;32.055571,77.301420;32.053902,77.292484;32.053706,77.292442;32.048090,77.294689;32.046823,77.291947;32.045663,77.287453;32.044140,77.283800;32.043660,77.278955;32.038921,77.274200;32.043363,77.270066;32.048142,77.267165;32.051645,77.266776;32.055308,77.265703;32.055417,77.265613;32.055028,77.262256;32.052898,77.261168;32.053564,77.258243;32.053186,77.254857;32.051772,77.250758;32.051673,77.250651;32.048016,77.249072;32.047214,77.245356;32.045976,77.243981;32.045823,77.243923;32.045687,77.244012;32.040630,77.252718;32.038482,77.247908;32.034871,77.242380;32.033898,77.237371;32.030959,77.231861;32.030484,77.226970;32.032593,77.221845;32.036204,77.215671;32.038152,77.213819;32.042686,77.210001;32.045811,77.206211;32.047797,77.205179",
style = "derived",
source = "Derived from 8 children (2026-04-29, 20m close + 5m simplify)",
vertices = 136,
area_km2 = 42.01,
},
["Mekliganj"] = {
polygon = "26.23403,88.87093;26.23352,88.87779;26.24226,88.87771;26.23990,88.87215;26.24526,88.87217;26.25204,88.86142;26.26405,88.86140;26.26873,88.86452;26.27273,88.86148;26.27547,88.86661;26.28132,88.86752;26.28659,88.87575;26.28877,88.89834;26.28780,88.91829;26.28112,88.92729;26.29203,88.92437;26.30026,88.91278;26.33258,88.88600;26.34358,88.86034;26.34019,88.85433;26.34634,88.84678;26.37026,88.83588;26.37874,88.82815;26.37937,88.80760;26.37580,88.79877;26.38781,88.78932;26.39267,88.78941;26.39291,88.78607;26.39792,88.78396;26.39869,88.77513;26.37609,88.75737;26.36841,88.75618;26.35521,88.74800;26.34300,88.75474;26.33779,88.75416;26.33286,88.76132;26.32126,88.75656;26.30093,88.76010;26.30322,88.78267;26.31006,88.79345;26.30629,88.80213;26.29467,88.81912;26.28853,88.81321;26.27710,88.80995;26.26868,88.81517;26.26489,88.81212;26.25653,88.81280;26.25371,88.82281;26.24905,88.82332;26.25010,88.82895;26.23978,88.82753;26.23822,88.83805;26.23232,88.83825;26.23078,88.84170;26.23530,88.85188;26.23155,88.85865:26.40964,88.92903;26.41537,88.92949;26.41948,88.92181;26.42053,88.92564;26.42437,88.92519;26.42680,88.93460;26.42771,88.92581;26.43068,88.92608;26.43075,88.93467;26.42468,88.93814;26.42493,88.94507;26.43089,88.94484;26.43389,88.95202;26.43877,88.94744;26.44186,88.94955;26.44798,88.94613;26.44845,88.95180;26.45208,88.95112;26.44817,88.96139;26.45056,88.96507;26.45183,88.95979;26.45914,88.95728;26.45766,88.96550;26.45132,88.96575;26.45013,88.97497;26.44631,88.97649;26.44939,88.97928;26.44624,88.97844;26.44655,88.98320;26.44324,88.98079;26.43890,88.98313;26.43606,88.97896;26.43287,88.97881;26.43097,88.98292;26.42528,88.98077;26.42447,88.98356;26.42002,88.98309;26.41678,88.99412;26.41288,88.99374;26.41373,88.99849;26.42052,88.99287;26.42369,88.99372;26.42077,88.99567;26.42188,89.00423;26.41280,89.00715;26.41353,89.02244;26.40827,89.02324;26.40457,89.01931;26.40781,89.02398;26.40701,89.02982;26.39554,89.03347;26.39524,89.03733;26.40037,89.03940;26.39885,89.05215;26.41132,89.04561;26.41805,89.04788;26.42077,89.03853;26.42681,89.03179;26.43034,89.03239;26.43357,89.03788;26.43987,89.03934;26.44302,89.05028;26.45617,89.05123;26.46908,89.06359;26.47030,89.06947;26.46354,89.06741;26.46358,89.07432;26.47161,89.07732;26.48121,89.07517;26.48240,89.05917;26.50418,89.06277;26.51317,89.04822;26.52580,89.04977;26.51681,89.03575;26.51825,89.02740;26.52904,89.01011;26.53544,88.98562;26.54650,88.96922;26.53871,88.96757;26.53129,88.97056;26.52481,88.96718;26.52494,88.96217;26.50586,88.95269;26.50426,88.94001;26.49733,88.94341;26.48534,88.93966;26.47536,88.94643;26.47245,88.94038;26.46551,88.93699;26.46501,88.92960;26.47068,88.92631;26.47089,88.91523;26.47684,88.90839;26.47651,88.90448;26.47140,88.90571;26.47267,88.90207;26.46789,88.89930;26.46580,88.90479;26.46942,88.91018;26.46172,88.91269;26.45991,88.91710;26.45977,88.91394;26.45259,88.91441;26.45208,88.90844;26.44053,88.90275;26.43820,88.88729;26.43289,88.88986;26.43172,88.88713;26.42639,88.88717;26.42556,88.88366;26.41646,88.88493;26.40447,88.87975;26.39936,88.86985;26.39285,88.86661;26.39404,88.85497;26.38604,88.85264;26.38443,88.84480;26.38685,88.83948;26.38066,88.83531;26.37874,88.82815;26.37026,88.83588;26.34634,88.84678;26.34019,88.85433;26.34358,88.86034;26.33258,88.88600;26.30026,88.91278;26.29203,88.92437;26.26698,88.93487;26.24206,88.95325;26.23928,88.96707;26.24463,88.97969;26.24558,88.99360;26.24278,89.01995;26.24517,89.02078;26.24415,89.02745;26.24770,89.02746;26.24667,89.03305;26.24297,89.03398;26.24238,89.03700;26.24554,89.03781;26.24105,89.04553;26.24155,89.05071;26.24587,89.04796;26.25602,89.05203;26.25728,89.05567;26.25360,89.06256;26.25687,89.06010;26.26085,89.06376;26.27128,89.06277;26.27614,89.06003;26.27710,89.05393;26.27983,89.06292;26.28565,89.05747;26.29160,89.06070;26.29426,89.05695;26.29207,89.05298;26.29613,89.05230;26.29559,89.04572;26.28970,89.04277;26.28951,89.04631;26.28423,89.04463;26.28264,89.04676;26.28874,89.04985;26.28001,89.04813;26.28012,89.04308;26.27522,89.04505;26.27663,89.03980;26.28125,89.04023;26.28260,89.03739;26.28549,89.04072;26.28258,89.02750;26.28796,89.02461;26.28938,89.02006;26.29370,89.02314;26.29766,89.02112;26.30550,89.02653;26.30930,89.02151;26.30038,89.01421;26.29551,89.02006;26.29027,89.01833;26.29206,89.01320;26.29807,89.01275;26.30476,89.00690;26.29078,88.99998;26.29122,88.99676;26.29292,88.99435;26.29949,88.99695;26.29626,88.99417;26.30020,88.99214;26.30067,88.98481;26.30884,88.98239;26.31796,88.98481;26.31309,88.99588;26.32230,88.99143;26.32056,88.99588;26.32983,89.00088;26.33463,88.98977;26.33180,88.98623;26.34108,88.98179;26.33744,88.98920;26.34997,88.98510;26.34654,88.97802;26.35072,88.97178;26.35140,88.96653;26.34835,88.96484;26.35196,88.96111;26.34800,88.95914;26.34565,88.96285;26.33570,88.96288;26.33547,88.95940;26.33001,88.95981;26.32959,88.95572;26.33168,88.95229;26.34066,88.95200;26.34358,88.95895;26.34630,88.95287;26.34313,88.95181;26.34402,88.94611;26.35438,88.95082;26.35640,88.95845;26.36511,88.95333;26.36513,88.94979;26.35559,88.94681;26.35671,88.93499;26.36458,88.92671;26.35891,88.91905;26.36585,88.92018;26.36611,88.91204;26.37219,88.91145;26.37718,88.92128;26.38019,88.90893;26.38417,88.91652;26.40035,88.91818;26.40326,88.91724;26.40283,88.91006;26.40060,88.91000;26.40867,88.90472;26.40696,88.92544",
style = "admin",
source = "OSM relations 10360854 (Haldibari) + 10360855 (Mekliganj), Douglas-Peucker 0.002°",
vertices = 294,
area_km2 = 470.51,
},
-- APPELLATIONS
["Atolang (appellation)"] = {
polygon = "32.11617,77.27033;32.11438,77.26956;32.10997,77.26803;32.10753,77.26815;32.10530,77.26927;32.10354,77.27030;32.10170,77.27036;32.10034,77.27158;32.09882,77.27199;32.09722,77.27180;32.09530,77.27212;32.09443,77.27414;32.09289,77.27513;32.09142,77.27657;32.08987,77.27843;32.08659,77.28028;32.08852,77.28259;32.08912,77.28480;32.09042,77.28598;32.09438,77.28502;32.09636,77.28480;32.09785,77.28352;32.09928,77.28352;32.10050,77.28272;32.10346,77.28032;32.10397,77.27888;32.10560,77.27721;32.10723,77.27715;32.10845,77.27849;32.10948,77.27881;32.11154,77.27859;32.11295,77.27753;32.11514,77.27769;32.11761,77.27683;32.11661,77.27424",
style = "editorial",
source = "Freehand trace, geojson.io",
vertices = 35,
area_km2 = 2.91,
},
["Bhelang Sharn (appellation)"] = {
polygon = "32.05865,77.22979;32.06121,77.22812;32.06224,77.22604;32.06228,77.22376;32.06131,77.21957;32.06028,77.21704;32.05938,77.21215;32.05700,77.21146;32.05285,77.20702;32.05199,77.20283;32.04874,77.20185;32.04781,77.20519;32.04581,77.20621;32.04270,77.20999;32.04080,77.21154;32.03815,77.21382;32.03621,77.21566;32.03259,77.22185;32.03048,77.22698;32.03096,77.23187;32.03390,77.23737;32.03487,77.24238;32.03849,77.24792;32.04063,77.25272;32.04581,77.24380;32.04723,77.24535;32.04816,77.24300;32.05037,77.23645;32.05349,77.23269;32.05827,77.23220;32.05850,77.23108",
style = "editorial",
source = "Freehand trace, geojson.io (provisional name from single field pin)",
vertices = 31,
area_km2 = 9.14,
},
["Malana (appellation)"] = {
polygon = "32.084072,77.250326;32.078936,77.249388;32.074715,77.246073;32.071609,77.244655;32.069915,77.241581;32.067459,77.237085;32.066153,77.231295;32.063647,77.228584;32.061094,77.228233;32.058536,77.229868;32.058286,77.232237;32.053461,77.232754;32.050386,77.236418;32.048233,77.242940;32.047220,77.245379;32.048015,77.249073;32.051746,77.250683;32.053193,77.254876;32.053567,77.258273;32.052897,77.261168;32.055039,77.262227;32.055459,77.265694;32.057006,77.266879;32.059416,77.264959;32.060942,77.266002;32.061203,77.267045;32.062308,77.266926;32.063935,77.267708;32.065702,77.267542;32.067831,77.269462;32.069477,77.270315;32.071771,77.270772;32.074164,77.271525;32.078535,77.273069;32.078120,77.269831;32.077450,77.267233;32.078088,77.263204;32.082140,77.255447;32.083258,77.252796",
style = "editorial",
source = "Freehand, geojson.io (refined April 2026)",
vertices = 39,
area_km2 = 9.47,
},
["Mejigh (appellation)"] = {
polygon = "32.082183,77.276218;32.084024,77.274734;32.085618,77.271983;32.087551,77.269775;32.088900,77.267422;32.089115,77.264852;32.090525,77.263693;32.091323,77.261413;32.092641,77.254571;32.090893,77.253956;32.087796,77.251639;32.084116,77.250517;32.082153,77.255621;32.078135,77.263186;32.077460,77.267277;32.078104,77.269738;32.078503,77.273032",
style = "editorial",
source = "Freehand, geojson.io (refined April 2026)",
vertices = 17,
area_km2 = 2.42,
},
["Nirang (appellation)"] = {
polygon = "32.07413,77.27155;32.07296,77.27128;32.07163,77.27074;32.06942,77.27033;32.06803,77.26956;32.06563,77.26754;32.06394,77.26772;32.06224,77.26692;32.06122,77.26702;32.06092,77.26602;32.05942,77.26500;32.05694,77.26687;32.05542,77.26567;32.05163,77.26678;32.04815,77.26716;32.04337,77.27006;32.03892,77.27420;32.04367,77.27895;32.04414,77.28380;32.04566,77.28744;32.04682,77.29194;32.04809,77.29469;32.05391,77.29236;32.05557,77.30142;32.05852,77.30373;32.06129,77.31024;32.06557,77.31058;32.06960,77.30908;32.07368,77.30671;32.07499,77.30188;32.07434,77.29742;32.07418,77.29328;32.07387,77.28921;32.07397,77.28553;32.07316,77.28310;32.07306,77.28062;32.07245,77.27685;32.07156,77.27403",
style = "editorial",
source = "Freehand trace, geojson.io (redrawn 2026-04-29)",
vertices = 38,
area_km2 = 10.88,
},
["Rengrang Chin (appellation)"] = {
polygon = "32.092689,77.254531;32.092449,77.255862;32.091390,77.261268;32.090604,77.263649;32.089168,77.264859;32.089031,77.267280;32.087596,77.269741;32.085716,77.271839;32.084178,77.274622;32.082229,77.276196;32.084895,77.279181;32.086650,77.280365;32.087897,77.279476;32.089855,77.278410;32.091424,77.276559;32.092791,77.275227;32.094363,77.274178;32.095286,77.272161;32.097166,77.271798;32.098738,77.271960;32.100276,77.271596;32.101609,77.270426;32.103557,77.270305;32.105300,77.269256;32.107487,77.268248;32.109982,77.268006;32.113296,77.269216;32.116064,77.270265;32.116850,77.268127;32.117124,77.266190;32.116577,77.263729;32.114151,77.261067;32.110734,77.259251;32.107316,77.258162;32.104924,77.258969;32.102668,77.257920;32.100515,77.255943;32.097884,77.255741;32.095013,77.255378",
style = "editorial",
source = "Freehand, geojson.io (redrawn April 2026)",
vertices = 39,
area_km2 = 4.18,
},
["Thal (appellation)"] = {
polygon = "32.09845,77.29523;32.09881,77.29611;32.09906,77.29699;32.09808,77.29918;32.09690,77.30142;32.09532,77.30242;32.09517,77.30493;32.09575,77.30703;32.09804,77.30726;32.09919,77.30821;32.09929,77.31058;32.09636,77.31436;32.09674,77.31888;32.09969,77.31879;32.10099,77.31719;32.10488,77.31162;32.10475,77.30889;32.10314,77.30613;32.10308,77.30335;32.10191,77.30086;32.10046,77.29866;32.10013,77.29665",
style = "editorial",
source = "Freehand trace, geojson.io",
vertices = 22,
area_km2 = 1.27,
},
["Waichin (appellation)"] = {
polygon = "32.09037,77.28603;32.09215,77.28802;32.09372,77.28914;32.09546,77.29023;32.09694,77.29233;32.09761,77.29399;32.10181,77.29110;32.10524,77.28881;32.10727,77.28715;32.10868,77.28632;32.11208,77.28545;32.11159,77.27980;32.10856,77.27850;32.10718,77.27720;32.10552,77.27730;32.10396,77.27893;32.10350,77.28031;32.10202,77.28139;32.10040,77.28284;32.09914,77.28353;32.09782,77.28357;32.09629,77.28487;32.09448,77.28498;32.09212,77.28552",
style = "editorial",
source = "Freehand trace, geojson.io",
vertices = 24,
area_km2 = 1.69,
},
["Grahan (appellation)"] = {
polygon = "31.974745,77.338005;31.974221,77.338870;31.973361,77.339117;31.972417,77.339785;31.971662,77.340996;31.971390,77.342578;31.969964,77.343518;31.967699,77.345446;31.970257,77.348412;31.970509,77.349574;31.971159,77.351552;31.971222,77.353332;31.972040,77.354617;31.972040,77.355977;31.972753,77.357930;31.973990,77.360699;31.975122,77.363097;31.976066,77.366879;31.980575,77.360501;31.983615,77.354593;31.982860,77.352887;31.981770,77.351849;31.980323,77.349821",
style = "editorial",
source = "Freehand, geojson.io",
vertices = 23,
area_km2 = 2.20,
},
["Pulgi (appellation)"] = {
polygon = "31.967722,77.345429;31.966281,77.347180;31.964510,77.348769;31.964193,77.351075;31.962157,77.353413;31.963479,77.360237;31.962369,77.363976;31.961232,77.367061;31.965012,77.367217;31.966930,77.360288;31.971259,77.353349;31.971167,77.351544;31.970533,77.349615;31.970256,77.348385",
style = "editorial",
source = "Freehand, geojson.io",
vertices = 14,
area_km2 = 1.16,
},
["Thunja (appellation)"] = {
polygon = "31.979365,77.331272;31.978244,77.331996;31.976054,77.334294;31.976134,77.335711;31.975093,77.336498;31.974692,77.338009;31.980247,77.349657;31.981849,77.351892;31.982837,77.352868;31.983584,77.354568;31.985400,77.353498;31.986842,77.351294;31.985721,77.348681;31.984572,77.345313;31.985480,77.343928;31.985507,77.341944;31.984813,77.339741;31.985854,77.338355;31.984305,77.336530;31.984199,77.334861;31.982837,77.334609;31.981048,77.332720",
style = "editorial",
source = "Freehand, geojson.io",
vertices = 22,
area_km2 = 1.61,
},
}
local function getKey(frame)
local args = frame.args
if args[1] and args[1] ~= "" then return args[1] end
local pframe = frame:getParent()
if pframe and pframe.args and pframe.args.boundary_key and pframe.args.boundary_key ~= "" then
return pframe.args.boundary_key
end
return mw.title.getCurrentTitle().text
end
local function getEntry(frame)
return entries[getKey(frame)]
end
function p.get(frame)
local e = getEntry(frame); return e and e.polygon or ""
end
function p.getStyle(frame)
local e = getEntry(frame); return e and e.style or ""
end
function p.getSource(frame)
local e = getEntry(frame); return e and e.source or ""
end
function p.getMeta(frame)
local e = getEntry(frame)
if not e then return "" end
return string.format("Source: %s · %d vertices · ~%.1f km²", e.source, e.vertices, e.area_km2)
end
function p.has(frame)
return getEntry(frame) and "yes" or ""
end
function p.listKeys(frame)
local keys = {}
for k in pairs(entries) do table.insert(keys, k) end
table.sort(keys)
local out = {}
for _, k in ipairs(keys) do table.insert(out, "* [[" .. k .. "]]") end
return table.concat(out, "\n")
end
return p