{"id":308108,"name":"Open Source Geoprocessing Tutorial","description":"Tutorial of fundamental remote sensing and GIS methodologies using open source software in python.","url":"https://github.com/patrickcgray/open-geo-tutorial","last_synced_at":"2026-04-07T13:00:32.899Z","repository":{"id":44699514,"uuid":"162456789","full_name":"patrickcgray/open-geo-tutorial","owner":"patrickcgray","description":"Tutorial of fundamental remote sensing and GIS methodologies using open source software in python","archived":false,"fork":true,"pushed_at":"2022-05-24T20:17:06.000Z","size":368158,"stargazers_count":330,"open_issues_count":0,"forks_count":126,"subscribers_count":19,"default_branch":"master","last_synced_at":"2026-03-18T16:59:06.123Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"ceholden/open-geo-tutorial","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/patrickcgray.png","metadata":{},"created_at":"2018-12-19T15:31:13.000Z","updated_at":"2026-03-05T10:16:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/patrickcgray/open-geo-tutorial","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/patrickcgray/open-geo-tutorial","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patrickcgray","download_url":"https://codeload.github.com/patrickcgray/open-geo-tutorial/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30812083,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-22T01:53:25.184Z","status":"online","status_checked_at":"2026-03-22T02:00:07.565Z","response_time":85,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":"patrickcgray","name":"Patrick Gray","uuid":"2497349","kind":"user","description":"Remote Sensing, Comp Sci, and Marine Science.\r\n\r\nPostdoc at University of Maine and University of Haifa. ","email":"","website":"http://patrickgray.me/","location":null,"twitter":"clifgray","company":null,"icon_url":"https://avatars.githubusercontent.com/u/2497349?u=85b1b2f06c0743de946e25794ec32071e9658697\u0026v=4","repositories_count":47,"last_synced_at":"2023-08-02T13:21:31.284Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/patrickcgray","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-05T20:25:35.009Z","updated_at":"2023-08-02T13:21:31.396Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patrickcgray","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patrickcgray/repositories"},"packages":[],"commits":{"id":8350689,"full_name":"patrickcgray/open-geo-tutorial","default_branch":"master","total_commits":142,"total_committers":7,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":20.285714285714285,"dds":0.528169014084507,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-04-05T12:01:45.598Z","last_synced_commit":"e443c963610efe924697eaf723215964da90d74e","created_at":"2025-01-20T12:59:40.185Z","updated_at":"2026-04-05T12:01:31.407Z","committers":[{"name":"Chris Holden","email":"ceholden@gmail.com","login":"ceholden","count":67},{"name":"Patrick Gray","email":"pgrayobx@gmail.com","login":"patrickcgray","count":64},{"name":"Claude COULOMBE","email":"claude.coulombe@gmail.com","login":"ClaudeCoulombe","count":5},{"name":"Pal Szabo","email":"szabopal96@gmail.com","login":"zabop","count":3},{"name":"Matthias Steinböck","email":"grillen@abendstille.at","login":"gruzilla","count":1},{"name":"James Scott-Brown","email":"james@jamesscottbrown.com","login":"jamesscottbrown","count":1},{"name":"Chris Edward Holden","email":"ceholden@geo.bu.edu","login":null,"count":1}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-07T00:00:11.408Z","repositories_count":6211357,"commits_count":918202048,"contributors_count":35614605,"owners_count":1142620,"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":"patrickcgray/open-geo-tutorial","html_url":"https://github.com/patrickcgray/open-geo-tutorial","last_synced_at":"2026-04-03T11:03:52.372Z","status":"error","issues_count":0,"pull_requests_count":4,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":445941.0,"issues_closed_count":0,"pull_requests_closed_count":4,"pull_request_authors_count":4,"issue_authors_count":0,"avg_comments_per_issue":null,"avg_comments_per_pull_request":0.5,"merged_pull_requests_count":4,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2025-01-20T12:59:40.579Z","updated_at":"2026-04-03T11:03:52.372Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickcgray%2Fopen-geo-tutorial/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{},"pull_request_author_associations_count":{"NONE":4},"issue_authors":{},"pull_request_authors":{"zabop":1,"ClaudeCoulombe":1,"jamesscottbrown":1,"gruzilla":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-07T00:00:09.463Z","repositories_count":14125314,"issues_count":34512336,"pull_requests_count":112714685,"authors_count":11228632,"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":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{},"past_year_pull_request_authors":{},"maintainers":[],"active_maintainers":[]},"events":{"total":{"ForkEvent":1,"WatchEvent":9},"last_year":{"ForkEvent":1,"WatchEvent":3}},"keywords":[],"dependencies":[],"score":7.745002803515839,"created_at":"2025-01-20T12:59:39.207Z","updated_at":"2026-04-07T13:00:32.900Z","avatar_url":"https://github.com/patrickcgray.png","language":"Jupyter Notebook","category":"Sustainable Development","sub_category":"Education","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"Open Source Geoprocessing Tutorial\n==================================\n\n\u003ca rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\"\u003e\n\u003cimg\n    alt=\"Creative Commons License\"\n    style=\"border-width:0\"\n    src=\"https://i.creativecommons.org/l/by-sa/4.0/80x15.png\" /\u003e\n\u003c/a\u003e\u003cbr /\u003e\n\u003cspan xmlns:dct=\"http://purl.org/dc/terms/\" property=\"dct:title\"\u003e\u003c/a\u003e\n\nTutorial of basic remote sensing and GIS methodologies using modern open source\nsoftware in Python (`rasterio`, `shapely`, `geopandas`, `folium`, etc). Notebooks cover raster processing, vector analysis, cloud-based tools like Google Earth Engine, a workflow to perform image classification using machine learning classifiers in `scikit-learn`, and an introduction to handling large array datasets with `xarray`:\n\nThis repo can be run entirely in the cloud with no manual setup via Binder by clicking this badge: \n\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/patrickcgray/open-geo-tutorial/master?urlpath=git-pull%3Frepo%3Dhttps%253A%252F%252Fgithub.com%252Fpatrickcgray%252Fopen-geo-tutorial%26urlpath%3Dlab%252Ftree%252Fopen-geo-tutorial%252F%26branch%3Dmaster)\n\n*** once in a blue moon launching via Binder fails either for lack of resources or due to a network error, but typically if you re-click the link it will launch correctly.\n\n# Repo Structure \n\nAll chapters are available as jupyter notebooks in the `notebooks/` directory or viewable via a normal web browser in HTML:\n\n0. Introduction\n   [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_0_introduction.html)]\n1. The GDAL datatypes and objects\n   [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_1_rasterio.html)]\n2. Your first vegetation index\n   [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_2_indices.html)]\n3. Visualizing data\n   [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_3_visualization.html)]\n4. Vector data - the OGR library\n   [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_4_vector.html)]\n5. Land cover classification\n   [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_5_classification.html)]\n6. Deep Learning for land cover classification [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_6_neural_networks.html)] built to run in [Google Colab](https://colab.research.google.com/github/patrickcgray/open-geo-tutorial/blob/master/notebooks/chapter_6_neural_networks.ipynb).\n\n7. Earth Engine for Oceanographic Time Series Analysis [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_7_earth_engine_oceanography.html)]\n8. Xarray for handling N-dimensional arrays and advanced visualization with hvplot  [[HTML](http://patrickgray.me/open-geo-tutorial/chapter_8_xarray_netcdfs.html)]\n\nI strongly recommend using Binder and interactively playing with these notebooks. As an alternative, or if you want to work more extensively with these labs or use them as a template for your own work, you can easily git clone the whole repo and use the included Dockerfile to set up your environment.\n\n### Some of the things you'll learn:\n\n#### Raster Operations, Processing, and Visualization\n\u003cimg src=\"data/raster_viz.png\" width=\"500\"\u003e\n\n#### Interactive Shapefile and Raster Visualization\n \u003cimg src=\"data/folium_exp.png\" width=\"500\"\u003e\n\n#### Machine Learning based Satellite Image Classification\n\u003cimg src=\"data/ml_exp.png\" width=\"750\"\u003e\n\n#### Dealing with large datasets and interactive analysis\n\u003cimg src=\"data/chla_xarray.png\" width=\"650\"\u003e\n\n# Setup\n\n## On Binder\nAs mentioned above, this repo can be run entirely in the cloud with no manual setup via Binder by clicking this badge and this is what we strongly recommend for beginner users: \n\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/patrickcgray/open-geo-tutorial/master?urlpath=git-pull%3Frepo%3Dhttps%253A%252F%252Fgithub.com%252Fpatrickcgray%252Fopen-geo-tutorial%26urlpath%3Dlab%252Ftree%252Fopen-geo-tutorial%252F%26branch%3Dmaster)\n\n## Locally\n\n### Download\n\nMaterials for these lessons are included inside this repository under\nthe `notebooks/` directory. If you're not running in Binder I would recommend downloading all of the lesson material\nat once, instead of downloading individual files.\n\n* Use `git clone https://github.com/patrickcgray/open-geo-tutorial.git` to clone the repository\n    * [More Instructions](https://help.github.com/articles/cloning-a-repository/)\n\n### Python Installation\n\nTo run the Jupyter Notebooks (formerly known as IPython Notebooks) and follow the tutorial locally, you will need to install Python and the libraries used in the tutorials. This installation can be accomplished in many ways, but I recommend Docker:\n\n#### Docker\n\nI highly recommend trying out [Docker](https://docs.docker.com/get-started/) if you're not familiar with it. There is a bit of a startup time just for getting up to speed but it is the way to go for reproducible work and cloud deployable workflows. Docker provides operating-system-level virtualization, also known as \"containerization\" and thus you can be sure that your setup precisely replicates the one used here and will easily run everything. Once you've downloaded Docker you can simply cd into the cloned git repo and run: \n\n`docker run -it --rm -p 8888:8888 -v \u003cpath to repo\u003e:/home/jovyan/repo/ pangeo/pangeo-notebook:2021.05.15 jupyter lab --ip 0.0.0.0`\n\nThis will download the Docker image that is needed to run this whole repo and then it will start up a Jupyter Lab instance that you can access by clicking the link in the terminal. Just change `\u003cpath to repo\u003e` to the appropriate path and you'll be good to go!\n\n# Thanks\n\nThis series is modified from an [excellent tutorial series](https://github.com/ceholden/open-geo-tutorial) put together by [@ceholden](https://github.com/ceholden/) teaching open source geospatial tools with `GDAL`/`OGR`/`OSR` directly which I have modified to use more pythonic libraries and expanded with more material. A big thanks for Chris for building the foundation for this series!\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["ecology"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/308108","html_url":"https://ost.ecosyste.ms/projects/308108"}