class: title-slide, globe-title <div class="title-globe" aria-hidden="true"></div> <div class="title-shade" aria-hidden="true"></div> <div class="title-copy"> <div class="title-eyebrow">GEOSPATIAL EDUCATION <span>/</span> CNG 2026</div> <h1>Toward a<br><em>cloud-centric</em><br>geospatial curriculum</h1> <p class="title-deck">Diagnosing barriers and<br>charting a path forward</p> <div class="title-presenter"><strong>Matthew Haffner, PhD</strong><span>Department of Geography and Anthropology<br>University of Wisconsin – Eau Claire</span></div> </div> <div class="title-footer title-topics"><span>Vocational vs. liberal education</span><span>Skill-based vs. concept-based</span><span>Core vs. threshold concepts</span></div> --- class: inverse, questions-overview .kicker[Overview · Three questions] # What are we preparing students for? <div class="overview-questions"> <article class="card overview-question overview-purpose"> <span class="overview-number">01 / PURPOSE</span> <h2>A first job,<br>or a career?</h2> <div class="overview-spectrum" aria-hidden="true"><span></span></div> <p>Debates in higher education</p> </article> <article class="card overview-question overview-friction"> <span class="overview-number">02 / FRICTION</span> <h2>What keeps<br>us here?</h2> <div class="overview-gate" aria-hidden="true"><span></span><span></span><span></span><span></span></div> <p>Barriers to novel approaches</p> </article> <article class="card overview-question overview-possibility"> <span class="overview-number">03 / POSSIBILITY</span> <h2>What could<br>come next?</h2> <div class="overview-build" aria-hidden="true"><span></span><span></span><span></span></div> <p>Proposed curriculum</p> </article> </div> --- class: debate-cards, debate-vocational .kicker[Debates in higher education] # Vocational/skill-based -- - Curriculum strongly tied to **software programs** - Curriculum reverse-engineered from **entry-level job postings** and vendor certifications - **Legible** to students, parents, and employers -- - **The tension:** tool-specific skills depreciate and can trap students within a vendor's ecosystem. --- class: debate-cards, debate-liberal .kicker[Debates in higher education] # Liberal/concept-based -- - Educates for a **career** of lifelong learning, not a first job - Tied to concepts that are **software agnostic** - Emphasizes "transfer over tooling" -- - **The tension:** less legible to employers, and concept-based education needs to be conducted...with software! --- class:inverse,continuum .center[ # Where has geospatial education been on this continuum? ] <div class="spectrum spectrum--past"> <div class="spectrum__ends"><div class="spectrum__end"><b>Vocational</b><span>Skill-based</span></div><div class="spectrum__end spectrum__end--r"><b>Liberal</b><span>Concept-based</span></div></div> <div class="spectrum__track"><div class="spectrum__target"><span>Durable value</span></div><div class="spectrum__marker"><span>Geospatial ed.</span></div></div> </div> --- class:inverse,continuum .center[ # Why is this problematic? ] <div class="spectrum spectrum--problem"> <div class="spectrum__ends"><div class="spectrum__end"><b>Vocational</b><span>Skill-based</span></div><div class="spectrum__end spectrum__end--r"><b>Liberal</b><span>Concept-based</span></div></div> <div class="spectrum__track"><div class="spectrum__target"><span>Durable value</span></div><div class="spectrum__marker"><span>Geospatial ed.</span></div></div> </div> --- class:inverse,continuum .center[ # Where does the value in education lie in an AI-driven world? ] <div class="spectrum spectrum--ai"> <div class="spectrum__ends"><div class="spectrum__end"><b>Vocational</b><span>Skill-based</span></div><div class="spectrum__end spectrum__end--r"><b>Liberal</b><span>Concept-based</span></div></div> <div class="spectrum__track"><div class="spectrum__trail" aria-hidden="true"></div><div class="spectrum__origin" aria-hidden="true"></div><div class="spectrum__marker"><span>Geospatial ed.</span></div></div> </div> --- class:inverse,center,transition,continuum-bridge ## How do we rethink geospatial education? --- class: core-palette .pull-left-60[ .kicker[Vocational and skill-based approach] # Traditional core concepts <ol class="concept-palette"> <li class="concept-row" style="--row:0"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="m7 25 3-9L25 1l6 6-15 15-9 3Zm3-9 6 6M22 4l6 6M6 29h25"/></svg></span><span class="concept-label">Editing and digitizing</span></li> <li class="concept-row" style="--row:1"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><circle cx="17" cy="17" r="14"/><ellipse cx="17" cy="17" rx="6" ry="14"/><path d="M3 17h28M6 9h22M6 25h22"/></svg></span><span class="concept-label">Projections and coordinate systems</span></li> <li class="concept-row" style="--row:2"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><rect x="2" y="5" width="13" height="24" rx="2"/><rect x="20" y="5" width="12" height="24" rx="2"/><path d="M2 12h13M20 12h12M2 19h13M20 19h12M15 16h5m-3-3 3 3-3 3"/></svg></span><span class="concept-label">Attribute joins and table management</span></li> <li class="concept-row" style="--row:3"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="m3 7 9-4 10 4 9-4v24l-9 4-10-4-9 4V7Zm9-4v24M22 7v24"/><path d="m7 16 6-4 7 9 6-5"/></svg></span><span class="concept-label">Making a map</span></li> <li class="concept-row error-row" style="--row:4"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="m17 3 15 27H2L17 3Z"/><path d="M17 12v8M17 24v1"/></svg></span><span class="concept-label">Getting rid of the red exclamation marks</span></li> <li class="concept-row" style="--row:5"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><rect x="2" y="4" width="10" height="9" rx="2"/><rect x="22" y="21" width="10" height="9" rx="2"/><path d="M12 8h15v9m-4-4 4 4 4-4M22 26H7v-9m-4 4 4-4 4 4"/></svg></span><span class="concept-label">Geoprocessing</span></li> </ol> ] .pull-right-40[ <figure class="concept-figure"><img src="img/core-01-editing-digitizing.png" alt="Annotated ArcGIS attribute editing interface"/></figure> ] --- class: core-palette, core-palette-followup .pull-left-60[ .kicker[Vocational and skill-based approach] # Traditional core concepts <ol class="concept-palette"> <li class="concept-row highlighted" style="--row:0"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="m7 25 3-9L25 1l6 6-15 15-9 3Zm3-9 6 6M22 4l6 6M6 29h25"/></svg></span><span class="concept-label">Editing and digitizing</span></li> <li class="concept-row" style="--row:1"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><circle cx="17" cy="17" r="14"/><ellipse cx="17" cy="17" rx="6" ry="14"/><path d="M3 17h28M6 9h22M6 25h22"/></svg></span><span class="concept-label">Projections and coordinate systems</span></li> <li class="concept-row highlighted" style="--row:2"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><rect x="2" y="5" width="13" height="24" rx="2"/><rect x="20" y="5" width="12" height="24" rx="2"/><path d="M2 12h13M20 12h12M2 19h13M20 19h12M15 16h5m-3-3 3 3-3 3"/></svg></span><span class="concept-label">Attribute joins and table management</span></li> <li class="concept-row" style="--row:3"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="m3 7 9-4 10 4 9-4v24l-9 4-10-4-9 4V7Zm9-4v24M22 7v24"/><path d="m7 16 6-4 7 9 6-5"/></svg></span><span class="concept-label">Making a map</span></li> <li class="concept-row highlighted error-row" style="--row:4"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="m17 3 15 27H2L17 3Z"/><path d="M17 12v8M17 24v1"/></svg></span><span class="concept-label">Getting rid of the red exclamation marks</span></li> <li class="concept-row" style="--row:5"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><rect x="2" y="4" width="10" height="9" rx="2"/><rect x="22" y="21" width="10" height="9" rx="2"/><path d="M12 8h15v9m-4-4 4 4 4-4M22 26H7v-9m-4 4 4-4 4 4"/></svg></span><span class="concept-label">Geoprocessing</span></li> </ol> ] .pull-right-40[ <figure class="concept-figure"><img src="img/core-06-red-exclamation-marks.jpg" alt="ArcGIS contents panel with broken layer links marked by red exclamation marks"/></figure> ] --- class: threshold-palette, threshold-step-0 .pull-left-60[ .kicker[Liberal and concept-based approach] # Threshold concepts ] --- class: threshold-palette, threshold-step-1 .pull-left-60[ .kicker[Liberal and concept-based approach] # Threshold concepts <ol class="concept-palette"> <li class="concept-row concept-current"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="M9 7H3v20h6M25 7h6v20h-6M13 11l-5 6 5 6M21 11l5 6-5 6M19 7l-4 20"/></svg></span><span class="concept-label"><strong>Data collection</strong> using publicly accessible APIs</span></li> </ol> ] .pull-right-40[ ``` r library(tidycensus) library(sf) acs <- get_acs( geography = "tract", variables = c(medinc = "B19013_001"), state = "WI", county = "Eau Claire", year = 2023, geometry = TRUE ) ``` ] --- class: threshold-palette, threshold-step-2 .pull-left-60[ .kicker[Liberal and concept-based approach] # Threshold concepts <ol class="concept-palette"> <li class="concept-row"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="M9 7H3v20h6M25 7h6v20h-6M13 11l-5 6 5 6M21 11l5 6-5 6M19 7l-4 20"/></svg></span><span class="concept-label"><strong>Data collection</strong> using publicly accessible APIs</span></li> <li class="concept-row concept-current"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><circle cx="17" cy="17" r="14"/><ellipse cx="17" cy="17" rx="6" ry="14"/><path d="M3 17h28M6 9h22M6 25h22"/></svg></span><span class="concept-label"><strong>Interactive web mapping</strong> via high-level languages</span></li> </ol> ] .pull-right-40[
.small[Past 30 days of USGS earthquakes, M2.5+, via `eqr`.] ] --- class: threshold-palette, threshold-step-3 .pull-left-60[ .kicker[Liberal and concept-based approach] # Threshold concepts <ol class="concept-palette"> <li class="concept-row"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="M9 7H3v20h6M25 7h6v20h-6M13 11l-5 6 5 6M21 11l5 6-5 6M19 7l-4 20"/></svg></span><span class="concept-label"><strong>Data collection</strong> using publicly accessible APIs</span></li> <li class="concept-row"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><circle cx="17" cy="17" r="14"/><ellipse cx="17" cy="17" rx="6" ry="14"/><path d="M3 17h28M6 9h22M6 25h22"/></svg></span><span class="concept-label"><strong>Interactive web mapping</strong> via high-level languages</span></li> <li class="concept-row concept-current"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><rect x="5" y="3" width="25" height="28" rx="2"/><path d="M11 3v28M2 9h6M2 17h6M2 25h6M16 11h9M16 17h9M16 23h6"/></svg></span><span class="concept-label"><strong>Computational notebooks</strong> — automation and reproducibility</span></li> </ol> ] .pull-right-40[ .center[ <div style='max-height:560px'> <img style='max-height: inherit; max-width: 100%; height: auto; width: auto' src='img/threshold-03-notebook.png' height='560' /> </div> .small[] ] ] --- class:inverse,center,transition,continuum-bridge ## What stands in the way? --- class: barrier-split .pull-left-40[ # Barriers <article class="card barrier-card barrier-current"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="M27 10A12 12 0 1 0 29 23M27 3v8h-8M17 9v9l6 3"/></svg></span><h2>Curricular inertia</h2></article> ] .pull-right-60[ <div class="pathway tall"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 560 464" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <path d="M88,48 L88,408" stroke="var(--muted, #9AA0A6)" stroke-width="3" stroke-opacity="0.5" stroke-linecap="round" /> <g class="flow-0"> <circle cx="88" cy="48" r="9" fill="var(--background-color, #FBF8EF)" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="3" /> <text x="122" y="39" font-size="14" font-weight="700" letter-spacing="1.6" fill="var(--viz-track-2, #BC2F5C)">OFFERING 1</text> <text x="122" y="65" font-size="23" font-weight="600" fill="var(--ink, #292B2E)">Improvised from scratch</text> </g> <g class="flow-1"> <circle cx="88" cy="168" r="9" fill="var(--background-color, #FBF8EF)" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="3" /> <text x="122" y="159" font-size="14" font-weight="700" letter-spacing="1.6" fill="var(--viz-track-2, #BC2F5C)">OFFERING 2</text> <text x="122" y="185" font-size="23" font-weight="600" fill="var(--ink, #292B2E)">Patch what broke</text> </g> <g class="flow-2"> <circle cx="88" cy="288" r="9" fill="var(--background-color, #FBF8EF)" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="3" /> <text x="122" y="279" font-size="14" font-weight="700" letter-spacing="1.6" fill="var(--viz-track-2, #BC2F5C)">OFFERING 3</text> <text x="122" y="305" font-size="23" font-weight="600" fill="var(--ink, #292B2E)">Refactor tools & pacing</text> </g> <g class="flow-3"> <circle cx="88" cy="408" r="13" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.18" stroke="var(--viz-track-3, #1baf7a)" stroke-width="3" /> <circle cx="88" cy="408" r="6" fill="var(--viz-track-3, #1baf7a)" /> <text x="122" y="399" font-size="14" font-weight="700" letter-spacing="1.6" fill="var(--viz-track-3, #1baf7a)">OFFERING 4</text> <text x="122" y="425" font-size="23" font-weight="600" fill="var(--ink, #292B2E)">Finally teachable</text> </g> </svg> </div> ] --- class: barrier-split .pull-left-40[ # Barriers <article class="card barrier-card"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="M27 10A12 12 0 1 0 29 23M27 3v8h-8M17 9v9l6 3"/></svg></span><h2>Curricular inertia</h2></article> <article class="card barrier-card barrier-current"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><rect x="7" y="14" width="21" height="16" rx="3"/><path d="M11 14V9a6 6 0 0 1 12 0v5M17 20v5"/></svg></span><h2>Technological conservatism</h2></article> ] .pull-right-60[ <div class="pathway tall"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 560 606" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <g class="flow-loop"><path class="approval-track" d="M157,177.0 C92,177.0 92,40.0 157,40.0" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="3" stroke-dasharray="7 6" /><path class="approval-head approval-return" d="M151,34.0 L163,40.0 L151,46.0 Z" fill="var(--viz-track-2, #BC2F5C)" /><path class="approval-head approval-send" d="M151,171.0 L163,177.0 L151,183.0 Z" fill="var(--viz-track-1, #3FA5E3)" /></g> <g class="flow-loop"><path class="approval-track" d="M157,303.0 C46,303.0 46,62.0 157,62.0" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="3" stroke-dasharray="7 6" /><path class="approval-head approval-return" d="M151,56.0 L163,62.0 L151,68.0 Z" fill="var(--viz-track-2, #BC2F5C)" /><path class="approval-head approval-send" d="M151,297.0 L163,303.0 L151,309.0 Z" fill="var(--viz-track-1, #3FA5E3)" /></g> <text x="26" y="177.0" transform="rotate(-90 26 177.0)" text-anchor="middle" font-size="17" font-weight="600" fill="var(--viz-track-2, #BC2F5C)">revise & resubmit</text> <g class="flow-0"> <rect x="165" y="14" width="375" height="74" rx="16" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.11" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="352.5" y="47.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">Department proposes</text> <text x="352.5" y="70.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">a course / program change</text> </g> <g class="flow-1"> <path d="M352.5,88 L352.5,129" stroke="var(--muted, #6F7378)" stroke-width="2.6" fill="none" /><path d="M345.5,128 L352.5,139 L359.5,128 Z" fill="var(--muted, #6F7378)" /> <rect x="165" y="140" width="375" height="74" rx="16" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.11" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="352.5" y="173.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">Potentially impacted</text> <text x="352.5" y="196.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">departments weigh in</text> </g> <g class="flow-2"> <path d="M352.5,214 L352.5,255" stroke="var(--muted, #6F7378)" stroke-width="2.6" fill="none" /><path d="M345.5,254 L352.5,265 L359.5,254 Z" fill="var(--muted, #6F7378)" /> <rect x="165" y="266" width="375" height="74" rx="16" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.11" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="352.5" y="299.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">CAS Curriculum</text> <text x="352.5" y="322.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">Committee reviews</text> </g> <g class="flow-3"> <path d="M352.5,340 L352.5,381" stroke="var(--muted, #6F7378)" stroke-width="2.6" fill="none" /><path d="M345.5,380 L352.5,391 L359.5,380 Z" fill="var(--muted, #6F7378)" /> <rect x="165" y="392" width="375" height="74" rx="16" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.11" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="352.5" y="425.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">College of Arts &</text> <text x="352.5" y="448.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">Sciences signs off</text> </g> <g class="flow-4"> <path d="M352.5,466 L352.5,507" stroke="var(--muted, #6F7378)" stroke-width="2.6" fill="none" /><path d="M345.5,506 L352.5,517 L359.5,506 Z" fill="var(--muted, #6F7378)" /> <rect x="165" y="518" width="375" height="74" rx="16" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.11" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="352.5" y="562.0" text-anchor="middle" font-size="21" font-weight="600" fill="var(--ink, #292B2E)">Change takes effect</text> </g> </svg> </div> ] --- class: barrier-split .pull-left-40[ # Barriers <article class="card barrier-card"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="M27 10A12 12 0 1 0 29 23M27 3v8h-8M17 9v9l6 3"/></svg></span><h2>Curricular inertia</h2></article> <article class="card barrier-card"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><rect x="7" y="14" width="21" height="16" rx="3"/><path d="M11 14V9a6 6 0 0 1 12 0v5M17 20v5"/></svg></span><h2>Technological conservatism</h2></article> <article class="card barrier-card barrier-current"><span class="concept-icon" aria-hidden="true"><svg viewBox="0 0 34 34"><path d="M17 3 29 8v9c0 7-12 14-12 14S5 24 5 17V8Z"/><path d="M12 23V12h10v11M17 12v11"/></svg></span><h2>Legacy expertise protection</h2></article> ] .pull-right-60[ <div class="pathway tall"> <svg class="expertise-gate" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 560 606" role="img" aria-labelledby="gate-title gate-desc"> <title id="gate-title">What is geospatial/GIS?</title> <desc id="gate-desc">A continuous line arrives from the left. Esri, ArcGIS, ArcGIS Online, and red exclamation marks enter. GeoPandas, R, AWS, and PostgreSQL stay outside and leave to the right. PostGIS enters but is pushed back out. ArcPy is rejected, then admitted with an apology. StoryMaps enters next. SAM3 is rejected with laughing emojis. MapLibre is rejected with rolling-on-the-floor laughing emojis. Excel is admitted with You were late!!!. Terraform arrives last and the gate collapses with an error.</desc> <text x="280" y="62" text-anchor="middle" font-size="29" font-weight="600">What is geospatial/GIS?</text> <defs> <linearGradient id="expertise-edge-fade" x1="0" x2="1"> <stop offset="0" stop-color="black"/><stop offset="0.10" stop-color="white"/> <stop offset="0.90" stop-color="white"/><stop offset="1" stop-color="black"/> </linearGradient> <mask id="expertise-queue-mask" maskUnits="userSpaceOnUse" x="0" y="0" width="560" height="606"> <rect width="560" height="606" fill="url(#expertise-edge-fade)"/> </mask> </defs> <g mask="url(#expertise-queue-mask)"> <!-- A continuous queue approaches from the left; refusals leave to the right. --> <g class="token accepted esri"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">Esri</text></g> <g class="token accepted arcgis"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">ArcGIS</text></g> <g class="token blocked geopandas"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">GeoPandas</text></g> <g class="token accepted online"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">ArcGIS Online</text></g> <g class="token blocked r"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">R</text></g> <g class="token blocked aws"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">AWS</text></g> <g class="token blocked postgresql"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">PostgreSQL</text></g> <g class="token accepted errors" role="img" aria-label="Three red exclamation mark screenshots"><rect x="214" y="357" width="132" height="183"/><image x="220" y="363" width="120" height="53" href="data:image/png;base64,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"/><image x="220" y="422" width="120" height="53" href="data:image/png;base64,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"/><image x="220" y="481" width="120" height="53" href="data:image/png;base64,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"/></g> <g class="token blocked postgis"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">PostGIS</text></g> <g class="token blocked arcpy"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">ArcPy</text></g> <g class="token accepted storymaps"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">StoryMaps</text></g> <g class="token blocked sam3"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">SAM3</text></g> <g class="token blocked maplibre"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">MapLibre</text></g> <g class="token accepted excel"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">Excel</text></g> <g class="token terraform"><rect x="192" y="422" width="176" height="50"/><text x="280" y="455">Terraform</text></g> </g> <g class="gate-structure"> <!-- Fence and two hinged wrought-iron leaves. --> <g fill="none" stroke="#8C939B" stroke-width="5"> <path d="M35 284H170M35 364H170M390 284H525M390 364H525"/> <path d="M48 264V387M82 264V387M116 264V387M150 264V387M410 264V387M444 264V387M478 264V387M512 264V387"/> </g> <g fill="#6F7378"><rect x="166" y="230" width="18" height="170" rx="3"/><rect x="376" y="230" width="18" height="170" rx="3"/><circle cx="175" cy="225" r="14"/><circle cx="385" cy="225" r="14"/></g> <g fill="none" stroke="#292B2E" stroke-width="5" stroke-linejoin="round"> <g class="left-failure"><g class="leaf left"><path d="M180 265Q230 215 280 247V383H180Z" fill="#EDF0F2" fill-opacity=".6"/><path d="M205 249V383M230 238V383M255 239V383M180 343H280"/><circle cx="267" cy="311" r="4" fill="#BC2F5C" stroke="none"/></g></g> <g class="right-failure"><g class="leaf right"><path d="M380 265Q330 215 280 247V383H380Z" fill="#EDF0F2" fill-opacity=".6"/><path d="M305 239V383M330 238V383M355 249V383M280 343H380"/><circle cx="293" cy="311" r="4" fill="#BC2F5C" stroke="none"/></g></g> </g> </g> <text class="punchline" x="280" y="535" text-anchor="middle" font-size="24" font-weight="600">“wait...not that gis”</text> <text class="recognition" x="280" y="535" text-anchor="middle" font-size="24" font-weight="600">“oops, sry about that!”</text> <text class="static-summary" x="280" y="561" text-anchor="middle" font-size="17">PostGIS: sent back · ArcPy: eventually admitted</text> <defs> <symbol id="tw-rofl" viewBox="0 0 36 36"><path fill="#FFCB4C" d="M30.728 5.272c7.029 7.029 7.029 18.427 0 25.456s-18.426 7.029-25.456 0c-7.029-7.029-7.029-18.427 0-25.456s18.426-7.029 25.456 0"/><path fill="#65471B" d="M19.279 19.28c-3.494 3.494-6.219 5.404-9.645 7.714-.781.529-1.928 1.929.001 3.859 3.857 3.857 13.111 4.247 19.287-1.929 6.177-6.177 5.788-15.43 1.929-19.288-1.929-1.93-3.33-.782-3.858 0-2.308 3.423-4.219 6.149-7.714 9.644z"/><path fill="#FFF" d="M11.564 28.923s3.858-1.929 9.644-7.716c5.787-5.786 7.715-9.643 7.715-9.643s1.928 5.787-4.822 12.537c-6.75 6.751-12.537 4.822-12.537 4.822z"/><path fill="#65471B" d="M8.265 25.234c-.215.215-.525.33-.849.283-.547-.078-.927-.584-.848-1.131.025-.176.543-3.63 2.774-6.922-2.627.873-4.589 2.796-4.614 2.821-.391.389-1.024.388-1.414-.003-.39-.39-.39-1.022 0-1.412.156-.156 3.882-3.828 8.485-3.828.405 0 .769.243.924.617.155.374.069.804-.217 1.09-3.262 3.262-3.953 7.874-3.96 7.919-.031.224-.134.419-.281.566zm16.968-16.97c-.147.147-.341.25-.563.282-.047.007-4.676.715-7.921 3.96-.286.286-.716.372-1.09.217-.374-.155-.617-.519-.617-.924 0-4.604 3.672-8.329 3.828-8.485.39-.39 1.022-.39 1.412 0 .391.389.392 1.023.003 1.413-.026.026-1.949 1.987-2.822 4.614 3.292-2.231 6.745-2.749 6.921-2.774.546-.078 1.052.3 1.131.847.049.324-.066.635-.282.85z"/><path fill="#64AADD" d="M30.101 12.055c2.741.334 5.234-1.618 5.567-4.36.334-2.741-1.617-5.234-4.359-5.568-2.741-.333-10.409 2.763-10.53 3.756-.121.992 6.581 5.837 9.322 6.172zM12.157 29.999c.334 2.741-1.618 5.234-4.36 5.567-2.741.334-5.234-1.617-5.568-4.359-.334-2.742 2.763-10.41 3.756-10.531.992-.12 5.837 6.582 6.172 9.323z"/></symbol> <symbol id="tw-joy" viewBox="0 0 36 36"><path fill="#FFCC4D" d="M36 18c0 9.941-8.059 18-18 18-9.94 0-18-8.059-18-18C0 8.06 8.06 0 18 0c9.941 0 18 8.06 18 18"/><path fill="#664500" d="M28.457 17.797c-.06-.135-1.499-3.297-4.457-3.297-2.957 0-4.397 3.162-4.457 3.297-.092.207-.032.449.145.591.175.142.426.147.61.014.012-.009 1.262-.902 3.702-.902 2.426 0 3.674.881 3.702.901.088.066.194.099.298.099.11 0 .221-.037.312-.109.177-.142.238-.386.145-.594zm-12 0c-.06-.135-1.499-3.297-4.457-3.297-2.957 0-4.397 3.162-4.457 3.297-.092.207-.032.449.144.591.176.142.427.147.61.014.013-.009 1.262-.902 3.703-.902 2.426 0 3.674.881 3.702.901.088.066.194.099.298.099.11 0 .221-.037.312-.109.178-.142.237-.386.145-.594zM31 16c-.396 0-.772-.238-.929-.629-1.778-4.445-6.223-5.381-6.268-5.391-.541-.108-.893-.635-.784-1.177.108-.542.635-.891 1.177-.784.226.045 5.556 1.168 7.732 6.608.205.513-.045 1.095-.558 1.3-.12.05-.246.073-.37.073zM5 16c-.124 0-.249-.023-.371-.072-.513-.205-.762-.787-.557-1.3 2.176-5.44 7.506-6.563 7.732-6.608.543-.106 1.068.243 1.177.784.108.54-.242 1.066-.781 1.176-.185.038-4.506.98-6.271 5.391-.157.391-.533.629-.929.629zm13 6c-3.623 0-6.027-.422-9-1-.679-.131-2 0-2 2 0 4 4.595 9 11 9 6.404 0 11-5 11-9 0-2-1.321-2.132-2-2-2.973.578-5.377 1-9 1z"/><path fill="#FFF" d="M9 23s3 1 9 1 9-1 9-1-2 4-9 4-9-4-9-4z"/><path fill="#5DADEC" d="M10.847 28.229c-.68 2.677-3.4 4.295-6.077 3.615-2.676-.679-4.295-3.399-3.616-6.076.679-2.677 6.337-8.708 7.307-8.462.97.247 3.065 8.247 2.386 10.923zm14.286 0c.68 2.677 3.4 4.295 6.077 3.615 2.677-.679 4.296-3.399 3.616-6.076-.68-2.677-6.338-8.708-7.308-8.462-.968.247-3.064 8.247-2.385 10.923z"/></symbol> </defs> <g class="sam-caption"><use href="#tw-rofl" x="237" y="513" width="26" height="26"/><use href="#tw-rofl" x="267" y="513" width="26" height="26"/><use href="#tw-rofl" x="297" y="513" width="26" height="26"/></g> <text class="excel-caption" x="280" y="535" text-anchor="middle" font-size="24" font-weight="600">You were late!!!</text> <g class="maplibre-caption"><use href="#tw-joy" x="237" y="513" width="26" height="26"/><use href="#tw-joy" x="267" y="513" width="26" height="26"/><use href="#tw-joy" x="297" y="513" width="26" height="26"/></g> <g class="gate-error" transform="translate(0 -340)" role="img" aria-label="Python tracebacks cascade off the page after the gate crashes"> <defs><clipPath id="expertise-trace-clip"><rect x="0" y="493" width="560" height="480"/></clipPath></defs> <g clip-path="url(#expertise-trace-clip)"> <rect x="0" y="493" width="560" height="480" fill="var(--background-color, #fff)" fill-opacity=".97"/> <g class="trace-scroll" xml:space="preserve"> <text x="20" y="519">Traceback (most recent call last):</text> <text x="20" y="542"> File "gatekeeper.py", line 43, in admit</text> <text x="20" y="565"> decision = expertise[program][0]</text> <text x="20" y="588">IndexError: index out of bounds</text> <text x="20" y="611"></text> <text x="20" y="634">During handling of the above exception,</text> <text x="20" y="657">another exception occurred:</text> <text x="20" y="680"></text> <text x="20" y="703">Traceback (most recent call last):</text> <text x="20" y="726"> File "legacy_gis.py", line 1999, in validate</text> <text x="20" y="749"> approved = gate["Terraform"]</text> <text x="20" y="772">TypeError: 'Gate' object is not subscriptable</text> <text x="20" y="795"></text> <text x="20" y="818"> File "curriculum.py", line 404, in recover</text> <text x="20" y="841"> raise RuntimeError('unexpected competence')</text> <text x="20" y="864">RuntimeError: gatekeeper has stopped responding</text> <text x="20" y="887"></text> <text x="20" y="910">Traceback (most recent call last):</text> <text x="20" y="933"> File "gatekeeper.py", line 44, in admit</text> <text x="20" y="956"> decision = expertise[program][0]</text> <text x="20" y="979">IndexError: index out of bounds</text> <text x="20" y="1002"></text> <text x="20" y="1025">During handling of the above exception,</text> <text x="20" y="1048">another exception occurred:</text> <text x="20" y="1071"></text> <text x="20" y="1094">Traceback (most recent call last):</text> <text x="20" y="1117"> File "legacy_gis.py", line 1999, in validate</text> <text x="20" y="1140"> approved = gate["Terraform"]</text> <text x="20" y="1163">TypeError: 'Gate' object is not subscriptable</text> <text x="20" y="1186"></text> <text x="20" y="1209"> File "curriculum.py", line 404, in recover</text> <text x="20" y="1232"> raise RuntimeError('unexpected competence')</text> <text x="20" y="1255">RuntimeError: gatekeeper has stopped responding</text> <text x="20" y="1278"></text> <text x="20" y="1301">Traceback (most recent call last):</text> <text x="20" y="1324"> File "gatekeeper.py", line 45, in admit</text> <text x="20" y="1347"> decision = expertise[program][0]</text> <text x="20" y="1370">IndexError: index out of bounds</text> <text x="20" y="1393"></text> <text x="20" y="1416">During handling of the above exception,</text> <text x="20" y="1439">another exception occurred:</text> <text x="20" y="1462"></text> <text x="20" y="1485">Traceback (most recent call last):</text> <text x="20" y="1508"> File "legacy_gis.py", line 1999, in validate</text> <text x="20" y="1531"> approved = gate["Terraform"]</text> <text x="20" y="1554">TypeError: 'Gate' object is not subscriptable</text> <text x="20" y="1577"></text> <text x="20" y="1600"> File "curriculum.py", line 404, in recover</text> <text x="20" y="1623"> raise RuntimeError('unexpected competence')</text> <text x="20" y="1646">RuntimeError: gatekeeper has stopped responding</text> <text x="20" y="1669"></text> <text x="20" y="1692">Traceback (most recent call last):</text> <text x="20" y="1715"> File "gatekeeper.py", line 46, in admit</text> <text x="20" y="1738"> decision = expertise[program][0]</text> <text x="20" y="1761">IndexError: index out of bounds</text> <text x="20" y="1784"></text> <text x="20" y="1807">During handling of the above exception,</text> <text x="20" y="1830">another exception occurred:</text> <text x="20" y="1853"></text> <text x="20" y="1876">Traceback (most recent call last):</text> <text x="20" y="1899"> File "legacy_gis.py", line 1999, in validate</text> <text x="20" y="1922"> approved = gate["Terraform"]</text> <text x="20" y="1945">TypeError: 'Gate' object is not subscriptable</text> <text x="20" y="1968"></text> <text x="20" y="1991"> File "curriculum.py", line 404, in recover</text> <text x="20" y="2014"> raise RuntimeError('unexpected competence')</text> <text x="20" y="2037">RuntimeError: gatekeeper has stopped responding</text> <text x="20" y="2060"></text> <text x="20" y="2083">Traceback (most recent call last):</text> <text x="20" y="2106"> File "gatekeeper.py", line 47, in admit</text> <text x="20" y="2129"> decision = expertise[program][0]</text> <text x="20" y="2152">IndexError: index out of bounds</text> <text x="20" y="2175"></text> <text x="20" y="2198">During handling of the above exception,</text> <text x="20" y="2221">another exception occurred:</text> <text x="20" y="2244"></text> <text x="20" y="2267">Traceback (most recent call last):</text> <text x="20" y="2290"> File "legacy_gis.py", line 1999, in validate</text> <text x="20" y="2313"> approved = gate["Terraform"]</text> <text x="20" y="2336">TypeError: 'Gate' object is not subscriptable</text> <text x="20" y="2359"></text> <text x="20" y="2382"> File "curriculum.py", line 404, in recover</text> <text x="20" y="2405"> raise RuntimeError('unexpected competence')</text> <text x="20" y="2428">RuntimeError: gatekeeper has stopped responding</text> <text x="20" y="2451"></text> <text x="20" y="2474">Traceback (most recent call last):</text> <text x="20" y="2497"> File "gatekeeper.py", line 48, in admit</text> <text x="20" y="2520"> decision = expertise[program][0]</text> <text x="20" y="2543">IndexError: index out of bounds</text> <text x="20" y="2566"></text> <text x="20" y="2589">During handling of the above exception,</text> <text x="20" y="2612">another exception occurred:</text> <text x="20" y="2635"></text> <text x="20" y="2658">Traceback (most recent call last):</text> <text x="20" y="2681"> File "legacy_gis.py", line 1999, in validate</text> <text x="20" y="2704"> approved = gate["Terraform"]</text> <text x="20" y="2727">TypeError: 'Gate' object is not subscriptable</text> <text x="20" y="2750"></text> <text x="20" y="2773"> File "curriculum.py", line 404, in recover</text> <text x="20" y="2796"> raise RuntimeError('unexpected competence')</text> <text x="20" y="2819">RuntimeError: gatekeeper has stopped responding</text> <text x="20" y="2842"></text> </g> </g> </g> </svg> </div> ] --- class:inverse .center[ <div style='max-height:625px'> <img style='max-height: inherit' src='img/kono-01.png' height='100%' /> </div> .small[] ] --- class:inverse .center[ <div style='max-height:625px'> <img style='max-height: inherit' src='img/kono-01b.png' height='100%' /> </div> .small[] ] --- class:inverse .center[ <div style='max-height:625px'> <img style='max-height: inherit' src='img/kono-02.png' height='100%' /> </div> .small[] ] --- class:inverse .center[ <div style='max-height:625px'> <video class="slide-video" src="video/linnet-clip.mp4" width="833" height="625" muted playsinline preload="metadata"></video> </div> ] --- class:inverse,center,transition,continuum-bridge ## What a new curriculum might look like --- ## Geospatial core (current) .kicker[Desktop-driven · software-first · sequential] <div class="pathway"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1220 490" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <text x="190.0" y="30" text-anchor="middle" font-size="15" font-weight="600" letter-spacing="2.2" fill="var(--muted, #9AA0A6)">FOUNDATION</text> <text x="610.0" y="30" text-anchor="middle" font-size="15" font-weight="600" letter-spacing="2.2" fill="var(--muted, #9AA0A6)">INTERMEDIATE</text> <text x="1030.0" y="30" text-anchor="middle" font-size="15" font-weight="600" letter-spacing="2.2" fill="var(--muted, #9AA0A6)">ADVANCED</text> <g class="edge col-1"><path d="M350,90.0 C395.5,90.0 395.5,90.0 441,90.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M441,85.0 L450,90.0 L441,95.0 Z" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.75" /></g> <g class="edge col-1"><path d="M350,90.0 C395.5,90.0 395.5,168.0 441,168.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M441,163.0 L450,168.0 L441,173.0 Z" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.75" /></g> <g class="edge col-1"><path d="M350,90.0 C440,90.0 440,120.0 440,180.0 L440,234.0 Q440,246.0 441,246.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M441,241.0 L450,246.0 L441,251.0 Z" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.75" /></g> <g class="edge col-2"><path d="M770,90.0 C815.5,90.0 815.5,90.0 861,90.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M861,85.0 L870,90.0 L861,95.0 Z" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.75" /></g> <g class="edge col-2"><path d="M770,324.0 C815.5,324.0 815.5,324.0 861,324.0" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M861,319.0 L870,324.0 L861,329.0 Z" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.75" /></g> <g class="node col-0"> <rect class="pulse-ring" x="30" y="62" width="320" height="56" rx="28.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.5" /> <rect class="pulse-ring pulse-ring--echo" x="30" y="62" width="320" height="56" rx="28.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.5" /> <rect class="pill-fill" x="30" y="62" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.06" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.5" /> <g transform="translate(48.50,78.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M2.5 6.5 l6.5-2.5 6 2.5 6.5-2.5 v14.5 l-6.5 2.5 -6-2.5 -6.5 2.5 Z" /><path d="M9 4 V18.5" /><path d="M15 6.5 V21" /></g> <text x="190.0" y="97.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">GIS I</text> <g class="node col-0"> <rect x="30" y="140" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(48.50,156.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M2.5 8 h19 v11.5 h-19 Z" /><path d="M9 8 V5.5 a1.4 1.4 0 0 1 1.4-1.4 h3.2 A1.4 1.4 0 0 1 15 5.5 V8" /></g> <text x="190.0" y="163.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Information Systems</text> <text x="190.0" y="186.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">in Business</text> <g class="node col-1"> <rect x="450" y="62" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.06" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.5" /> <g transform="translate(468.50,78.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M2.5 6.5 l6.5-2.5 6 2.5 6.5-2.5 v14.5 l-6.5 2.5 -6-2.5 -6.5 2.5 Z" /><path d="M9 4 V18.5" /><path d="M15 6.5 V21" /></g> <text x="610.0" y="97.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">GIS II</text> <g class="node col-1"> <rect x="450" y="140" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.06" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.5" /> <g transform="translate(468.50,156.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3 21 H21" /><path d="M6.5 21 V13" /><path d="M12 21 V6.5" /><path d="M17.5 21 V10" /></g> <text x="610.0" y="163.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Quantitative Methods</text> <text x="610.0" y="186.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">in Geography</text> <g class="node col-1"> <rect x="450" y="218" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.06" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.5" /> <g transform="translate(468.50,234.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M15.8 8.2 L13.6 13.6 L8.2 15.8 L10.4 10.4 Z" /></g> <text x="610.0" y="241.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Geospatial</text> <text x="610.0" y="264.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Field Methods</text> <g class="node col-1"> <rect x="450" y="296" width="320" height="56" rx="28.0" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.06" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.5" /> <g transform="translate(468.50,312.50) scale(0.9583)" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 14 m-4.5 0 a4.5 4.5 0 1 0 9 0 a4.5 4.5 0 1 0 -9 0" /><path d="M12 14 m-1.2 0 a1.2 1.2 0 1 0 2.4 0 a1.2 1.2 0 1 0 -2.4 0" /><path d="M6.5 4.5 A11 11 0 0 1 19.5 8" /><path d="M8.5 1.8 A14 14 0 0 1 22.2 6" /></g> <text x="610.0" y="331.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Remote Sensing I</text> <g class="node col-2"> <rect x="870" y="62" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.06" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.5" /> <g transform="translate(888.50,78.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M2.5 6.5 l6.5-2.5 6 2.5 6.5-2.5 v14.5 l-6.5 2.5 -6-2.5 -6.5 2.5 Z" /><path d="M9 4 V18.5" /><path d="M15 6.5 V21" /></g> <text x="1030.0" y="97.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">GIS III</text> <g class="node col-2"> <rect x="870" y="140" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(888.50,156.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M2.5 8 h19 v11.5 h-19 Z" /><path d="M9 8 V5.5 a1.4 1.4 0 0 1 1.4-1.4 h3.2 A1.4 1.4 0 0 1 15 5.5 V8" /></g> <text x="1030.0" y="175.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Internship</text> <g class="node col-2"> <rect x="870" y="218" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(888.50,234.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M8.5 7 L3 12 L8.5 17" /><path d="M15.5 7 L21 12 L15.5 17" /><path d="M13.5 4 L10.5 20" /></g> <text x="1030.0" y="253.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Computing in Python</text> <g class="node col-2"> <rect x="870" y="296" width="320" height="56" rx="28.0" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.06" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.5" /> <g transform="translate(888.50,312.50) scale(0.9583)" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 14 m-4.5 0 a4.5 4.5 0 1 0 9 0 a4.5 4.5 0 1 0 -9 0" /><path d="M12 14 m-1.2 0 a1.2 1.2 0 1 0 2.4 0 a1.2 1.2 0 1 0 -2.4 0" /><path d="M6.5 4.5 A11 11 0 0 1 19.5 8" /><path d="M8.5 1.8 A14 14 0 0 1 22.2 6" /></g> <text x="1030.0" y="331.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Remote Sensing II</text> <g class="node col-1"> <rect x="450" y="374" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(468.50,390.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M2.5 12 H21.5" /><path d="M12 2.5 C15.5 6 15.5 18 12 21.5" /><path d="M12 2.5 C8.5 6 8.5 18 12 21.5" /></g> <text x="610.0" y="409.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Geospatial electives</text> <g class="node col-2"> <rect x="870" y="374" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(888.50,390.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M2.5 12 H21.5" /><path d="M12 2.5 C15.5 6 15.5 18 12 21.5" /><path d="M12 2.5 C8.5 6 8.5 18 12 21.5" /></g> <text x="1030.0" y="409.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Geospatial electives</text> <g class="box col-0"> <rect x="30" y="218" width="400" height="156" rx="14" fill="var(--muted, #9AA0A6)" fill-opacity="0.05" stroke="var(--border, #C9CDD2)" stroke-width="1.3" stroke-dasharray="5 4" /> <text x="48" y="241" font-size="13" font-weight="600" letter-spacing="1.4" fill="var(--muted, #9AA0A6)">GEOGRAPHY CORE (16 CR.)</text> <g transform="translate(47.50,250.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M2 19 L8.5 7 L13 14 L16 10.5 L22 19 Z" /></g> <text x="70" y="264" font-size="18" fill="var(--muted, #6F7378)">Physical Geography (4 cr.)</text> <g transform="translate(47.50,270.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M8.5 9.5 m-3 0 a3 3 0 1 0 6 0 a3 3 0 1 0 -6 0" /><path d="M17 9.5 m-2.4 0 a2.4 2.4 0 1 0 4.8 0 a2.4 2.4 0 1 0 -4.8 0" /><path d="M2.5 19.5 c0-3.6 2.7-5.4 6-5.4 s6 1.8 6 5.4" /><path d="M16 14.4 c3 0.2 5.5 1.9 5.5 5.1" /></g> <text x="70" y="284" font-size="18" fill="var(--muted, #6F7378)">Human Geography (3 cr.)</text> <g transform="translate(47.50,290.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M3.2 15.4 L15.4 3.2 l5.4 5.4 L8.6 20.8 Z" /><path d="M7.4 8.2 l2 2" /><path d="M10.6 5 l2 2" /><path d="M4.6 11.4 l2 2" /></g> <text x="70" y="304" font-size="18" fill="var(--muted, #6F7378)">Digital geospatial tools (3 cr.)</text> <g transform="translate(47.50,310.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M2.5 12 H21.5" /><path d="M12 2.5 C15.5 6 15.5 18 12 21.5" /><path d="M12 2.5 C8.5 6 8.5 18 12 21.5" /></g> <text x="70" y="324" font-size="18" fill="var(--muted, #6F7378)">Foundations of Geography (3 cr.)</text> <g transform="translate(47.50,330.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M4 3.5 h6.5 a2 2 0 0 1 1.5 1.9 v15 a1.6 1.6 0 0 0-1.5-1.3 H4 Z" /><path d="M20 3.5 h-6.5 a2 2 0 0 0-1.5 1.9 v15 a1.6 1.6 0 0 1 1.5-1.3 H20 Z" /></g> <text x="70" y="344" font-size="18" fill="var(--muted, #6F7378)">One more geography course (3 cr.)</text> </g> <g class="legend"><rect x="312.59999999999997" y="455" width="13" height="13" rx="6.5" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.18" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="332.59999999999997" y="466" font-size="16" fill="var(--muted, #6F7378)">GIS sequence</text> <rect x="470.2" y="455" width="13" height="13" rx="6.5" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.18" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2" /> <text x="490.2" y="466" font-size="16" fill="var(--muted, #6F7378)">Remote sensing</text> <rect x="646.4" y="455" width="13" height="13" rx="6.5" fill="var(--muted, #9AA0A6)" fill-opacity="0.18" stroke="var(--muted, #9AA0A6)" stroke-width="2" /> <text x="666.4" y="466" font-size="16" fill="var(--muted, #6F7378)">No track</text> <path d="M766.8,461 L781.8,461" stroke="var(--muted, #6F7378)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M780.8,456 L788.8,461 L780.8,466 Z" fill="var(--muted, #6F7378)" fill-opacity="0.75" /> <text x="795.8" y="466" font-size="16" fill="var(--muted, #6F7378)">Prerequisite</text></g> </svg> </div> --- ## Geospatial core (proposed) .kicker[Cloud-centric · code-first · reproducible] <div class="pathway"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1220 490" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <text x="190.0" y="30" text-anchor="middle" font-size="15" font-weight="600" letter-spacing="2.2" fill="var(--muted, #9AA0A6)">FOUNDATION</text> <text x="610.0" y="30" text-anchor="middle" font-size="15" font-weight="600" letter-spacing="2.2" fill="var(--muted, #9AA0A6)">INTERMEDIATE</text> <text x="1030.0" y="30" text-anchor="middle" font-size="15" font-weight="600" letter-spacing="2.2" fill="var(--muted, #9AA0A6)">ADVANCED</text> <g class="edge col-1"><path d="M350,90.0 C395.5,90.0 395.5,90.0 441,90.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M441,85.0 L450,90.0 L441,95.0 Z" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.75" /></g> <g class="edge col-1"><path d="M350,168.0 C395.5,168.0 395.5,168.0 441,168.0" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M441,163.0 L450,168.0 L441,173.0 Z" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.75" /></g> <g class="edge col-2"><path d="M770,90.0 C815.5,90.0 815.5,90.0 861,90.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M861,85.0 L870,90.0 L861,95.0 Z" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.75" /></g> <g class="edge col-2"><path d="M770,168.0 C815.5,168.0 815.5,168.0 861,168.0" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M861,163.0 L870,168.0 L861,173.0 Z" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.75" /></g> <g class="edge col-2"><path d="M770,90.0 C815.5,90.0 815.5,246.0 861,246.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M861,241.0 L870,246.0 L861,251.0 Z" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.75" /></g> <g class="edge col-2"><path d="M770,246.0 C815.5,246.0 815.5,246.0 861,246.0" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M861,241.0 L870,246.0 L861,251.0 Z" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.75" /></g> <g class="node col-0"> <rect x="30" y="62" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.06" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.5" /> <g transform="translate(48.50,78.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3 21 H21" /><path d="M6.5 21 V13" /><path d="M12 21 V6.5" /><path d="M17.5 21 V10" /></g> <text x="190.0" y="85.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Introduction to</text> <text x="190.0" y="108.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Data Science</text> <g class="node col-0"> <rect x="30" y="140" width="320" height="56" rx="28.0" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.13" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2.0" /> <g transform="translate(48.50,156.50) scale(0.9583)" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M6.8 18.5 h11 a4 4 0 0 0 0.4-8 A6 6 0 0 0 6.5 9.6 a4.5 4.5 0 0 0 0.3 8.9 Z" /></g> <text x="190.0" y="163.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Foundations of</text> <text x="190.0" y="186.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Cloud Engineering</text> <g class="node col-1"> <rect class="pulse-ring" x="450" y="62" width="320" height="56" rx="28.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.5" /> <rect class="pulse-ring pulse-ring--echo" x="450" y="62" width="320" height="56" rx="28.0" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.5" /> <rect class="pill-fill" x="450" y="62" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.13" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.0" /> <g transform="translate(468.50,78.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3 21 H21" /><path d="M6.5 21 V13" /><path d="M12 21 V6.5" /><path d="M17.5 21 V10" /></g> <text x="610.0" y="85.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Spatial Data</text> <text x="610.0" y="108.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Science I</text> <g class="node col-1"> <rect x="450" y="140" width="320" height="56" rx="28.0" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.13" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2.0" /> <g transform="translate(468.50,156.50) scale(0.9583)" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3.5 5 h17 v4 h-17 Z" /><path d="M3.5 10.5 h17 v4 h-17 Z" /><path d="M3.5 16 h17 v4 h-17 Z" /><path d="M6.5 7 h0.01" /><path d="M6.5 12.5 h0.01" /><path d="M6.5 18 h0.01" /></g> <text x="610.0" y="163.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Geospatial</text> <text x="610.0" y="186.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Infrastructure I</text> <g class="node col-1"> <rect x="450" y="218" width="320" height="56" rx="28.0" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.06" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.5" /> <g transform="translate(468.50,234.50) scale(0.9583)" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 14 m-4.5 0 a4.5 4.5 0 1 0 9 0 a4.5 4.5 0 1 0 -9 0" /><path d="M12 14 m-1.2 0 a1.2 1.2 0 1 0 2.4 0 a1.2 1.2 0 1 0 -2.4 0" /><path d="M6.5 4.5 A11 11 0 0 1 19.5 8" /><path d="M8.5 1.8 A14 14 0 0 1 22.2 6" /></g> <text x="610.0" y="241.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Remote Sensing</text> <text x="610.0" y="264.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Science</text> <g class="node col-2"> <rect x="870" y="62" width="320" height="56" rx="28.0" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.13" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2.0" /> <g transform="translate(888.50,78.50) scale(0.9583)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3 21 H21" /><path d="M6.5 21 V13" /><path d="M12 21 V6.5" /><path d="M17.5 21 V10" /></g> <text x="1030.0" y="85.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Spatial Data</text> <text x="1030.0" y="108.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Science II</text> <g class="node col-2"> <rect x="870" y="140" width="320" height="56" rx="28.0" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.13" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2.0" /> <g transform="translate(888.50,156.50) scale(0.9583)" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3.5 5 h17 v4 h-17 Z" /><path d="M3.5 10.5 h17 v4 h-17 Z" /><path d="M3.5 16 h17 v4 h-17 Z" /><path d="M6.5 7 h0.01" /><path d="M6.5 12.5 h0.01" /><path d="M6.5 18 h0.01" /></g> <text x="1030.0" y="163.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Geospatial</text> <text x="1030.0" y="186.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">Infrastructure II</text> <g class="node col-2"> <rect x="870" y="218" width="320" height="56" rx="28.0" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.13" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2.0" /> <g transform="translate(888.50,234.50) scale(0.9583)" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M4.5 8.5 h15 v11 h-15 Z" /><path d="M12 4 V8.5" /><path d="M12 4 m-1.4 0 a1.4 1.4 0 1 0 2.8 0 a1.4 1.4 0 1 0 -2.8 0" /><path d="M9 13 h0.01" /><path d="M15 13 h0.01" /><path d="M9.5 16.5 h5" /></g> <text x="1030.0" y="253.0" text-anchor="middle" font-size="22" font-weight="600" fill="var(--ink, #292B2E)">GeoAI</text> <g class="node col-1"> <rect x="450" y="374" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(468.50,390.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M2.5 8 h19 v11.5 h-19 Z" /><path d="M9 8 V5.5 a1.4 1.4 0 0 1 1.4-1.4 h3.2 A1.4 1.4 0 0 1 15 5.5 V8" /></g> <text x="610.0" y="409.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Internship</text> <g class="node col-1"> <rect x="450" y="296" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(468.50,312.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M2.5 12 H21.5" /><path d="M12 2.5 C15.5 6 15.5 18 12 21.5" /><path d="M12 2.5 C8.5 6 8.5 18 12 21.5" /></g> <text x="610.0" y="331.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Geospatial electives</text> <g class="node col-2"> <rect x="870" y="296" width="320" height="56" rx="28.0" fill="var(--muted, #9AA0A6)" fill-opacity="0.06" stroke="var(--muted, #9AA0A6)" stroke-width="1.5" /> <g transform="translate(888.50,312.50) scale(0.9583)" fill="none" stroke="var(--muted, #9AA0A6)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M2.5 12 H21.5" /><path d="M12 2.5 C15.5 6 15.5 18 12 21.5" /><path d="M12 2.5 C8.5 6 8.5 18 12 21.5" /></g> <text x="1030.0" y="331.0" text-anchor="middle" font-size="22" font-weight="500" fill="var(--muted, #6F7378)">Geospatial electives</text> <g class="box col-0"> <rect x="30" y="218" width="410" height="136" rx="14" fill="var(--muted, #9AA0A6)" fill-opacity="0.05" stroke="var(--border, #C9CDD2)" stroke-width="1.3" stroke-dasharray="5 4" /> <text x="48" y="241" font-size="13" font-weight="600" letter-spacing="1.4" fill="var(--muted, #9AA0A6)">GEOGRAPHY CORE (16 CR.)</text> <g transform="translate(47.50,250.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M2 19 L8.5 7 L13 14 L16 10.5 L22 19 Z" /></g> <text x="70" y="264" font-size="18" fill="var(--muted, #6F7378)">Physical Geography (4 cr.)</text> <g transform="translate(47.50,270.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M8.5 9.5 m-3 0 a3 3 0 1 0 6 0 a3 3 0 1 0 -6 0" /><path d="M17 9.5 m-2.4 0 a2.4 2.4 0 1 0 4.8 0 a2.4 2.4 0 1 0 -4.8 0" /><path d="M2.5 19.5 c0-3.6 2.7-5.4 6-5.4 s6 1.8 6 5.4" /><path d="M16 14.4 c3 0.2 5.5 1.9 5.5 5.1" /></g> <text x="70" y="284" font-size="18" fill="var(--muted, #6F7378)">Human Geography (3 cr.)</text> <g transform="translate(47.50,290.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M4.5 19.5 C4.5 10 11 4.5 20 4.5 c0 9-5.5 15-15.5 15 Z" /><path d="M4.5 19.5 C8 16 12 13 16.5 11" /></g> <text x="70" y="304" font-size="18" fill="var(--muted, #6F7378)">Environmental Geography (3 cr.)</text> <g transform="translate(47.50,310.50) scale(0.7083)" fill="none" stroke="var(--muted, #6F7378)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.85"><path d="M4 3.5 h6.5 a2 2 0 0 1 1.5 1.9 v15 a1.6 1.6 0 0 0-1.5-1.3 H4 Z" /><path d="M20 3.5 h-6.5 a2 2 0 0 0-1.5 1.9 v15 a1.6 1.6 0 0 1 1.5-1.3 H20 Z" /></g> <text x="70" y="324" font-size="18" fill="var(--muted, #6F7378)">Two more geography courses (6 cr.)</text> </g> <g class="legend"><rect x="132.54999999999995" y="455" width="13" height="13" rx="6.5" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.18" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="152.54999999999995" y="466" font-size="16" fill="var(--muted, #6F7378)">Data science</text> <rect x="290.15" y="455" width="13" height="13" rx="6.5" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.18" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2" /> <text x="310.15" y="466" font-size="16" fill="var(--muted, #6F7378)">Infrastructure</text> <rect x="466.35" y="455" width="13" height="13" rx="6.5" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.18" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2" /> <text x="486.35" y="466" font-size="16" fill="var(--muted, #6F7378)">Remote sensing / AI</text> <rect x="689.0500000000001" y="455" width="13" height="13" rx="6.5" fill="var(--muted, #9AA0A6)" fill-opacity="0.18" stroke="var(--muted, #9AA0A6)" stroke-width="2" /> <text x="709.0500000000001" y="466" font-size="16" fill="var(--muted, #6F7378)">No track</text> <rect x="809.45" y="454" width="30" height="15" rx="7.5" fill="var(--muted, #6F7378)" fill-opacity="0.13" stroke="var(--muted, #6F7378)" stroke-width="2" /><text x="824.45" y="465" text-anchor="middle" font-size="9.5" font-weight="700" fill="var(--ink, #292B2E)">Aa</text> <text x="846.45" y="466" font-size="16" fill="var(--muted, #6F7378)">Proposed</text> <path d="M946.85,461 L961.85,461" stroke="var(--muted, #6F7378)" stroke-width="2.2" stroke-opacity="0.75" stroke-linecap="round" /><path d="M960.85,456 L968.85,461 L960.85,466 Z" fill="var(--muted, #6F7378)" fill-opacity="0.75" /> <text x="975.85" y="466" font-size="16" fill="var(--muted, #6F7378)">Prerequisite</text></g> </svg> </div> --- class: inverse, discussion-cards # Questions - What would such a program be called? -- - What did I miss? -- - Is this even desirable? -- - Is this possible at the undergraduate level? --- class: testbed-slide, testbed-intro .kicker[My testbed] <div class="course-card"><h2><span class="course-old">GIS III</span></h2></div> --- class: testbed-slide, testbed-intro, testbed-rename .kicker[My testbed] <div class="course-card"><h2><del class="course-old">GIS III</del><span class="course-new">Geospatial Infrastructure</span></h2></div> --- class: testbed-slide, testbed-intro .kicker[My testbed] <div class="course-card"><h2><del class="course-old">GIS III</del><span class="course-new">Geospatial Infrastructure</span></h2></div> .testbed-description[Over the course of a semester students build an **automated geospatial pipeline**.] --- class: testbed-slide, testbed-pipeline .kicker[My testbed] <div class="course-card"><h2><del class="course-old">GIS III</del><span class="course-new">Geospatial Infrastructure</span></h2></div> .testbed-description[Over the course of a semester students build an **automated geospatial pipeline**.] <div class="pathway"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1220 322" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <g class="col-0"> <rect x="40" y="54" width="348" height="156" rx="20" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.10" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <g transform="translate(195.00,79.00) scale(1.5833)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 14 m-4.5 0 a4.5 4.5 0 1 0 9 0 a4.5 4.5 0 1 0 -9 0" /><path d="M12 14 m-1.2 0 a1.2 1.2 0 1 0 2.4 0 a1.2 1.2 0 1 0 -2.4 0" /><path d="M6.5 4.5 A11 11 0 0 1 19.5 8" /><path d="M8.5 1.8 A14 14 0 0 1 22.2 6" /></g> <text x="214.0" y="147" text-anchor="middle" font-size="25" font-weight="600" fill="var(--ink, #292B2E)">Ingest</text> <text x="214.0" y="176" text-anchor="middle" font-size="17" fill="var(--muted, #6F7378)">(near) real-time data</text> </g> <g class="col-1"> <path d="M388,132.0 L425,132.0" fill="none" stroke="var(--muted, #6F7378)" stroke-width="2.4" stroke-opacity="0.55" stroke-linecap="round" /><path d="M424,126.0 L435,132.0 L424,138.0 Z" fill="var(--muted, #6F7378)" fill-opacity="0.55" /> <rect x="436" y="54" width="348" height="156" rx="20" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.10" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2" /> <g transform="translate(591.00,79.00) scale(1.5833)" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3 21 H21" /><path d="M6.5 21 V13" /><path d="M12 21 V6.5" /><path d="M17.5 21 V10" /></g> <text x="610.0" y="147" text-anchor="middle" font-size="25" font-weight="600" fill="var(--ink, #292B2E)">Analyze</text> <text x="610.0" y="176" text-anchor="middle" font-size="17" fill="var(--muted, #6F7378)">spatial + statistical</text> </g> <g class="col-2"> <path d="M784,132.0 L821,132.0" fill="none" stroke="var(--muted, #6F7378)" stroke-width="2.4" stroke-opacity="0.55" stroke-linecap="round" /><path d="M820,126.0 L831,132.0 L820,138.0 Z" fill="var(--muted, #6F7378)" fill-opacity="0.55" /> <rect x="832" y="54" width="348" height="156" rx="20" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.10" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2" /> <g transform="translate(987.00,79.00) scale(1.5833)" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M2.5 12 H21.5" /><path d="M12 2.5 C15.5 6 15.5 18 12 21.5" /><path d="M12 2.5 C8.5 6 8.5 18 12 21.5" /></g> <text x="1006.0" y="147" text-anchor="middle" font-size="25" font-weight="600" fill="var(--ink, #292B2E)">Display</text> <text x="1006.0" y="176" text-anchor="middle" font-size="17" fill="var(--muted, #6F7378)">publicly facing web app</text> </g> <circle class="pipeline-packet packet-0" cx="396" cy="132" r="5" fill="var(--ink, #292B2E)" /> <circle class="pipeline-packet packet-1" cx="792" cy="132" r="5" fill="var(--ink, #292B2E)" /> </svg> </div> --- class: testbed-slide, testbed-pipeline .kicker[My testbed] <div class="course-card"><h2><del class="course-old">GIS III</del><span class="course-new">Geospatial Infrastructure</span></h2></div> .testbed-description[Over the course of a semester students build an **automated geospatial pipeline**.] <div class="pathway"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1220 322" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <g> <rect x="40" y="54" width="348" height="156" rx="20" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.10" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <g transform="translate(195.00,79.00) scale(1.5833)" fill="none" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 14 m-4.5 0 a4.5 4.5 0 1 0 9 0 a4.5 4.5 0 1 0 -9 0" /><path d="M12 14 m-1.2 0 a1.2 1.2 0 1 0 2.4 0 a1.2 1.2 0 1 0 -2.4 0" /><path d="M6.5 4.5 A11 11 0 0 1 19.5 8" /><path d="M8.5 1.8 A14 14 0 0 1 22.2 6" /></g> <text x="214.0" y="147" text-anchor="middle" font-size="25" font-weight="600" fill="var(--ink, #292B2E)">Ingest</text> <text x="214.0" y="176" text-anchor="middle" font-size="17" fill="var(--muted, #6F7378)">(near) real-time data</text> </g> <g> <path d="M388,132.0 L425,132.0" fill="none" stroke="var(--muted, #6F7378)" stroke-width="2.4" stroke-opacity="0.55" stroke-linecap="round" /><path d="M424,126.0 L435,132.0 L424,138.0 Z" fill="var(--muted, #6F7378)" fill-opacity="0.55" /> <rect x="436" y="54" width="348" height="156" rx="20" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.10" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2" /> <g transform="translate(591.00,79.00) scale(1.5833)" fill="none" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M3 21 H21" /><path d="M6.5 21 V13" /><path d="M12 21 V6.5" /><path d="M17.5 21 V10" /></g> <text x="610.0" y="147" text-anchor="middle" font-size="25" font-weight="600" fill="var(--ink, #292B2E)">Analyze</text> <text x="610.0" y="176" text-anchor="middle" font-size="17" fill="var(--muted, #6F7378)">spatial + statistical</text> </g> <g> <path d="M784,132.0 L821,132.0" fill="none" stroke="var(--muted, #6F7378)" stroke-width="2.4" stroke-opacity="0.55" stroke-linecap="round" /><path d="M820,126.0 L831,132.0 L820,138.0 Z" fill="var(--muted, #6F7378)" fill-opacity="0.55" /> <rect x="832" y="54" width="348" height="156" rx="20" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.10" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2" /> <g transform="translate(987.00,79.00) scale(1.5833)" fill="none" stroke="var(--viz-track-3, #1baf7a)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.9"><path d="M12 12 m-9.5 0 a9.5 9.5 0 1 0 19 0 a9.5 9.5 0 1 0 -19 0" /><path d="M2.5 12 H21.5" /><path d="M12 2.5 C15.5 6 15.5 18 12 21.5" /><path d="M12 2.5 C8.5 6 8.5 18 12 21.5" /></g> <text x="1006.0" y="147" text-anchor="middle" font-size="25" font-weight="600" fill="var(--ink, #292B2E)">Display</text> <text x="1006.0" y="176" text-anchor="middle" font-size="17" fill="var(--muted, #6F7378)">publicly facing web app</text> </g> <circle class="pipeline-packet packet-0" cx="396" cy="132" r="5" fill="var(--ink, #292B2E)" /> <circle class="pipeline-packet packet-1" cx="792" cy="132" r="5" fill="var(--ink, #292B2E)" /> <g class="enter-rise"> <text x="59.5" y="242" font-size="13" font-weight="600" letter-spacing="2.2" fill="var(--muted, #9AA0A6)">BUILT ON</text> <rect x="75.5" y="248.0" width="162.39999999999998" height="40" rx="20.0" fill="var(--muted, #6F7378)" fill-opacity="0.08" stroke="var(--border, #C9CDD2)" stroke-width="1.3" /><text x="156.7" y="274" text-anchor="middle" font-size="17" fill="var(--ink, #292B2E)">CI pipelines</text> <rect x="251.89999999999998" y="248.0" width="264.4" height="40" rx="20.0" fill="var(--muted, #6F7378)" fill-opacity="0.08" stroke="var(--border, #C9CDD2)" stroke-width="1.3" /><text x="384.09999999999997" y="274" text-anchor="middle" font-size="17" fill="var(--ink, #292B2E)">Modern cloud providers</text> <rect x="530.3" y="248.0" width="244.0" height="40" rx="20.0" fill="var(--muted, #6F7378)" fill-opacity="0.08" stroke="var(--border, #C9CDD2)" stroke-width="1.3" /><text x="652.3" y="274" text-anchor="middle" font-size="17" fill="var(--ink, #292B2E)">High level languages</text> <rect x="788.3" y="248.0" width="356.2" height="40" rx="20.0" fill="var(--muted, #6F7378)" fill-opacity="0.08" stroke="var(--border, #C9CDD2)" stroke-width="1.3" /><text x="966.4" y="274" text-anchor="middle" font-size="17" fill="var(--ink, #292B2E)">Cloud native geospatial formats</text> </g> </svg> </div> --- ## Geospatial infrastructure <div class="pathway"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1220 516" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <g class="enter-rise"> <rect x="18" y="72" width="376" height="388" rx="20" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.09" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="44" y="118" font-size="29" font-weight="700" letter-spacing="1.5" fill="var(--viz-track-1, #3FA5E3)">TIER 1</text> <circle cx="44" cy="153" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="160" font-size="24" fill="var(--ink, #292B2E)">AWS S3 / EC2</text> <circle cx="44" cy="197" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="204" font-size="24" fill="var(--ink, #292B2E)">GitLab CI</text> <circle cx="44" cy="241" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="248" font-size="24" fill="var(--ink, #292B2E)">GeoParquet</text> <circle cx="44" cy="285" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="292" font-size="24" fill="var(--ink, #292B2E)">Cloud Optimized GeoTIFF</text> <circle cx="44" cy="329" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="336" font-size="24" fill="var(--ink, #292B2E)">GNU/Linux</text> <circle cx="44" cy="373" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="380" font-size="24" fill="var(--ink, #292B2E)">DuckDB (spatial)</text> <circle cx="44" cy="417" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="424" font-size="24" fill="var(--ink, #292B2E)">pytest</text> </g> <path d="M18 484 L1202 484" stroke="var(--border, #C9CDD2)" stroke-width="1.6" /><path d="M1194 478 L1204 484 L1194 490 Z" fill="var(--border, #C9CDD2)" /> </svg> </div> --- ## Geospatial infrastructure <div class="pathway"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1220 516" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <g> <rect x="18" y="72" width="376" height="388" rx="20" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.09" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="44" y="118" font-size="29" font-weight="700" letter-spacing="1.5" fill="var(--viz-track-1, #3FA5E3)">TIER 1</text> <circle cx="44" cy="153" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="160" font-size="24" fill="var(--ink, #292B2E)">AWS S3 / EC2</text> <circle cx="44" cy="197" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="204" font-size="24" fill="var(--ink, #292B2E)">GitLab CI</text> <circle cx="44" cy="241" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="248" font-size="24" fill="var(--ink, #292B2E)">GeoParquet</text> <circle cx="44" cy="285" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="292" font-size="24" fill="var(--ink, #292B2E)">Cloud Optimized GeoTIFF</text> <circle cx="44" cy="329" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="336" font-size="24" fill="var(--ink, #292B2E)">GNU/Linux</text> <circle cx="44" cy="373" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="380" font-size="24" fill="var(--ink, #292B2E)">DuckDB (spatial)</text> <circle cx="44" cy="417" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="424" font-size="24" fill="var(--ink, #292B2E)">pytest</text> </g> <g class="enter-rise"> <rect x="422" y="24" width="376" height="436" rx="20" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.09" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2" /> <text x="448" y="70" font-size="29" font-weight="700" letter-spacing="1.5" fill="var(--viz-track-2, #BC2F5C)">TIER 2</text> <circle cx="448" cy="105" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="112" font-size="24" fill="var(--ink, #292B2E)">AWS S3 / EC2 / RDS</text> <circle cx="448" cy="149" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="156" font-size="24" fill="var(--ink, #292B2E)">GitLab CI</text> <circle cx="448" cy="193" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="200" font-size="24" fill="var(--ink, #292B2E)">Terraform ?</text> <circle cx="448" cy="237" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="244" font-size="24" fill="var(--ink, #292B2E)">PostgreSQL / PostGIS</text> <circle cx="448" cy="281" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="288" font-size="24" fill="var(--ink, #292B2E)">GNU/Linux / Docker</text> <circle cx="448" cy="325" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="332" font-size="24" fill="var(--ink, #292B2E)">Great Expectations ?</text> <circle cx="448" cy="369" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="376" font-size="24" fill="var(--ink, #292B2E)">TiTiler</text> <circle cx="448" cy="413" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="420" font-size="24" fill="var(--ink, #292B2E)">CloudWatch</text> </g> <path d="M18 484 L1202 484" stroke="var(--border, #C9CDD2)" stroke-width="1.6" /><path d="M1194 478 L1204 484 L1194 490 Z" fill="var(--border, #C9CDD2)" /> <text x="18" y="508" font-size="15" font-weight="600" letter-spacing="1.6" fill="var(--muted, #9AA0A6)">INCREASING AUTONOMY, SCALE, AND COST OVER THE SEMESTER</text> </svg> </div> --- ## Geospatial infrastructure <div class="pathway"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1220 516" font-family="Montserrat, -apple-system, Helvetica, Arial, sans-serif"> <g> <rect x="18" y="72" width="376" height="388" rx="20" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.09" stroke="var(--viz-track-1, #3FA5E3)" stroke-width="2" /> <text x="44" y="118" font-size="29" font-weight="700" letter-spacing="1.5" fill="var(--viz-track-1, #3FA5E3)">TIER 1</text> <circle cx="44" cy="153" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="160" font-size="24" fill="var(--ink, #292B2E)">AWS S3 / EC2</text> <circle cx="44" cy="197" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="204" font-size="24" fill="var(--ink, #292B2E)">GitLab CI</text> <circle cx="44" cy="241" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="248" font-size="24" fill="var(--ink, #292B2E)">GeoParquet</text> <circle cx="44" cy="285" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="292" font-size="24" fill="var(--ink, #292B2E)">Cloud Optimized GeoTIFF</text> <circle cx="44" cy="329" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="336" font-size="24" fill="var(--ink, #292B2E)">GNU/Linux</text> <circle cx="44" cy="373" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="380" font-size="24" fill="var(--ink, #292B2E)">DuckDB (spatial)</text> <circle cx="44" cy="417" r="4" fill="var(--viz-track-1, #3FA5E3)" fill-opacity="0.8" /> <text x="60" y="424" font-size="24" fill="var(--ink, #292B2E)">pytest</text> </g> <g> <rect x="422" y="24" width="376" height="436" rx="20" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.09" stroke="var(--viz-track-2, #BC2F5C)" stroke-width="2" /> <text x="448" y="70" font-size="29" font-weight="700" letter-spacing="1.5" fill="var(--viz-track-2, #BC2F5C)">TIER 2</text> <circle cx="448" cy="105" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="112" font-size="24" fill="var(--ink, #292B2E)">AWS S3 / EC2 / RDS</text> <circle cx="448" cy="149" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="156" font-size="24" fill="var(--ink, #292B2E)">GitLab CI</text> <circle cx="448" cy="193" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="200" font-size="24" fill="var(--ink, #292B2E)">Terraform ?</text> <circle cx="448" cy="237" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="244" font-size="24" fill="var(--ink, #292B2E)">PostgreSQL / PostGIS</text> <circle cx="448" cy="281" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="288" font-size="24" fill="var(--ink, #292B2E)">GNU/Linux / Docker</text> <circle cx="448" cy="325" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="332" font-size="24" fill="var(--ink, #292B2E)">Great Expectations ?</text> <circle cx="448" cy="369" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="376" font-size="24" fill="var(--ink, #292B2E)">TiTiler</text> <circle cx="448" cy="413" r="4" fill="var(--viz-track-2, #BC2F5C)" fill-opacity="0.8" /> <text x="464" y="420" font-size="24" fill="var(--ink, #292B2E)">CloudWatch</text> </g> <g class="enter-rise"> <rect x="826" y="8" width="376" height="452" rx="20" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.09" stroke="var(--viz-track-3, #1baf7a)" stroke-width="2" /> <text x="852" y="54" font-size="29" font-weight="700" letter-spacing="1.5" fill="var(--viz-track-3, #1baf7a)">TIER 3</text> <circle cx="852" cy="89" r="4" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.8" /> <text x="868" y="96" font-size="24" fill="var(--ink, #292B2E)">AWS S3 / EC2 / ECS /</text> <text x="868" y="127" font-size="24" fill="var(--ink, #292B2E)">RDS</text> <circle cx="852" cy="164" r="4" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.8" /> <text x="868" y="171" font-size="24" fill="var(--ink, #292B2E)">API Gateway</text> <circle cx="852" cy="208" r="4" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.8" /> <text x="868" y="215" font-size="24" fill="var(--ink, #292B2E)">GitLab CI</text> <circle cx="852" cy="252" r="4" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.8" /> <text x="868" y="259" font-size="24" fill="var(--ink, #292B2E)">Terraform / Prefect /</text> <text x="868" y="290" font-size="24" fill="var(--ink, #292B2E)">Airflow ?</text> <circle cx="852" cy="327" r="4" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.8" /> <text x="868" y="334" font-size="24" fill="var(--ink, #292B2E)">Apache Sedona ?</text> <circle cx="852" cy="371" r="4" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.8" /> <text x="868" y="378" font-size="24" fill="var(--ink, #292B2E)">GNU/Linux / Docker</text> <circle cx="852" cy="415" r="4" fill="var(--viz-track-3, #1baf7a)" fill-opacity="0.8" /> <text x="868" y="422" font-size="24" fill="var(--ink, #292B2E)">STAC</text> </g> <path d="M18 484 L1202 484" stroke="var(--border, #C9CDD2)" stroke-width="1.6" /><path d="M1194 478 L1204 484 L1194 490 Z" fill="var(--border, #C9CDD2)" /> <text x="18" y="508" font-size="15" font-weight="600" letter-spacing="1.6" fill="var(--muted, #9AA0A6)">INCREASING AUTONOMY, SCALE, AND COST OVER THE SEMESTER</text> </svg> </div> --- class: inverse, discussion-cards # Questions - How much is too much? -- - How far can I push this class? (AI-assisted?) -- - How much AI is too much? (or too little?) -- - What else would you like to see? -- - What strategies should we use for implementing a cloud-centric geospatial curriculum? --- class: title-slide, globe-title, closing-slide <div class="title-globe" aria-hidden="true"></div> <div class="title-shade" aria-hidden="true"></div> <div class="title-copy"> <div class="title-eyebrow">GEOSPATIAL EDUCATION <span>/</span> CNG 2026</div> <h1>Thank you!</h1> <div class="title-presenter"><strong>Matthew Haffner, PhD</strong><span>Department of Geography and Anthropology<br>University of Wisconsin – Eau Claire</span></div> </div> <div class="title-footer closing-links"><a href="https://geohaff.com">geohaff.com</a><a href="mailto:haffnerm@uwec.edu">haffnerm@uwec.edu</a><a href="https://geohaff-pres.netlify.app/cng-2026">geohaff-pres.netlify.app/cng-2026</a></div> --- class: inverse, discussion-cards, discussion-tier-1 .kicker[Open discussion · Tier 1] # Direction - Do we want cloud-native geospatial at the **undergraduate level**? - What is the balance between a **vocational vs. liberal education** in geospatial? - Is a liberal geospatial education legible (and desirable) to employers? - What **strategies** can we use to get cloud-native geospatial into the classroom? - Is there interest in a **CNG education working group**? --- class: inverse, discussion-cards .kicker[Open discussion · Tier 2] # Particulars - What would such a program be **called**? - Should **traditional GIS courses** stay required? - What is the relationship between **GIS and remote sensing**? - What should the **core courses** be — and what do they contain? - What should the **learning outcomes** be?