Self-hosted service
giswqs/intro-gispro avatar
giswqs/intro-gispro

intro-gispro is the runnable companion to a geospatial Python textbook

Code examples for the book titled Introduction to GIS Programming

638 stars224 forksJupyter NotebookCC0-1.0

At a glance

What is it?
intro-gispro holds every code example from Introduction to GIS Programming, organised one folder per chapter, and each example can be run in MyBinder, in Google Colab or in a prepared Docker image. The trade is that the examples are tied to a book rather than standing alone as a library, and the two Docker images differ in how much they carry.
Who is it for?
intro-gispro suits a self-taught geospatial programmer who wants worked examples across the whole GeoPandas, Rasterio, Leafmap and DuckDB stack in one place, and who prefers clicking through a notebook to configuring an environment. It does not suit a production project looking for a maintained geospatial library, since the repository is documentation for a specific book and the code is organised around its chapters.
Can I use it commercially?
Yes. CC0-1.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
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 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The repository is a book's appendix, not a library

The repository describes itself as the official repository for Introduction to GIS Programming: A Practical Python Guide to Open Source Geospatial Tools, and says it contains all the code examples featured in the book so you can learn and apply Python for geospatial analysis with open source tools. That framing sets expectations correctly. Nothing here is an installable library, there is no public API, and no example is designed to be imported by your application. The value is that the examples are complete, they run, and they are arranged so that a reader working through the book can open the file for the chapter they are on and see working code rather than fragments. The topic tags say geopython, geospatial, jupyter, mapping and python, and the primary language in the repository is Jupyter Notebook, which tells you the examples are meant to be read and re-run rather than read as source.

The structure follows the book's chapters, not a data model

The table of contents in the README is the best available map of the repository, and it reads as a curriculum. It opens with a preface and a software setup section covering an overview of the tools, Python package management, setting up Visual Studio Code, version control with Git, using Google Colab, working with JupyterLab and using Docker. Then come the Python programming fundamentals, with variables and data types, data structures, string operations, loops and conditional statements, functions and classes, working with files, and data analysis with NumPy and Pandas. The third part is the geospatial part, and it is where the library names pile up: vector data analysis with GeoPandas, raster data with Rasterio, multi-dimensional data with Xarray, raster analysis with Rioxarray, interactive visualization with Leafmap, geoprocessing with WhiteboxTools, 3D mapping with MapLibre, cloud computing with Earth Engine and Geemap, hyperspectral visualization with HyperCoast, high-performance analytics with DuckDB, data processing with GDAL and OGR, dashboards with Voila and Solara, and distributed computing with Apache Sedona. The repository says the examples are organised into folders each corresponding to a chapter, which means the folder names are a chapter index.

Three ways to run the examples, and none of them needs a local install

The point of the exercise environment is that a reader should not have to build a geospatial Python stack to try an example. The README says the examples can be run using MyBinder, Google Colab or Docker, and points to a video tutorial that walks through the process. The Binder and Colab badges at the top are the two hosted options, and both work from a notebook URL with no local setup. That is the single most valuable property of the repository for a beginner, because the dependency list behind these tools is long: a working environment for the later chapters needs DuckDB with its spatial extension, WhiteboxTools, GDAL and OGR bindings, Earth Engine credentials, and a distributed Sedona cluster for the last chapter. A hosted runtime hides all of that, and a local environment would not. The trade is that a hosted runtime has a session limit and gives you no persistent environment, so a reader who wants to work through the chapters seriously will eventually want the Docker route.

Two Docker images, and the difference is Apache Sedona

The Docker route is the one that gives a reader control, and the README offers two images with a meaningful difference. The lightweight one has no Apache Sedona and needs a single port mapping:

bash
docker pull giswqs/pygis:book
docker run -it -p 8888:8888 -v $(pwd):/app/workspace giswqs/pygis:book

@@C1@@The heavier image adds Sedona, and the port list grows accordingly,

bash
docker pull giswqs/pygis:sedona
docker run -it -p 8888:8888 -p 4040:4040 -p 8080:8080 -p 8081:8081 -p 7077:7077 -p 8085:8085 -v $(pwd):/app/workspace giswqs/pygis:sedona

with 4040, 8080, 8081, 7077 and 8085 published alongside 8888, because the distributed stack needs several services rather than one. The mapping of the current directory to /app/workspace is the same in both, and it is what makes the examples see your own data files. Both images come from the giswqs/pygis repository on Docker Hub. The choice is therefore simple to state: use the lighter image unless you are working through the Apache Sedona chapter, and accept that the heavier one starts a cluster you did not ask for otherwise.

The repository also builds its own image, and the Dockerfile shows the shape

