{"id":351644,"name":"Introduction to GIS Programming","description":"Introduction to GIS Programming: A Practical Python Guide to Open Source Geospatial Tool.","url":"https://github.com/giswqs/intro-gispro","last_synced_at":"2026-05-13T14:00:37.527Z","repository":{"id":297302079,"uuid":"996238514","full_name":"giswqs/intro-gispro","owner":"giswqs","description":"Code examples for the book titled Introduction to GIS Programming","archived":false,"fork":false,"pushed_at":"2026-05-06T15:35:20.000Z","size":20683,"stargazers_count":540,"open_issues_count":1,"forks_count":188,"subscribers_count":17,"default_branch":"main","last_synced_at":"2026-05-09T12:03:46.770Z","etag":null,"topics":["geopython","geospatial","jupyter","mapping","python"],"latest_commit_sha":null,"homepage":"https://gispro.gishub.org","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/giswqs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-04T16:53:24.000Z","updated_at":"2026-05-08T14:14:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"bcb1da91-4544-4219-8adc-d90683aa1743","html_url":"https://github.com/giswqs/intro-gispro","commit_stats":null,"previous_names":["giswqs/intro-gispro"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/giswqs/intro-gispro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/giswqs","download_url":"https://codeload.github.com/giswqs/intro-gispro/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32985763,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"ssl_error","status_checked_at":"2026-05-13T13:14:51.610Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"giswqs","name":"Qiusheng Wu","uuid":"5016453","kind":"user","description":"Associate Professor at the University of Tennessee, Knoxville | Amazon Scholar","email":"qwu18@utk.edu","website":"https://gishub.org","location":"Knoxville, TN","twitter":"giswqs","company":"University of Tennessee","icon_url":"https://avatars.githubusercontent.com/u/5016453?u=ccdf45d5c7a05a6b096b8b622b2d99ae046d37ac\u0026v=4","repositories_count":319,"last_synced_at":"2025-11-07T14:37:13.299Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/giswqs","funding_links":["https://github.com/sponsors/giswqs"],"total_stars":5207,"followers":7187,"following":178,"created_at":"2022-11-12T23:39:05.279Z","updated_at":"2025-11-07T14:37:13.300Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/giswqs","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/giswqs/repositories"},"packages":[],"commits":{"id":10223483,"full_name":"giswqs/intro-gispro","default_branch":"master","total_commits":92,"total_committers":5,"total_bot_commits":14,"total_bot_committers":2,"mean_commits":18.4,"dds":0.17391304347826086,"past_year_total_commits":92,"past_year_total_committers":5,"past_year_total_bot_commits":14,"past_year_total_bot_committers":2,"past_year_mean_commits":18.4,"past_year_dds":0.17391304347826086,"last_synced_at":"2026-05-11T13:01:16.366Z","last_synced_commit":"d0476f2f49f6c857961d639e7959c5c3d837c59c","created_at":"2025-06-07T15:06:22.477Z","updated_at":"2026-05-11T13:01:08.570Z","committers":[{"name":"Qiusheng Wu","email":"giswqs@gmail.com","login":"giswqs","count":76},{"name":"pre-commit-ci[bot]","email":"66853113+pre-commit-ci[bot]","login":"pre-commit-ci[bot]","count":7},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":7},{"name":"yopamungkass","email":"73714366+yopamungkass","login":"yopamungkass","count":1},{"name":"Florian Neukirchen","email":"99167742+florianneukirchen","login":"florianneukirchen","count":1}],"past_year_committers":[{"name":"Qiusheng Wu","email":"giswqs@gmail.com","login":"giswqs","count":76},{"name":"pre-commit-ci[bot]","email":"66853113+pre-commit-ci[bot]","login":"pre-commit-ci[bot]","count":7},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":7},{"name":"yopamungkass","email":"73714366+yopamungkass","login":"yopamungkass","count":1},{"name":"Florian Neukirchen","email":"99167742+florianneukirchen","login":"florianneukirchen","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-13T00:00:10.629Z","repositories_count":6233197,"commits_count":894053425,"contributors_count":34887502,"owners_count":1152152,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"giswqs/intro-gispro","html_url":"https://github.com/giswqs/intro-gispro","last_synced_at":"2026-05-09T12:01:58.458Z","status":"active","issues_count":6,"pull_requests_count":29,"avg_time_to_close_issue":99376.66666666667,"avg_time_to_close_pull_request":237799.65217391305,"issues_closed_count":3,"pull_requests_closed_count":23,"pull_request_authors_count":5,"issue_authors_count":5,"avg_comments_per_issue":0.5,"avg_comments_per_pull_request":0.5517241379310345,"merged_pull_requests_count":21,"bot_issues_count":0,"bot_pull_requests_count":4,"past_year_issues_count":6,"past_year_pull_requests_count":29,"past_year_avg_time_to_close_issue":99376.66666666667,"past_year_avg_time_to_close_pull_request":237799.65217391305,"past_year_issues_closed_count":3,"past_year_pull_requests_closed_count":23,"past_year_pull_request_authors_count":5,"past_year_issue_authors_count":5,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.5517241379310345,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":4,"past_year_merged_pull_requests_count":21,"created_at":"2025-06-07T15:06:24.798Z","updated_at":"2026-05-09T12:01:58.458Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/giswqs%2Fintro-gispro/issues","issue_labels_count":{},"pull_request_labels_count":{"github_actions":2,"dependencies":2},"issue_author_associations_count":{"NONE":6},"pull_request_author_associations_count":{"OWNER":23,"NONE":3,"CONTRIBUTOR":3},"issue_authors":{"dulcetberg":2,"MuhammadMehdi5":1,"EmiliyaHrabova":1,"maxklr":1,"malhessi":1},"pull_request_authors":{"giswqs":23,"pre-commit-ci[bot]":2,"dependabot[bot]":2,"Tsimbazaza":1,"florianneukirchen":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-11T00:00:23.633Z","repositories_count":14566783,"issues_count":34184769,"pull_requests_count":111990968,"authors_count":11258968,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{"dependencies":2,"github_actions":2},"past_year_issue_author_associations_count":{"NONE":6},"past_year_pull_request_author_associations_count":{"OWNER":23,"CONTRIBUTOR":3,"NONE":3},"past_year_issue_authors":{"dulcetberg":2,"EmiliyaHrabova":1,"malhessi":1,"maxklr":1,"MuhammadMehdi5":1},"past_year_pull_request_authors":{"giswqs":23,"dependabot[bot]":2,"pre-commit-ci[bot]":2,"florianneukirchen":1,"Tsimbazaza":1},"maintainers":[{"login":"giswqs","count":23,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/giswqs"}],"active_maintainers":[{"login":"giswqs","count":23,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/giswqs"}]},"events":{"total":{"ReleaseEvent":2,"DeleteEvent":33,"PullRequestEvent":50,"ForkEvent":74,"DiscussionEvent":2,"IssuesEvent":17,"WatchEvent":298,"IssueCommentEvent":28,"PushEvent":102,"CreateEvent":37},"last_year":{"ReleaseEvent":2,"DeleteEvent":33,"PullRequestEvent":50,"ForkEvent":74,"DiscussionEvent":2,"IssuesEvent":17,"WatchEvent":298,"IssueCommentEvent":28,"PushEvent":102,"CreateEvent":37}},"keywords":["geopython","geospatial","jupyter","mapping","python"],"dependencies":[],"score":7.902857191280582,"created_at":"2026-04-14T00:23:45.435Z","updated_at":"2026-05-13T14:00:37.551Z","avatar_url":"https://github.com/giswqs.png","language":"Jupyter Notebook","category":"Sustainable Development","sub_category":"Education","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# Introduction to GIS Programming\n\n[![image](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/giswqs/intro-gispro/HEAD)\n[![image](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/giswqs/intro-gispro/blob/main)\n[![Docker Image](https://img.shields.io/badge/docker-giswqs%2Fpygis%3Abook-blue?logo=docker)](https://hub.docker.com/r/giswqs/pygis/tags)\n[![Amazon](https://img.shields.io/badge/Buy%20on-Amazon-orange?logo=amazon\u0026logoColor=white)](https://amazon.com/dp/B0FFW34LL3)\n[![YouTube](https://img.shields.io/badge/Watch-Video-red?logo=youtube\u0026logoColor=white)](https://www.youtube.com/playlist?list=PLAxJ4-o7ZoPfb18kNe2luWX9xKg1233i9)\n\n## Introduction\n\nWelcome to the official repository for **_Introduction to GIS Programming: A Practical Python Guide to Open Source Geospatial Tools_**. This repository contains all the code examples featured in the book, designed to help you learn and apply Python for geospatial analysis using open-source tools.\n\n## Get the Book\n\n### Print Edition\n\n- 🇺🇸 English Full-Color Print Edition (556 pages) is available on Amazon ([link](https://amazon.com/dp/B0FFW34LL3))\n\n### PDF and EPUB Editions\n\n🇺🇸 [English](https://leanpub.com/gispro) | 🇨🇳 [Chinese](https://leanpub.com/gispro-zh) | 🇯🇵 [Japanese](https://leanpub.com/gispro-ja) | 🇰🇷 [Korean](https://leanpub.com/gispro-ko) | 🇲🇽 [Spanish](https://leanpub.com/gispro-es) | 🇫🇷 [French](https://leanpub.com/gispro-fr) | 🇵🇹 [Portuguese](https://leanpub.com/gispro-pt) | 🇮🇩 [Indonesian](https://leanpub.com/gispro-id) | 🇩🇪 [German](https://leanpub.com/gispro-de) | 🇷🇺 [Russian](https://leanpub.com/gispro-ru) | 🇮🇹 [Italian](https://leanpub.com/gispro-it) | 🇨🇿 [Czech](https://leanpub.com/gispro-cs)\n\n## Cite the Book\n\nIf you use this book in your research or teaching, please consider citing it as follows:\n\n\u003e Wu, Q. (2025). _Introduction to GIS Programming: A Practical Python Guide to Open Source Geospatial Tools_. Independently published. ISBN 979-8286979455. \u003chttps://amazon.com/dp/B0FFW34LL3\u003e\n\n![book cover](https://assets.gishub.org/images/gispro-book-cover.png)\n\n## Table of Contents\n\nTo download a PDF version of the Table of Contents, please visit \u003chttps://gispro.gishub.org/book-toc.pdf\u003e.\n\n- **Preface**\n\n  - Introduction\n  - Who This Book Is For\n  - What This Book Covers\n  - Getting the Most Out of This Book\n  - Conventions Used in This Book\n  - Downloading the Code Examples\n  - Video Tutorials\n  - Get in Touch\n  - Acknowledgments\n  - About the Author\n  - Licensing and Copyright\n\n- **Software Setup**\n\n  - Overview of Software Tools\n  - Introduction to Python Package Management\n  - Setting Up Visual Studio Code\n  - Version Control with Git\n  - Using Google Colab\n  - Working with JupyterLab\n  - Using Docker\n\n- **Python Programming Fundamentals**\n\n  - Variables and Data Types\n  - Python Data Structures\n  - String Operations\n  - Loops and Conditional Statements\n  - Functions and Classes\n  - Working with Files\n  - Data Analysis with NumPy and Pandas\n\n- **Geospatial Programming with Python**\n  - Introduction to Geospatial Python\n  - Vector Data Analysis with GeoPandas\n  - Working with Raster Data using Rasterio\n  - Multi-dimensional Data Analysis with Xarray\n  - Raster Analysis with Rioxarray\n  - Interactive Visualization with Leafmap\n  - Geoprocessing with WhiteboxTools\n  - 3D Mapping with MapLibre\n  - Cloud Computing with Earth Engine and Geemap\n  - Hyperspectral Data Visualization with HyperCoast\n  - High-Performance Geospatial Analytics with DuckDB\n  - Geospatial Data Processing with GDAL and OGR\n  - Building Interactive Dashboards with Voila and Solara\n  - Distributed Computing with Apache Sedona\n\n## How to Run Code Examples\n\nThe code examples are organized into folders, each corresponding to a chapter in the book. The code examples are written in Python and can be run using MyBinder, Google Colab, or Docker. Follow this [video tutorial](https://www.youtube.com/embed/6GwMoV4LOiU) to learn how to run the code examples.\n\n### Using MyBinder\n\nThe code examples can be run using MyBinder.\n\n[![image](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/giswqs/intro-gispro/HEAD)\n\n### Using Google Colab\n\nThe code examples can be run using Google Colab.\n\n[![image](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/giswqs/intro-gispro/blob/main)\n\n### Using Docker\n\nThe code examples can be run using Docker. There are two Docker [images](https://hub.docker.com/r/giswqs/pygis/tags) available:\n\nA lightweight docker image without Apache Sedona:\n\n```bash\ndocker pull giswqs/pygis:book\ndocker run -it -p 8888:8888 -v $(pwd):/app/workspace giswqs/pygis:book\n```\n\nA docker image with Apache Sedona:\n\n```bash\ndocker pull giswqs/pygis:sedona\ndocker 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\n```\n\n## Video Tutorials\n\nComplementing the written content, this book is supported by a comprehensive series of video tutorials that walk through key concepts and provide additional examples:\n\n**https://tinyurl.com/intro-gispro-videos**\n\nThe videos are designed to complement, not replace, the written material. They're particularly helpful for:\n\n- Visual learners who benefit from seeing code being written and executed\n- Understanding complex concepts through multiple explanations\n- Learning about the development workflow and best practices\n- Seeing how to approach problems and debug issues\n\nThe playlist is organized to follow the book's structure. You can watch them in order as you progress through the book, or jump to specific topics as needed.\n\nThe videos were created in Fall 2024 when I was teaching the [**Introduction to GIS Programming**](https://geog-312.gishub.org) course at the University of Tennessee. Although the course has concluded, the videos remain relevant and can be used as a reference for the book. Additional videos will be added in the future.\n\n## Enroll for Certification\n\nPlease note that you can access the [course materials](https://geog-312.gishub.org) and [lecture videos](https://tinyurl.com/intro-gispro-videos) on the course website without enrolling in the course. However, if you're interested in submitting lab assignments, receiving grades, and earning a certificate of completion, you can enroll in the course at any time by clicking the link below. There is no deadline for enrollment, and you can complete the course at your own pace.\n\n[Enroll Now](https://tiny.utk.edu/intro-gis-programming)\n\n## About the Author\n\nDr. Qiusheng Wu is an Associate Professor and the Director of Graduate Studies in the Department of Geography \u0026 Sustainability at the University of Tennessee, Knoxville. He also serves as an Amazon Scholar. Dr. Wu's research focuses on geospatial data science and open-source software development, with an emphasis on leveraging big geospatial data and cloud computing to study environmental change, particularly surface water and wetland inundation dynamics. He is the creator of several widely used open-source Python packages, including [geemap](https://geemap.org), [leafmap](https://leafmap.org), [segment-geospatial](https://samgeo.gishub.org), and [geoai](https://opengeoai.org), which support advanced geospatial analysis and interactive visualization. His open-source work is available at the [Open Geospatial Solutions](https://github.com/opengeos) on GitHub.\n\n## Acknowledgments\n\nThis book was written using [MyST Markdown](https://mystmd.org) and compiled using [Typst](https://github.com/typst/typst) with the [min-book](https://github.com/mayconfmelo/min-book) template. Credits to developers and maintainers of the Typst and MyST Markdown projects. Special thanks to [@mayconfmelo](https://github.com/mayconfmelo) for the [min-book](https://github.com/mayconfmelo/min-book) template and their help with customizing the template for this book.\n\n## Licensing and Copyright\n\nThis book embraces the principles of open science and open education. To support transparency, learning, and reuse, the **code examples** in this book are released under a [Creative Commons Attribution 4.0 International (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/) license. This means you are free to copy, modify, and distribute the code, even for commercial purposes, as long as appropriate credit is given.\n\nPlease attribute code usage by citing the book or linking to the GitHub repository:\n\n\u003e Wu, Q. (2025). _Introduction to GIS Programming: A Practical Python Guide to Open Source Geospatial Tools_. Independently published. ISBN 979-8286979455. \u003chttps://amazon.com/dp/B0FFW34LL3\u003e\n\nWhile the code is freely available, the **text, figures, and images** in this book are **copyrighted** by the author and may not be reproduced, redistributed, or modified without explicit permission. This includes all written content, custom diagrams, and embedded visualizations unless otherwise noted.\n\nIf you wish to reuse or adapt any non-code material from the book—for example, for teaching, presentations, or publications—please contact the author to request permission.\n\nThis dual licensing approach helps balance open access to learning materials with the protection of original creative work. Thank you for respecting these terms and supporting the open-source geospatial community.\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/351644","html_url":"https://ost.ecosyste.ms/projects/351644"}