Syllabus (Semester 1, 2026)

GISCI 343: Geo-Spatial Data Science

  • University of Auckland, 2026
  • Instructor: Dr Hyesop Shin
  • Semester 1: 12 weeks (2 March - 2 June 2026)
  • Book: https://dataandcrowd.github.io/python-gis/

Course overview

This course provides comprehensive training in Python for urban analytics, progressing from foundational geospatial programming to production-ready research software. Students will learn to analyse urban data, create interactive web dashboards using Shiny for Python, and publish Python packages to PyPI. The course emphasises reproducible research, open science practices, and software development skills essential for modern geospatial research and practice.

Level: Intermediate to Advanced
Contact hours:

  • Lecture: 2 hours per week (Monday 13:00-15:00)
  • Lab: 2 hours per week (Tuesday 13:00-15:00)

Prerequisites: - Nothing in principle (but previous exposure helps) - Recommended: basic programming experience (any language) - Familiarity with GIS concepts - Statistical thinking


Learning objectives

By the end of this course, students will be able to:

  1. Manipulate and analyse geospatial data using Python (GeoPandas, OSMnx, momepy)
  2. Apply spatial analysis techniques to urban analytics problems
  3. Design and build interactive web dashboards using Shiny for Python
  4. Structure, document, and test Python packages following best practices
  5. Publish Python packages to PyPI using modern tooling (uv)
  6. Deploy web applications to production environments
  7. Apply reproducible research workflows and version control
  8. Communicate spatial analysis results through visualisations, dashboards, and blog posts

Software requirements

Essential

  • Python 3.10 or higher
  • Positron IDE (or VS Code)
  • Quarto for literate programming
  • uv for package management
  • Git and GitHub account
  • TestPyPI and PyPI accounts (free registration)

Python libraries (managed via uv)

  • Core data: pandas, numpy, matplotlib, seaborn
  • Core geospatial: geopandas, shapely, pyproj, contextily
  • Network and morphology: osmnx, networkx, momepy
  • Dashboard: shiny, shinylive, ipyleaflet, plotly, shinyswatch
  • Development (Part 4): pytest, pytest-cov, ruff, hatchling

Platforms

  • GitHub for version control (essential across assignments)
  • Substack account for blogging (Assignment 1)
  • shinylive account for dashboard hosting (Assignment 2)

Assessment structure

Assessment Weight Due date
Weekly quizzes 15% Weeks 2-10 (not wk8)
Assignment 1: Data Blog Post 15% 5 April (Week 5)
Canvas Mid-sem Test 15% 27-29 March (Week 4)
Assignment 2: Shiny Dashboard 15% 10 May (Week 8)
Poster Showcase 10% 26th May (Week 11, B301 Ground floor)
Assignment 3: PyPI Package 30% 7 June (Week 12)

Total: 100%

Note on Assignment 2: Due date adjusted to 10 May to account for ANZAC Day week having no lecture. Students receive Week 7 (ANZAC week) as dedicated lab time for dashboard development.

Note on Poster Showcase: Students will present an A1 poster describing their packages at a designated showcase event (B301-G10).


Course schedule

Part 1: Introduction to geospatial analysis in Python

Week 1: Course introduction and Python setup (2-3 March)

Lecture topics

  • Course overview and expectations
  • Why Python for geospatial analysis
  • Reproducibility, open science, and the “works on my machine” problem
  • Python fundamentals review: modules, packages, environments
  • Introduction to Quarto for literate programming
  • Modern package management with uv

Lab activities (Sections 1.1 to 1.5)

  • Install Python, Positron, Quarto, and uv
  • Create reproducible project environments with uv
  • Configure Git locally for version control
  • Download project data from GitHub
  • Authenticate with GitHub via SSH or PAT
  • Render your first Quarto document

Learning resources

  • uv documentation: https://docs.astral.sh/uv/
  • Quarto documentation: https://quarto.org/docs/get-started/
  • Course chapter: Part 1 Setup (Sections 1.1 to 1.5)

Key skills: Environment setup, package management with uv, Git basics, Quarto basics


