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 geospatial: geopandas, shapely, pyproj, rasterio, contextily
- Network analysis: osmnx, networkx, momepy
- Dashboard: shiny, shinylive, ipyleaflet, plotly, shinyswatch
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-3rd March)
Lecture topics
- Course overview and expectations
- Python for geospatial analysis: why and how?
- Python fundamentals review: modules, packages, environments
- Introduction to Quarto for literate programming
- Modern package management with uv (in lab session)
- Basic Python that you need to know
Lab activities
- Install Python, Positron, and Quarto
- Set up development environment with uv
- Install essential geospatial packages
- Create your first Quarto document
- Test installations with simple examples
Learning resources - uv documentation: https://docs.astral.sh/uv/ - Quarto documentation: https://quarto.org/docs/get-started/ - Python refresher materials (provided)
Key skills: Environment setup, package management, Quarto basics
Week 2: Fundamentals of Python (9 March)
Lecture topics
Python skills
- Module imports:
import,from...import,import...as - Data structures: long vs wide formatting
- Data manipulation fundamentals: filtering, selecting, sorting
- Pandas operations: groupby, merge, join
- Data visualisation
- Dealing with possible errors
- Importing geospatial datasets (GeoJSON, Shapefiles, GeoPackage)
- Vector and raster data visualisation with GeoPandas and matplotlib
- Calculating basic distance measures (Euclidean, haversine)
Urban analytics
- Data quality issues in real-world urban data
- Identifying outliers and missing data in urban datasets
- Statistical imputation methods
- Working with census geographies (SA2 level in NZ)
Lab activities
- Disclosing Assignment 1
- Install and configure Git for version control
- Long/wide formatting with pedestrian footfall datasets (Heart of City)
- Data manipulation exercises: filtering, groupby, merge operations
- Work with messy pedestrian count data (intro to Assignment 1 dataset)
- Imputation practice: mean/median/forward fill
- Descriptive statistics and exploratory visualisations
- Intro to folium for interactive web maps
- Write your first Python module
Key skills: Data wrangling, distance calculations, spatial aggregation, imputation, exploratory analysis
Week 3: Advanced geospatial operations (16 March)
Lecture topics
Python skills
- Vector and raster data visualisation with GeoPandas and matplotlib
- Choropleths and classification (Jenks, quantiles, equal interval)
- Interactive web mapping with folium
- Spatial aggregation: counting points within polygons (SA2)
- Spatial joins across geographic levels
- Distance-based analysis: buffers, proximity calculations
- CRS and transformations
- Spatial indexing and performance
Urban analytics context
- Introduction to pedestrian mobility
- Introduction to urban morphology with
momepy - Walkability indices and street connectivity
- Census geography in NZ (SA1, SA2, SA3) and aggregation choices
Lab activities
- Download SA2 boundaries for Auckland (Stats NZ)
- Count sensors by SA2 and compute average footfall per SA2
- Distance matrix between sensors and key destinations
- Intro to momepy: basic morphometrics
- Street connectivity metrics and relate to footfall
- Choropleths with Jenks
- Interactive folium maps with popups/tooltips
Key skills: Spatial joins, buffers, network analysis, momepy, choropleths
Week 4: Urban morphology and mid-term assessment (23 March)
Guest lecture: Shriv (Monday 23 March, 13:00-14:00) - Urban morphology using momepy: concepts and applications - Case studies of morphology and walkability analysis - Connecting morphology to pedestrian behaviour - Walkability frameworks with OSMnx
Test guide
- Test preparation guidance
Lab - Assignment 1 work session and test preparation
Canvas test (27-29 March) - Practical Python coding assessment covering Weeks 1-4
Key skills: Morphology concepts, revision, coding under assessment conditions
Week 5: Functions and workflows (30 March)
Lecture topics
- Writing effective functions and code organisation - important for Assignment 1 and 3
- Functions for extremes (max/min) and grouped summaries
- GitHub workflows and reproducibility
Lab activities
- Reusable functions for blog analysis
- Comparing years (pre/post COVID)
- Refactoring and code review
- Quarto structure and formatting
- Final Assignment 1 work session
Assignment 1 due: 5 April Sunday 23:59
Easter and mid-semester break (3 April - 17 April 2026)
No classes. Classes resume Monday 20 April (Week 6).
Part 2: Deploying geospatial work online
Week 6: Introduction to WebGIS and Shiny (20 April)
Lecture topics
- WebGIS fundamentals, Wasm overview
- Shiny for Python
- Interactive maps with ipyleaflet
- Building your architecture: Ideation is key!
Guest lecture: Alex Raichev (14:15-15:00)
Lab activities
- Announcement of Assignment 2
- Build a first Shiny app locally
- Reactive outputs (maps, plots, tables)
- Controls (sliders, dropdowns)
Key skills: Reactive programming, Shiny fundamentals
Week 7: Dashboard work session (ANZAC week) (27 April)
ANZAC Day: Monday 27 April 2026
- Watch Video of urban mobility OD flows.
No lecture. Labs run as normal.
Lab activities
- Intensive dashboard development
- One-on-one consultations, peer code review
- OSM data workshop and network analysis support
- Deployment preparation for shinylive
Week 8: Advanced dashboards, networks, and temporal analysis (4 May)
Lecture topics
- Multi-page apps (
ui.nav_panel()) - shinylive deployment workflow
- Temporal controls and animation patterns
- Dashboard UX principles and performance
Lab activities
- Final refinement, performance testing
- Deployment troubleshooting
- Submission preparation
Assignment 2 due: 10th May Sunday 23:59
Part 3: Publishing your first Python package
Week 9: Built environment and pedestrian policy (11 May)
Lecture topics
- 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)
- Package structure and
pyproject.toml, modular design,srclayout
Lab activities
- Scoping your package: what policy-relevant pedestrian analysis could your tool support?
uv init, package scaffolding, module organisation- Pair work on design architecture
Week 10: Pedestrian equity, safety, and testing geospatial code (18 May)
Lecture topics
- Equity in pedestrian infrastructure provision: who benefits, who is underserved?
- Pedestrian safety: collisions, exposure to air/noise pollution
- Accessibility for diverse populations: older adults, children, disabled walkers
- Writing and structuring tests for spatial functions
Lab activities
- Write tests for geofencing, distances, OD aggregation
- Build docs and tutorials
- Final docs, demo notebook, poster finalisation
- Poster finalisation
Week 11: CI/CD and pre-publication (25 May)
Lecture topics
- Walkability policy and practice
- GitHub Actions, pre-commit, semantic versioning
- Build and publish to TestPyPI with uv
- Licensing and release workflow
- Poster design basics
Poster showcase: 26th May (B301-G10)
Week 12: Final publication and poster showcase prep (1 June)
King’s Birthday: Monday 1 June 2026
No lecture.
Lab activities.
- Q&A
- CI setup,
uv build, TestPyPI publish and install testing - Publish to PyPI (if not already)
Assignment 3 due: 7 June Sunday 23:59
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 | - |
| 2 | 9 Mar | Geospatial Python fundamentals | - |
| 3 | 16 Mar | Advanced geospatial operations | - |
| 4 | 23 Mar | Guest (1-2pm) + Walkability | Canvas Test (27-28 Mar) |
| 5 | 30 Mar | Functions and workflows | A1 Due (3 Apr) |
| - | 3-17 Apr | EASTER/MID-SEMESTER BREAK | - |
| 6 | 20 Apr | WebGIS and Shiny intro (+ Guest) | - |
| 7 | 27 Apr | NO LECTURE (ANZAC Day) - Labs only | - |
| 8 | 4 May | Advanced dashboards and networks | A2 Due (10 May) |
| 9 | 11 May | Package structure built environment | Pair work on design architecture |
| 10 | 18 May | Adding functions, data, and documentation Pedestrian safety | |
| 11 | 25 May | Walkability and Policy Poster showcase | - |
| 12 | 1 June | NO LECTURE (King’s Birthday) - Labs only | Package submission due |
Note on Assignment 2: Due date moved to 8 May (Thursday of Week 8) to account for ANZAC Day week having no lecture. Students get Week 7 labs to work on dashboards.
Note on Assignment 3 & Poster: Both due 7 June. Poster showcase event at separate venue (details to be announced).
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: March 2026
Version: 3.0
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.