Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Boundaries

From Landrace.Wiki - The Landrace Cannabis Wiki

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:

  1. Explicit positional argument: {{#invoke:Boundaries|get|Some Name}}
  2. Parent template's boundary_key parameter, when invoked from inside a template that exposes one
  3. {{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,lng per 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:

  1. Edit boundaries_config.json to add or modify entries.
  2. For editorial polygons, paste the polygon string directly into the local Module_Boundaries.lua. The script preserves editorial polygons from its input.
  3. Run python derive_boundaries.py --module Module_Boundaries.lua --config boundaries_config.json --out Module_Boundaries.lua.new --verbose.
  4. Inspect the verbose summary table for sane vertex counts and area_km2.
  5. Paste Module_Boundaries.lua.new into this module on-wiki.
  6. Null-edit affected pages so SMW reindexes the new boundary.

Used by

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


-- 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,
  },
["Rasol (appellation)"] = {
  polygon  = "32.038932,77.274172;32.038459,77.273823;32.037246,77.273563;32.034680,77.273041;32.034476,77.276987;32.034414,77.279513;32.033857,77.281611;32.033085,77.282480;32.032427,77.284661;32.029920,77.286386;32.029168,77.287742;32.029847,77.289159;32.029617,77.291808;32.029116,77.293139;32.029095,77.294544;32.026765,77.299510;32.025543,77.300520;32.026264,77.302097;32.028729,77.301506;32.029774,77.303613;32.032511,77.304340;32.034130,77.303169;32.035621,77.301680;32.037509,77.299926;32.038927,77.298218;32.040443,77.297849;32.041324,77.297064;32.042918,77.296891;32.044767,77.296891;32.048119,77.294703;32.046855,77.292024;32.045729,77.287593;32.044153,77.283833;32.043723,77.278949",
  style    = "editorial",
  source   = "Freehand, geojson.io",
  vertices = 34,
  area_km2 = 3.85,
},

["Vairam (appellation)"] = {
  polygon  = "32.038959,77.298196;32.037525,77.299910;32.035704,77.301618;32.034135,77.303177;32.032540,77.304342;32.030917,77.306939;32.026093,77.309528;32.028592,77.309784;32.029715,77.310655;32.031040,77.308947;32.033249,77.308913;32.033923,77.310023;32.035060,77.310399;32.035734,77.309485;32.036639,77.305401;32.037775,77.304853;32.037948,77.303599;32.038534,77.303409;32.038919,77.302494;32.041246,77.302358;32.041608,77.301762;32.041205,77.300684;32.040470,77.297838;32.039608,77.298075;32.039378,77.298122",
  style    = "editorial",
  source   = "Freehand, geojson.io",
  vertices = 25,
  area_km2 = 0.63,
},
}

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