geog-312 is a semester of GIS programming taught through Jupyter notebooks
Introduction to GIS Programming
At a glance
- What is it?
- The geog-312 repository is the free course website for Introduction to GIS Programming at the University of Tennessee, Knoxville, a Jupyter Book of notebooks and labs covering Python fundamentals and the open source geospatial stack from GeoPandas and Rasterio to Leafmap and MapLibre, with a textbook published separately in twelve languages. It suits self-learners who want structured coursework with labs, and it is teaching content rather than a library.
- Who is it for?
- Learners who want a structured semester of geospatial Python with labs, exercises and a final project rather than a scattered set of tutorials, and who are comfortable writing Python already, are the people this course is for. It is the wrong thing to reach for if you want a library to depend on, because this is course content under a CC-BY-4.0 licence and the pyproject.toml is there to build the book rather than to publish a package.
- Can I use it commercially?
- Yes, with credit. CC-BY-4.0 allows commercial use as long as you credit the authors and indicate what you changed. It is written for creative content, so check how it applies to any code.
- Is it still maintained?
- Yes. The repository last received commits 11 days ago.
- What is it written in?
- Mainly Jupyter Notebook, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 20, 2026, and from our analysis. They are not legal advice.
Editorial analysis
This repository is the course, not a software library
The name is a course code. The repository is the official course website for Introduction to GIS Programming, offered at the University of Tennessee, Knoxville, and it carries the title, the textbook reference and the enrolment link for GEog 312. The primary language is recorded as Jupyter Notebook, which tells you what the teaching content is made of, and the licence is CC-BY-4.0, which is the right licence for a body of course content and the wrong one for a library. The project home is geog-312.gishub.org, and the top level of the tree shows a Jupyter Book rather than a package: a _config.yml, a _toc.yml that holds the table of contents, a book/ directory, a CNAME file for the custom domain, a favicon and a logo. The pyproject.toml describes a project called geog-312 at version 0.1.0, and the requirements.txt pins the tools that build it.
What the course covers, and which libraries it teaches
The course overview describes the semester as a comprehensive exploration of GIS programming centred on Python, with students mastering the libraries and frameworks needed to process, analyse and visualise geospatial data. The What You'll Learn section is the more specific document. The Python fundamentals come first, moving from variables, data types, data structures, string operations, looping and control statements through to functions, classes, file handling and exception handling. Then the geospatial half names the libraries directly, and the list is the part worth reading if you are deciding whether this course covers your stack. It covers Leafmap for interactive web maps, GeoPandas for vector data, Rasterio for raster data, Xarray and Rioxarray for array-shaped geospatial data, MapLibre for 3D mapping, Whitebox for terrain and hydrology analysis, Geemap and SAMGeo for image segmentation, HyperCoast for satellite data, and DuckDB for querying. Hands-on labs and projects run alongside the lectures and culminate in a final project on a real-world geospatial problem.
The textbook is separately published, with a print edition
The course and the book are related but distinct. The readme cites Wu, Q. (2025), Introduction to GIS Programming: A Practical Python Guide to Open Source Geospatial Tools, independently published with ISBN 979-8286979455, and a print edition is offered as the English full-colour version at 556 pages. The digital editions are listed separately and in several languages, with English, Chinese, Japanese, Korean, Spanish, French, Portuguese, Indonesian, German, Russian, Italian and Czech editions available from the same OpenGeoPub site under a shared path prefix with a language suffix. That the book exists in twelve languages is a reasonable signal about the reach of this particular course, and the 556 page figure is a useful measure of the scope if you are looking for a single book rather than a semester of coursework. The book cover image and the course page image in the readme point at the same asset host as the site.
Everything is free without enrolling, which is unusual for a course
The access policy is stated directly and it is the most useful thing for anyone deciding whether this is worth their time. All the course content, including lecture videos, are freely available on the course website, and the lecture videos are available as a YouTube playlist. You can access both without enrolling. Enrolling is what you need only if you want to submit lab assignments, receive grades and earn a certificate of completion, and there is no deadline for enrolment and no requirement to complete the course at a fixed pace. The practical read for a self-learner is that this is a full semester of lectures and labs with no paywall, and for a student it is the same content plus the assessment and the certificate. The readme also carries a code of conduct file and a contributing file at the top level, which is what you would expect from a repository that invites outside contributions to the course content.
Building the book locally means one make target and a virtual environment
The Makefile is short and does one job. It pins the shell to bash, the interpreter to python3.11 and the environment to a .venv directory, with a helper that sources the virtual environment's activate script before running a command.
SHELL:= bash
PY:= python3.11
VENV:= .venvThe requirements target creates the virtual environment if it does not exist and installs everything in requirements.txt into it.
requirements: $(vb)pip requirements.txt
$(call vrun,pip --require-virtualenv \
install --requirement=requirements.txt)There is a clean target that removes the virtual environment directory, and the environment itself is created with the standard module, so the only prerequisite beyond Python 3.11 is that python3.11 exists on the machine. The pip target is worth noting for anyone who has been bitten by a stale environment, because it first lists the installed packages in freeze format, strips the version constraints with a regular expression, and upgrades what is already there before the install step runs.
The requirements file is the toolchain in six lines
The dependencies are pinned exactly, and they are the tools that build and serve the course rather than the tools the course teaches. Six entries do the work.
geospatial==0.11.*
ghp-import==2.1.*
jupyter-book==1.0.*
jupytext==1.19.*
pmtiles==3.7.*
py3depjupyter-book is the book generator, jupytext converts between the notebook and script forms of the notebooks, and pmtiles is the tile format used for the map assets the course ships. ghp-import is a helper for importing GitHub hosted content into the book, and the geospatial package is the one that pulls in the working stack the lessons use. py3dep is unpinned, which is the only entry without a version constraint. The pyproject.toml names setuptools and setuptools_scm as the build requirements, takes its dependencies dynamically from requirements.txt, and requires Python 3.9 or above, while the Makefile works with python3.11 specifically. The repository also carries a uv.lock, a pre-commit configuration and a .github directory, so there is a dependency lock file for a second tool alongside the pip-based environment.
Where this course is the wrong choice
The first wrong case is someone looking for a Python geospatial library to depend on, because this is course content under a CC-BY-4.0 licence and the pyproject.toml is there to build the book rather than to publish a package you would install. The second is a team that wants a reference implementation for its own geospatial codebase, because what is here is coursework with exercises rather than a maintained library with a compatibility promise, and the course libraries themselves move quickly. The third is a learner who has no Python at all and expects the course to start at the beginning, since the fundamentals are covered, but the assumption throughout is that you can already write Python and want to apply it to geospatial problems. The fourth is a team that needs a course with assessment or a certificate without paying for the enrolment, since the content is free but the grades and the certificate are tied to enrolling. The fifth is anyone expecting the site to be a stable reference with a fixed set of library versions, because the requirements pin versions at the time of writing and the twelve translated editions of the book move independently of the notebooks.
Editorial conclusion
Learners who want a structured semester of geospatial Python with labs, exercises and a final project rather than a scattered set of tutorials, and who are comfortable writing Python already, are the people this course is for. It is the wrong thing to reach for if you want a library to depend on, because this is course content under a CC-BY-4.0 licence and the pyproject.toml is there to build the book rather than to publish a package. Check three things before you commit: that your Python is good enough to skip the fundamentals, since the course moves from variables and control statements to functions, classes, file handling and exception handling before it reaches geospatial work, that the version of the library stack in the requirements matches what you plan to use, since the pinned versions are the ones the content was written against and the geospatial ecosystem moves quickly, and that the fixed versions still fit your Python, since the pyproject requires Python 3.9 or above while the Makefile builds against python3.11. The licence is CC-BY-4.0, the last push was on 2026-10-12, and the repository publishes no GitHub releases.
Frequently asked questions
What is the geog-312 repository?
It is the official course website for Introduction to GIS Programming at the University of Tennessee, Knoxville, published as a Jupyter Book with a _config.yml, a _toc.yml and a book/ directory. The primary language is recorded as Jupyter Notebook and the licence is CC-BY-4.0.
Which geospatial libraries does the GIS programming course teach?
The readme names Leafmap for interactive web maps, GeoPandas, Rasterio, Xarray, Rioxarray, MapLibre for 3D mapping, Whitebox, Geemap, SAMGeo, HyperCoast and DuckDB. The Python fundamentals come first, from variables and control statements through functions, classes, file handling and exception handling.
Do I have to enrol to use the geog-312 course content?
No. All the course content, including lecture videos, are freely available on the course website at geog-312.gishub.org, and the videos are on a YouTube playlist. Enrolling is only needed to submit lab assignments, receive grades and earn a certificate, and there is no deadline and no fixed pace.
How do I build the geog-312 course website locally?
Run make requirements, which creates a .venv with python3.11 and installs everything from requirements.txt into it. The Makefile also has a clean target that removes the virtual environment. The requirements pin jupyter-book, jupytext, pmtiles, ghp-import and the geospatial package.
Is there a textbook for the Introduction to GIS Programming course?
Yes. Wu, Q. (2025), Introduction to GIS Programming: A Practical Python Guide to Open Source Geospatial Tools, independently published, ISBN 979-8286979455, with a 556 page full-colour print edition and PDF and EPUB editions in twelve languages including English, Chinese, Japanese and Spanish.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/giswqs-geog-312)Was this useful?