There is a Dockerfile in the repository root, and reading it tells you what the example environment is made of. The base image is giswqs/pygis:latest, which is the maintainer's own prepared geospatial image rather than a generic Python one, and the container switches to root for setup before copying the book/ directory into /app/book. The permissions handling is the part worth noting: the notebook user identifiers NB_UID and NB_GID are used to chown the copied files, with a comment explaining that the whole /app directory is made owned by the notebook user so that the workspace is writable. The final command starts Jupyter Lab bound to 0.0.0.0 on port 8888 with --allow-root and --no-browser, and the file ends with the two docker run commands and a buildx line for multi-platform images covering linux/amd64 and linux/arm64. The project is built with MyST configuration through a myst.yml file and a requirements.txt listing ghp-import, jupyter-book, jupytext and pygis.

The videos came from a university course and are still the best walkthrough

The README describes the project as supported by a comprehensive series of video tutorials that walk through key concepts and provide additional examples, and it is explicit that the videos are designed to complement rather than replace the written material. The stated audiences are visual learners, people trying to understand a complex concept through more than one explanation, learners who want to see the development workflow, and people who want to watch how to approach a problem and debug it. The playlist follows the book's structure so you can watch in order or jump to a topic. The origin is given plainly: the videos were created in Fall 2024 while the author was teaching the Introduction to GIS Programming course at the University of Tennessee, and although that course has concluded the videos remain available as a reference, with more planned. The same course site is also where the certification and lab assignment material lives, and the README notes that the course materials and lecture videos are accessible without enrolling.

The book is sold and translated into fifteen languages, while the code is free

One thing to be clear about is the relationship between the repository and the book. The print edition is 556 pages in full colour and is sold on Amazon, and there are PDF and EPUB editions from OpenGeoPub in English plus Chinese, Czech, Dutch, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Portuguese, Russian, Spanish and Turkish, and the repository root carries a PDF table of contents in each of those languages alongside the English one. The book is a separate commercial product and the author publishes it, while the code examples in this repository are released under CC0-1.0, which is the dedication to the public domain and a deliberate choice for material people are expected to copy into their own work. The citation the README asks for names the 2025 edition as independently published with an ISBN. The author is Dr. Qiusheng Wu, an Associate Professor and the Director of Graduate Studies in the Department of Geography, and the project is hosted under the gishub.org domain.

Editorial conclusion

intro-gispro suits a self-taught geospatial programmer who wants worked examples across the whole GeoPandas, Rasterio, Leafmap and DuckDB stack in one place, and who prefers clicking through a notebook to configuring an environment. It does not suit a production project looking for a maintained geospatial library, since the repository is documentation for a specific book and the code is organised around its chapters. Before adopting, decide which runtime you will use, because the lighter and heavier Docker images differ by more than size, and note that the last push to the repository was on 2026-10-12 with v1.1.0 from 2026-04-04 as the newest release under a CC0-1.0 licence.

Frequently asked questions

How do I run the intro-gispro code examples?

The README says they can be run with MyBinder, Google Colab or Docker, with a video tutorial explaining the process. The two Docker images are giswqs/pygis:book for a lightweight setup without Apache Sedona and giswqs/pygis:sedona for the heavier one.

What is the difference between the two intro-gispro Docker images?

The giswqs/pygis:book image is lightweight and has no Apache Sedona, publishing only port 8888. The giswqs/pygis:sedona image adds Apache Sedona and publishes 4040, 8080, 8081, 7077 and 8085 in addition to 8888, because the distributed stack runs several services.

Which geospatial libraries do the intro-gispro examples use?

The table of contents lists GeoPandas for vector data, Rasterio for raster data, Xarray for multi-dimensional data, Rioxarray for raster analysis, Leafmap for interactive visualization, WhiteboxTools for geoprocessing, MapLibre for 3D mapping, Earth Engine and Geemap for cloud computing, HyperCoast for hyperspectral visualization, DuckDB for high-performance analytics, GDAL and OGR for data processing, Voila and Solara for dashboards, and Apache Sedona for distributed computing.

Can I use the intro-gispro examples without buying the book?

Yes. The repository contains all the code examples featured in the book, and the README says they can be run through MyBinder, Google Colab or Docker. The book itself is sold separately in print and as PDF and EPUB, and the code examples are under the CC0-1.0 licence.

Is there a course that uses the intro-gispro material?

The README says the video tutorials were created in Fall 2024 while the author was teaching the Introduction to GIS Programming course at the University of Tennessee, and that although the course has concluded the videos remain available as a reference. The course materials and lecture videos are accessible without enrolling, and the repository links the course site for lab assignments and certification.

Official sources

  1. giswqs/intro-gispro on GitHub
  2. License: CC0-1.0
  3. Project website
  4. README
  5. Releases
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.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/giswqs-intro-gispro.svg)](https://hysenlabs.com/projects/giswqs-intro-gispro)

Was this useful?