Week 2: Fundamentals of Python and DataFrames (9 March)

Lecture topics

Python skills (Section 2.1)

  • Variables, data types, and operators
  • Control flow: conditionals and loops
  • Functions and methods
  • Module imports: import, from...import, import...as

DataFrames with pandas (Section 2.2)

  • Reading and inspecting tabular data
  • Long vs wide formatting
  • Filtering, selecting, sorting, groupby, merge, and join
  • Handling missing data and basic imputation
  • Reshape and export workflows

Lab activities

  • Announce Assignment 1 (Data Blog Post)
  • Practise pandas operations on Heart of the City pedestrian footfall data
  • Work with messy pedestrian counts: filtering, groupby, merging
  • Imputation practice: mean, median, forward fill
  • Descriptive statistics and an exploratory time series

Key skills: Python fundamentals, pandas data wrangling, exploratory analysis


Week 3: Data visualisation and geospatial data (16 March)

Lecture topics

Data visualisation (Section 2.3)

  • The Python visualisation ecosystem (matplotlib, pandas plotting, seaborn)
  • Time series, distributions, relationships, and small multiples
  • Communicating uncertainty and avoiding misleading charts

Geospatial data (Section 2.4)

  • Vector data with GeoPandas: reading GeoJSON, Shapefile, GeoPackage
  • Coordinate reference systems and transformations
  • Spatial joins, buffers, and proximity
  • Choropleths and classification (Jenks, quantiles, equal interval)

Lab activities

  • Download GIS data from Stats NZ and LINZ via web APIs (Lab Week 4 preview)
  • Plot SA2 boundaries for Auckland and join with footfall summaries
  • Compute distance and buffer-based proximity to key destinations
  • Build a labelled choropleth with a clear legend, units, and caption

Key skills: Python visualisation, CRS handling, spatial joins, choropleths, web APIs


Week 4: Functions, urban analytics, and mid-semester test (23 March)

Lecture topics

Functions (Section 2.5)

  • Writing effective functions: arguments, defaults, return values, docstrings
  • Refactoring repeated analysis into reusable code
  • Functions for grouped summaries and extremes

Urban analytics indicators (Section 2.6)

  • Population density and access proxies
  • Nearest park distance and accessibility metrics
  • Optional: street network centrality
  • Caveats, units, and responsible interpretation

Guest lecture: Shriv (Monday 23 March, 13:00-14:00)

  • Urban morphology using momepy: concepts and applications
  • Case studies linking morphology, walkability, and pedestrian behaviour

Lab activities

  • Mid-semester test preparation
  • Assignment 1 work session

Canvas test (27-29 March)

  • Practical Python coding assessment covering Weeks 1 to 4

Key skills: Function design, urban indicators, morphology, coding under assessment conditions


Week 5: Workflows and Assignment 1 finalisation (30 March)

Lecture topics

  • Quarto for blog-style reporting: structure, code chunks, and figures
  • GitHub workflows and reproducibility for the data blog
  • Pre and post COVID comparisons in pedestrian footfall

Lab activities

  • Refactor blog analysis into reusable functions
  • Final Quarto formatting, captions, and figure polish
  • Peer code review and Assignment 1 work session

Assignment 1 due: 5 April Sunday 23:59 NZST


Easter and mid-semester break (3 April - 17 April 2026)

No classes. Classes resume Monday 20 April (Week 6).


Part 2: Interactive dashboards with Shiny for Python

Week 6: Introduction to Shiny and reactive programming (20 April)

Lecture topics

Your first Shiny app (Section 3.1)

  • The three parts of every Shiny app: UI, server, App object
  • Inputs, outputs, and the reactive graph

Reactivity in action (Section 3.2)

  • How Shiny works out what to recompute and when
  • Reactive expressions and isolation patterns

Decorators and UI (Section 3.3)

  • Layouts, panels, and common input controls
  • Using @render decorators for plots, maps, and tables

Guest lecture: Alex Raichev, MRCagney (Monday 20 April, 14:15-15:00)

  • How transport-analytics dashboards are used in practice

