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:
- Manipulate and analyse geospatial data using Python (GeoPandas, OSMnx, momepy)
- Apply spatial analysis techniques to urban analytics problems
- Design and build interactive web dashboards using Shiny for Python
- Structure, document, and test Python packages following best practices
- Publish Python packages to PyPI using modern tooling (uv)
- Deploy web applications to production environments
- Apply reproducible research workflows and version control
- 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
@renderdecorators 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-yournameend 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 buildanduv publishto 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/
Recommended Books
- Rey, S.J., Arribas-Bel, D., & Wolf, L.J. (2020). Geographic Data Science with Python. Available online.
- Percival, H. (2017). Test-Driven Development with Python. O’Reilly.
- The Turing Way: https://the-turing-way.netlify.app/
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:
- Check official documentation
- Search Stack Overflow and GitHub issues
- Review lecture materials and labs
- Try debugging with print statements or debugger
When Asking:
- Canvas Discussion Forum: General questions, peer support (response: 24-48 hours)
- Lab Sessions: Hands-on help from tutors and instructor
- Office Hours for Hyesop: Mondays 3-4pm (by appointment)
- 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.