{"id":1250,"date":"2026-07-10T17:07:03","date_gmt":"2026-07-10T17:07:03","guid":{"rendered":"https:\/\/geteach.com\/blog\/?p=1250"},"modified":"2026-07-10T17:07:04","modified_gmt":"2026-07-10T17:07:04","slug":"same-earth-different-boundaries-and-toponyms","status":"publish","type":"post","link":"https:\/\/geteach.com\/blog\/2026\/07\/10\/same-earth-different-boundaries-and-toponyms\/","title":{"rendered":"Same Earth: Different Boundaries and Toponyms"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1140\" height=\"641\" src=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/intro-1140x641.jpg\" alt=\"\" class=\"wp-image-1256\" srcset=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/intro-1140x641.jpg 1140w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/intro-300x169.jpg 300w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/intro-768x432.jpg 768w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/intro-1536x864.jpg 1536w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/intro-2048x1152.jpg 2048w\" sizes=\"auto, (max-width: 1140px) 100vw, 1140px\" \/><figcaption class=\"wp-element-caption\">Left Map Region: United States | Right Map Region: Russia<\/figcaption><\/figure>\n\n<p><strong>Google Maps 3D API \u2013 Boundaries:<\/strong> <a href=\"https:\/\/geteach.com\/boundaries\" target=\"_blank\">https:\/\/geteach.com\/boundaries<\/a><\/p>\n\n<p>A quick note before I get into it: this is a side project, not part of my main classroom toolkit. <a href=\"https:\/\/geteach.com\/\" target=\"_blank\">GeTeach.com<\/a> is still where I do the bulk of my actual teaching, and that&#8217;s not changing. This one&#8217;s smaller in scope, built more to explore a specific idea than to replace anything.<\/p>\n\n<p>Most border disputes are invisible on a normal map. You get one line, drawn from one point of view, and that&#8217;s presented as fact. And it&#8217;s not just lines. Names shift too: the same body of water, mountain, or sea can carry two completely different labels depending on who&#8217;s making the map. The opening flight on this page lands over the Gulf of Mexico for exactly that reason. Set the region to <code>US<\/code> and it reads &#8220;Gulf of America&#8221;; set it to almost anywhere else and it reads &#8220;Gulf of Mexico (Gulf of America).&#8221; Same water, same coordinates, two names. Google Maps encodes both of these behaviors, borders and toponyms, through the API&#8217;s <code>region<\/code> parameter, which changes what gets rendered and labeled depending on which country&#8217;s context you tell it you&#8217;re in. So I built a page with two globes side by side, each locked to a different region, moving in perfect sync, so students can pan to the exact same spot on both globes and see two different perspectives of the same place, borders, names, and all, live.<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1140\" height=\"641\" src=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/USMexico-1140x641.jpg\" alt=\"\" class=\"wp-image-1257\" srcset=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/USMexico-1140x641.jpg 1140w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/USMexico-300x169.jpg 300w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/USMexico-768x432.jpg 768w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/USMexico-1536x864.jpg 1536w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/USMexico-2048x1152.jpg 2048w\" sizes=\"auto, (max-width: 1140px) 100vw, 1140px\" \/><figcaption class=\"wp-element-caption\">Left Map Region: United States | Right Map Region: Mexico<\/figcaption><\/figure>\n\n\n<h2>Why digital maps do this<\/h2>\n<p>This isn&#8217;t a bug or an oversight. It&#8217;s deliberate, and every major map provider does some version of it, for both borders and toponyms. Companies operating in a given country are generally expected to follow that country&#8217;s legal or official position on its own territory and place names, and in several countries that&#8217;s not optional: showing a &#8220;wrong&#8221; border or a name a government hasn&#8217;t recognized can get a map product restricted, fined, or blocked outright. So rather than pick one global version of the truth, providers render borders and labels conditionally, keyed off the viewer&#8217;s country, domain, or in this case, an explicit <code>region<\/code> setting, so a map viewed from the US, Mexico, India, Pakistan, or anywhere else can show a version consistent with that country&#8217;s official stance, right down to what a body of water is called.<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1140\" height=\"641\" src=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/UkraineRussia-1140x641.jpg\" alt=\"\" class=\"wp-image-1259\" srcset=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/UkraineRussia-1140x641.jpg 1140w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/UkraineRussia-300x169.jpg 300w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/UkraineRussia-768x432.jpg 768w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/UkraineRussia-1536x864.jpg 1536w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/UkraineRussia-2048x1152.jpg 2048w\" sizes=\"auto, (max-width: 1140px) 100vw, 1140px\" \/><figcaption class=\"wp-element-caption\">Left Map Region: Ukraine | Right Map Region: Russia<\/figcaption><\/figure>\n\n\n<p>For a classroom, that&#8217;s less a technical footnote than the whole lesson. Most students assume a map is just a neutral picture of the world. Watching the same coordinates redraw their borders, or rename themselves, depending on which &#8220;region&#8221; you tell the API you&#8217;re in is a fast way to show them that maps are arguments too, made by someone, for someone.<\/p>\n<p><strong>Google Maps 3D API Documentation:<\/strong> <a href=\"https:\/\/developers.google.com\/maps\/documentation\/javascript\/reference\/3d-map\" target=\"_blank\">https:\/\/developers.google.com\/maps\/documentation\/javascript\/reference\/3d-map<\/a><\/p>\n<h2>Here&#8217;s how the pieces fit.<\/h2>\n<h3>Two independent globes, one shared camera<\/h3>\n<p>Each side of the page is its own <code>Map3DElement<\/code>, wrapped in a small <code>EarthView<\/code> class that tracks its own camera state (center, range, tilt, heading) and exposes <code>getCamera()<\/code> \/ <code>setCamera()<\/code>. Nothing unusual there. The interesting part is keeping them locked together without one map fighting the other for control:<\/p>\n<pre><code>function createFocusSync(mapA, mapB) {\n  let driver = null;\n\n  const setDriver = (map, camera, stopped = false) => {\n    if (stopped) { driver = null; return; }\n    if (!map.isProgrammatic()) driver = map;\n  };\n\n  mapA.onCameraChange(setDriver);\n  mapB.onCameraChange(setDriver);\n\n  const tick = () => {\n    if (driver && !driver.isProgrammatic()) {\n      const follower = driver === mapA ? mapB : mapA;\n      follower.setCamera(driver.getCamera());\n    }\n    requestAnimationFrame(tick);\n  };\n  tick();\n}\n<\/code><\/pre>\n<p>Whichever globe the user is actively dragging becomes the &#8220;driver&#8221; for that gesture; the other globe just follows. The <code>_isProgrammaticMove<\/code> flag on <code>EarthView<\/code> is what keeps this from turning into an infinite feedback loop. Every time I <em>set<\/em> a camera programmatically, I flag it so the resulting <code>gmp-centerchange<\/code> event doesn&#8217;t get mistaken for a new user drag and hijack the driver role.<\/p>\n<h3>The <code>region<\/code> parameter is the whole point<\/h3>\n<p>Each <code>Map3DElement<\/code> gets its own <code>region<\/code> string, and a dropdown per side lets students swap it live:<\/p>\n<pre><code>setRegion(regionCode) {\n  this.map.region = regionCode;\n}\n<\/code><\/pre>\n<p>Left globe set to <code>US<\/code>, right globe set to <code>RU<\/code>, both centered on the same coordinates. Pan over to Crimea, and the two globes will label and border it differently, even though it&#8217;s the exact same latitude and longitude on both screens. That single-line diff is a better opener for a discussion on cartographic sovereignty than any lecture slide I&#8217;ve made.<\/p>\n<h3>Boundary colors, and a cache-busting trick<\/h3>\n<p>I also wanted to swap the <em>style<\/em> of the borders, not just where they are but how visible they are, using four <code>mapId<\/code>s pre-configured with different boundary line colors. Satellite imagery isn&#8217;t one consistent background. Desert, forest, ocean, and snow all sit at different brightness and hue, so a border color that pops over one terrain can disappear over another. Having four colors on tap lets a teacher pick whichever one actually stands out against the terrain a lesson is centered on, rather than fighting a single fixed color that only works half the time. Widening the line itself would help too, since a thicker border reads better at a distance than a differently colored thin one, but Google Cloud&#8217;s map styling doesn&#8217;t currently have a line-width control for these boundaries. The awkward part: swapping <code>mapId<\/code> on a live hybrid map doesn&#8217;t always force a redraw of the vector layer. I ended up dropping into satellite mode for a single frame to flush it, then flipping back:<\/p>\n<pre><code>colorLeft.addEventListener(\"change\", () => {\n  window.leftEarth.map.mode = 'SATELLITE';\n  window.leftEarth.map.mapId = colorLeft.value;\n  requestAnimationFrame(() => {\n    window.leftEarth.map.mode = 'HYBRID';\n  });\n});\n<\/code><\/pre>\n<p>It&#8217;s a one-frame flicker, not pretty under a microscope, but at classroom viewing distance it just reads as the borders &#8220;refreshing&#8221; into a new color.<\/p>\n<h3>One dropdown, 190-some countries<\/h3>\n<p>The region and place-name behavior only works if students can actually pick a country, so both dropdowns are populated from a flat ISO 3166-1 alpha-2 lookup table at load time:<\/p>\n<pre><code>function populateSelect(selectEl) {\n  for (const [code, name] of Object.entries(regions)) {\n    const option = document.createElement(\"option\");\n    option.value = code;\n    option.textContent = name;\n    selectEl.appendChild(option);\n  }\n}\n<\/code><\/pre>\n<p>Defaults are <code>US<\/code> on the left and <code>RU<\/code> on the right, which was as good a first example of border\/toponym divergence as I could think of. But the fun part of the lesson is letting students pick their own pair and go looking for the next one.<\/p>\n<h2>What I&#8217;d explore next<\/h2>\n<p>Three pairings I keep coming back to when I test this with students:<\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1140\" height=\"641\" src=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/PakistanIndia-1140x641.jpg\" alt=\"\" class=\"wp-image-1258\" srcset=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/PakistanIndia-1140x641.jpg 1140w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/PakistanIndia-300x169.jpg 300w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/PakistanIndia-768x432.jpg 768w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/PakistanIndia-1536x864.jpg 1536w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/PakistanIndia-2048x1152.jpg 2048w\" sizes=\"auto, (max-width: 1140px) 100vw, 1140px\" \/><figcaption class=\"wp-element-caption\">Left Map Region: Pakistan | Right Map Region: India<\/figcaption><\/figure>\n<\/p>\n<p><strong>India set as the region vs. Pakistan set as the region<\/strong>, panning over Kashmir. The line of control gets drawn differently depending on which side of the page you&#8217;re looking at, and it&#8217;s a good prompt for asking students what a &#8220;border&#8221; even means when two governments won&#8217;t agree on one.<\/p>\n<hr>\n<p>\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1140\" height=\"641\" src=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaNorthKorea-1140x641.jpg\" alt=\"\" class=\"wp-image-1260\" srcset=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaNorthKorea-1140x641.jpg 1140w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaNorthKorea-300x169.jpg 300w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaNorthKorea-768x432.jpg 768w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaNorthKorea-1536x864.jpg 1536w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaNorthKorea-2048x1152.jpg 2048w\" sizes=\"auto, (max-width: 1140px) 100vw, 1140px\" \/><figcaption class=\"wp-element-caption\">Left Map Region: China | Right Map Region: North Korea<\/figcaption><\/figure>\n<\/p>\n<p><strong>China set as the region<\/strong>, panning along the North Korean border. Worth comparing against a neutral region to see which boundary treatment China&#8217;s version defaults to.<\/p>\n<hr>\n<p>\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1140\" height=\"641\" src=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaUnitedStates-1140x641.jpg\" alt=\"\" class=\"wp-image-1261\" srcset=\"https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaUnitedStates-1140x641.jpg 1140w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaUnitedStates-300x169.jpg 300w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaUnitedStates-768x432.jpg 768w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaUnitedStates-1536x864.jpg 1536w, https:\/\/geteach.com\/blog\/wp-content\/uploads\/2026\/07\/ChinaUnitedStates-2048x1152.jpg 2048w\" sizes=\"auto, (max-width: 1140px) 100vw, 1140px\" \/><figcaption class=\"wp-element-caption\">Left Map Region: China | Right Map Region: United States<\/figcaption><\/figure><\/p>\n<p><strong>China set as the region vs. a neutral region<\/strong>, centered on Taiwan. The label itself changes, not just the line around it, which makes for a sharper before\/after than most of the other examples.<\/p>\n\n<h3>Other Google Maps API 3D Examples<\/h3>\n<ul>\n<li>World Cup Stadium Map: <a href=\"https:\/\/geteach.com\/maps3d\/worldcup2026\/\" target=\"_blank\">https:\/\/geteach.com\/maps3d\/worldcup2026\/<\/a><\/li>\n<li>Planet Money Makes A T-Shirt: <a href=\"https:\/\/geteach.com\/maps3d\/tshirt\/\" target=\"_blank\">https:\/\/geteach.com\/maps3d\/tshirt\/<\/a><\/li>\n<li>Neighborhoods Worlds Apart: <a href=\"https:\/\/geteach.com\/maps3d\/divide\/\" target=\"_blank\">https:\/\/geteach.com\/maps3d\/divide\/<\/a><\/li>\n<li>US Geography Quiz: <a href=\"https:\/\/geteach.com\/maps3d\/usquiz\/\" target=\"_blank\">https:\/\/geteach.com\/maps3d\/usquiz\/<\/a><\/li>\n<li>I&#8217;m Australian Too: <a href=\"https:\/\/geteach.com\/maps3d\/australiantoo\/\" target=\"_blank\">https:\/\/geteach.com\/maps3d\/australiantoo\/<\/a><\/li>\n<\/ul>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Google Maps 3D API &ndash; Boundaries: https:\/\/geteach.com\/boundaries A quick note before I get into it: this is a side project, not part of my main classroom toolkit. GeTeach.com is still where I do the bulk of my actual teaching, and that&rsquo;s not changing. This one&rsquo;s smaller in scope, built more to explore a specific idea [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1250","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/posts\/1250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/comments?post=1250"}],"version-history":[{"count":9,"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/posts\/1250\/revisions"}],"predecessor-version":[{"id":1266,"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/posts\/1250\/revisions\/1266"}],"wp:attachment":[{"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/media?parent=1250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/categories?post=1250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geteach.com\/blog\/wp-json\/wp\/v2\/tags?post=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}