Lab activities

  • Assignment 2 brief released: data tracks randomly assigned on Tuesday 21 April, 13:10 NZST
  • Build a first Shiny app locally
  • Wire reactive outputs (maps, plots, tables) to inputs (sliders, dropdowns)

Key skills: Reactive programming, Shiny fundamentals, UI layout


Week 7: WebGIS in the browser and Auckland open data (ANZAC week, 27 April)

ANZAC Day: Monday 27 April 2026, no lecture. Labs run as normal.

Self-study material

WebGIS with shinylive (Section 3.4)

  • Wasm and the shinylive runtime
  • Deploying a Shiny app to GitHub Pages

Mapping Auckland open data (Section 3.5)

  • Working with points, lines, and polygons (bus stops, routes, parks)
  • Joining open data layers to SA2 geographies for OD flows
  • Interactive maps with ipyleaflet

Lab activities

  • Intensive Assignment 2 build session
  • One-on-one consultations and peer code review
  • Deployment preparation for shinylive on GitHub Pages

Week 8: Polish, deployment, and submission (4 May)

Lecture topics

  • Multi-page apps with ui.nav_panel()
  • Performance and UX patterns for dashboards
  • Final shinylive deployment workflow

Lab activities

  • Final refinement, performance testing
  • Deployment troubleshooting
  • Submission preparation following the Assignment 2 brief (Section 3.6)

Assignment 2 due: 10 May Sunday 23:59 NZST, deployed live on GitHub Pages


Part 3: Publishing your first Python package

Week 9: Package fundamentals and the built environment (11 May)

Lecture topics

Package structure and configuration (Section 4.1)

  • Why packaging matters for GIScience research
  • The src/ layout and Python package terminology
  • Configuring pyproject.toml: metadata, dependencies, and tool settings
  • Building distributions with uv

Built environment and pedestrian policy

  • The built environment and walking: land-use mix, density, street design, and pedestrian infrastructure
  • Policy levers for pedestrian mobility: low-traffic neighbourhoods, shared spaces, speed management, pedestrianisation
  • International case studies: Superblocks (Barcelona), School Streets, 15-minute city (Paris)

Lab activities

  • Scope your package: what policy-relevant pedestrian analysis could your tool support?
  • uv init --lib, package scaffolding, module organisation
  • Build geohello-yourname end to end and test the wheel locally
  • Pair work on package design architecture

Key skills: Package scaffolding, pyproject.toml, uv build, local installation


Week 10: Testing, documentation, and pedestrian equity (18 May)

Lecture topics

Testing and code quality (Section 4.2)

  • Why testing matters: catching silent geospatial failures
  • pytest basics for spatial functions (CRS, joins, geometry)
  • NumPy-style docstrings and README writing
  • Publishing to TestPyPI as a safe rehearsal

Pedestrian equity and safety

  • Equity in pedestrian infrastructure provision: who benefits, who is underserved?
  • Pedestrian safety: collisions, exposure to air and noise pollution
  • Accessibility for diverse populations (older adults, children, disabled walkers)

Lab activities

  • Write tests for geofencing, distances, and OD aggregation
  • Add docstrings and a tutorial notebook to your package
  • Publish a release candidate to TestPyPI
  • Begin poster drafting

Week 11: CI/CD, real-world packages, and poster showcase (25 May)

Lecture topics

Geospatial package example (Section 4.3)

  • Walkthrough of a full Auckland GIS toolkit
  • CI/CD with GitHub Actions and pre-commit hooks
  • Semantic versioning, type hints, and error messages

Walkability policy and practice

  • Connecting package functionality to walkability policy questions
  • Poster design basics

Poster showcase: Tuesday 26 May (B301-G10)

Lab activities

  • Set up GitHub Actions for tests and lint checks
  • Pre-commit configuration and badge integration
  • Poster finalisation and dry-run presentations

Week 12: Publishing to PyPI (1 June)

King’s Birthday: Monday 1 June 2026, no lecture. Labs run as normal.

Self-study material

Publishing to PyPI (Section 4.4)

  • TestPyPI vs production PyPI: what is permanent
  • Pre-publication checklist (tests, coverage, lint, README)
  • uv build and uv publish to production PyPI
  • Versioning, release notes, and ongoing maintenance

Lab activities

  • Q&A and final troubleshooting
  • uv build, TestPyPI install test, then publish to production PyPI
  • Confirm your package installs cleanly in a fresh environment

Assignment 3 due: 7 June Sunday 23:59 NZST


Course Policies

Open Science and Reproducibility

All code must be version controlled using Git from Week 1. Students are required to make their packages open source under an appropriate licence (MIT recommended). Dashboards and blog posts should be publicly accessible unless they contain sensitive data.

Code Quality Standards

Code submitted for Assignments 2 and 3 must: - Pass automated linting (ruff/black) - Include type hints for public functions (Assignment 3) - Have comprehensive docstrings - Follow PEP 8 style guidelines (https://peps.python.org/pep-0008/) - Be properly documented

Academic Integrity

Standard university academic integrity policies apply. All work must be your own. You may:

  • Discuss concepts and approaches with peers
  • Use AI assistants (GitHub Copilot, ChatGPT, Claude) for debugging and learning
  • Reference external code with proper attribution

You may not:

  • Copy code from peers or external sources without attribution
  • Submit work that you don’t understand
  • Share solution code before deadlines

Data Ethics

When working with urban data:

  • Respect individual privacy (avoid identifying individuals)
  • Consider impacts on communities represented in data
  • Acknowledge data sources and limitations
  • Be transparent about assumptions and uncertainties
  • Include ethical reflection in project documentation

Accessibility

Dashboards must consider accessibility:

  • Colourblind-safe palettes
  • Keyboard navigation
  • Clear labels and instructions
  • Responsive design

Late Submissions

  • Late submissions incur 10% penalty per day (including weekends)
  • Extensions available for documented circumstances (apply in advance)
  • Technical issues: contact instructor immediately, not after deadline

Use of AI Tools

AI tools are permitted for:

  • Debugging and error resolution
  • Learning new concepts
  • Documentation writing
  • Code suggestions and completion

However:

  • You must understand all code you submit
  • Your writing must be your own (if you have used AI in your work, do mention that)
  • Creative design and analytical approach must be your own
  • Over-reliance on AI without understanding is apparent and penalised

Weekly Time Expectations

Students should expect to spend approximately 10-12 hours per week:

  • Lecture: 2 hours
  • Lab: 2 hours
  • Independent work: 6-8 hours (readings, assignments, practise)

Peak workload weeks:

  • Week 5: Assignment 1 completion (12-15 hours)
  • Week 8: Assignment 2 completion (15-20 hours)
  • Week 11-12: Assignment 3 completion (20+ hours)

Learning Resources

Essential Documentation

  • GeoPandas: https://geopandas.org/
  • Shiny for Python: https://shiny.posit.co/py/
  • uv Documentation: https://docs.astral.sh/uv/
  • OSMnx: https://osmnx.readthedocs.io/
  • Quarto: https://quarto.org/
  • Python Packaging Guide: https://packaging.python.org/
  • pytest: https://docs.pytest.org/
  • MkDocs: https://www.mkdocs.org/

Data Sources

  • OpenStreetMap (via OSMnx or Overpass API)
  • Stats NZ (New Zealand census and geographic data)
  • Auckland Council open data portal
  • Urban Observatory platforms
  • Natural Earth (global datasets)

Example Projects

  • Awesome Geospatial: https://github.com/sacridini/Awesome-Geospatial
  • Python for Geographic Data Science course materials
  • PyPI urban analytics packages: momepy, urbanaccess, pandana

Technical Support and Troubleshooting

Getting Help

Before Asking:

  1. Check official documentation
  2. Search Stack Overflow and GitHub issues
  3. Review lecture materials and labs
  4. Try debugging with print statements or debugger

When Asking:

  1. Canvas Discussion Forum: General questions, peer support (response: 24-48 hours)
  2. Lab Sessions: Hands-on help from tutors and instructor
  3. Office Hours for Hyesop: Mondays 3-4pm (by appointment)
  4. Email: hyesop.shin@auckland.ac.nz (allow 48 hours for response)

For Technical Issues:

  • ITS Service Desk: Software installation problems
  • Course tutors: Python/GIS questions, project opinions
  • Instructor: Project-specific guidance, conceptual questions

Common Issues

uv Problems:

  • Update: uv self update
  • Clear cache: uv cache clean
  • Check Python version compatibility

Shiny Deployment:

  • Test locally first
  • Check file sizes (shinylive has limits)
  • Use relative paths, not absolute
  • Verify all dependencies

Testing Spatial Data:

  • Use appropriate geometric tolerances
  • Mock external data sources
  • Create small test fixtures
  • Test edge cases

PyPI Publication:

  • Test on TestPyPI first
  • Ensure unique package name
  • Complete all metadata in pyproject.toml
  • Verify README renders correctly

Technical Prerequisites Check

Before Week 1, ensure you can:


Contact Information

Instructor: Dr Hyesop Shin
Email: hyesop.shin@auckland.ac.nz
Office: Room 301-529B, Building 301
Office Hours: Mondays 3-4pm (book via email)

Course Materials: - Canvas: Main course hub for announcements, assignments, and resources - Webbook: https://dataandcrowd.github.io/python-gis/ - Discussion Forum: Ed Disucssion board

Getting Help: - During Lab Sessions: Ask tutors and instructor for immediate help - Canvas Discussion Forum: Post questions for peer and instructor support (24-48 hour response) - Office Hours: Mondays 3-5pm or email to arrange another time - Email: For personal matters or urgent issues (allow 48 hours for response)


Course Schedule Summary

Important Dates: - Easter/Mid-Semester Break: 3 April - 17 April 2026 (two weeks, no classes) - ANZAC Day: Monday 27 April 2026 (no lecture) - King’s Birthday: Monday 1 June 2026

Week Dates Topic Assessment
1 2 Mar Course intro, Python setup, uv, Git, Quarto -
2 9 Mar Python fundamentals and pandas DataFrames -
3 16 Mar Data visualisation and geospatial data -
4 23 Mar Functions, urban indicators, guest lecture Canvas test (27-29 Mar)
5 30 Mar Workflows and Quarto blogging A1 due (5 Apr)
- 3-17 Apr EASTER / MID-SEMESTER BREAK -
6 20 Apr Shiny basics, reactivity, UI (+ guest) -
7 27 Apr No lecture (ANZAC Day): shinylive and Auckland open data (lab) -
8 4 May Polish, multi-page apps, deployment A2 due (10 May)
9 11 May Package fundamentals and built environment -
10 18 May Testing, documentation, and pedestrian equity -
11 25 May CI/CD, real-world package example, poster showcase Poster showcase (26 May)
12 1 June No lecture (King’s Birthday): publish to PyPI (lab) A3 due (7 June)

Note on Assignment 2: Due Sunday 10 May 2026, 23:59 NZST. The ANZAC Day week has no lecture, so students get the Week 7 lab to work on dashboards.

Note on Assignment 3 and Poster: Poster showcase is held on Tuesday 26 May (B301-G10). Final package submission for Assignment 3 is due Sunday 7 June 2026, 23:59 NZST.


Statement on Course Evolution

This syllabus reflects the current course plan. Minor adjustments may be made based on class progress, student needs, or external factors. Significant changes will be communicated via Canvas with adequate notice. Students will always be notified of any modifications to assessment requirements or due dates.

The integration of modern tools (uv, Positron, shinylive) represents the evolving landscape of geospatial Python. We embrace these changes to ensure students learn current best practices.


Last Updated: May 2026 Version: 3.1

This course emphasises practical skills for urban analytics research, planning, and policy support. The combination of spatial analysis, interactive visualisation, and software development prepares students for careers in academia, government, consulting, and technology sectors.