About These Notes

Every live class at Spatial Thoughts has a running set of notes: answers to participants’ questions, tutorials and tools that came up in the discussion, datasets, and pointers for going further. This page collects those notes from all past cohorts of our courses in one place, so every participant can benefit from the questions asked in every class.

The notes are organized by course and then by topic. Within each topic, the resources that came up in the most classes are listed first. Each link was checked when the page was last updated. If you find a broken link, please let us know in the comments below.

New notes are added here after each class ends.

Last updated: September 26, 2026

Introduction to QGIS

Course material: Introduction to QGIS

Learning Resources and Community

Cartography and Styling

Projections and Coordinate Systems

  • What UTM Zone am I in? [mangomap]
  • Convert between Orthometric and Ellipsoidal Elevations using GDAL - [Blog]
  • The Equal Earth Projection [equal-earth.com]
  • Create globe projection views in QGIS [Video]
  • India NSF LCC Projection [epsg.io]
  • UN Adopts Equal Earth as the official map projection [News Article]

Digitizing, Editing and Field Data Collection

Spatial Analysis

  • Fuzzy Table Joins in QGIS [Blog]
  • QGIS for Urban and Regional Planning [Blog]
    • Analyzing Street Intersection Density for Walkability [Tutorial]
    • Analyzing Urban Form using Momepy [Video]
  • QGIS Network Analysis [Video]
  • Calculating Areal Mean Rainfall [Tutorial]
  • Service Area Analysis using Openrouteservice [Tutorial]
  • Using ‘Execute SQL’ tool to run SQL queries against vector layers. [Tutorial]
  • How to visualize sum of line lengths for each district
  • Unpivot GIS data [GitHub]
  • Creating heatmap [Tutorial]
  • Tutorials for raster analysis
    • Basic raster styling and analysis [Tutorial]
    • Raster mosaicing and clipping [Tutorial]
  • A website showing population around a point anywhere in world (using global human settlement layer) - [tomforth.co.uk]
  • Building density map using GEE [LinkedIn]
  • Calculating weighted centroid [Blog]
  • GPS track exercise [Course Material]
  • Mapping Tourism Sites in Black Forest National Park
    • Extract OSM boundary boundary="national park"
    • Extract Tourism location tourism="all"
    • Use Mask Plugin [aeag.github.io]
    • Add Popularity Data from Google Maps [Notebook]
    • Reference website for maps and data [black-forest-travel.com]
  • Performing spatial joins [Tutorial]
  • Pole of inaccessibility [post][mapbox article]
  • QGIS for Aeronautical Applications. [QGIS posts] by Antonio Locandro
  • QGIS for conservation [Habitat Analysis]
  • Seagrass Monitoring
    • How to monitor seagrass using Satellite Imagery [Paper1] [Paper2]
    • Global distribution of Seagrasses [dataset]
  • Spatial Index concept [Video]
  • Tutorial covering square buffer [Tutorial]

Automation and Next Steps

Data Sources

Advanced QGIS

Course material: Advanced QGIS

Learning Resources and Community

Expressions

  • Regular Expressions [Cheatsheet]
  • QGIS expressions
    • Video tutorial by Nyall Dawson – [Video]
    • Introduction to Expressions - QGIS Documentation [QGIS Docs]
  • QGIS Expressions [Course Material]
  • Geometry Generators in QGIS
    • Fuzzing point location translate(@geometry, randf(0, 0.001), randf(0, 0.001))
    • Geometry Generator Style Hacks [Video]
    • Move Alaska and Hawaii for Mapping [Video]
  • Spatial Homogeneity Testing of Raingauge Data with Advanced QGIS Expressions [Blog]
  • Coding in field calculator - List of functions [QGIS Docs]
  • Concatenate [GIS StackExchange]
  • Deprecation of $ functions:
    • There are several functions of the form$geometry,$idfor obtaining attributes of the current feature. Since QGIS 3.28, they have been deprecated in favor of the ,@id**etc. [changelog]
    • Instead of $area, you can use expression functions area(@geometry)
  • Extract hollow buildings.
    • Use ‘Extract by Expression’ with expression num_interior_rings($geometry) > 0
    • Polygons and Rings Explanation [esri.github.io]
  • Find Neighbor Polygons using Summary Aggregate Function in QGIS [blog]
  • Fun with QGIS Expression [Tutorials][Talk]
  • Geometry generator examples [Video]
  • QGIS Aggregate Function [Articles]
  • QGIS Expression [Blog]
  • QGIS Expression [Blog]
  • QGIS expression Video by Nyall Dawson [Video]
  • QGIS Expressions - Documentation [QGIS Docs]
  • Qgis Expressions [Video]
  • Regular expressions cheatsheet [ihateregex.io]
  • Setting line width based on visible features [expression]
  • Symbology with Expressions
    • Styling a River Network with Expressions [Tutorial]
    • Styling Contours in 3D [Tutorial]

Cartography and Map Design

Animation and Temporal Data

Processing, Models and Automation

  • QGIS Actions Deep Dive ⁣ [Video]
  • Rendering Print Layouts from QGIS Models [Blog]
  • Running QGIS Processing Tools on the Command Line with qgis_process [Blog]
  • Snapping GPS tracks to Roads using PyQGIS and OSRM [Blog]
  • Unpivot GIS data [GitHub]
  • Daily automation of workflow [Course Material]
  • Run Jupyter notebook with PyQGIS [GitHub Gist]
  • Using “Calculate by Expression” Autofill in Batch Processing [Video]
  • Attribute Iterator Python Script: Use this script to create attribute indices on all attributes of a layer. Download and add it to your toolbox using Scripts -> Add Script To Toolbox. [GitHub]
  • Automation in QGIS [Video]
  • Creating QGIS Models with Optional Inputs and Conditional Processing [Blog]
  • Do Processing Tools always create a new layer?
    • [exception] You can enable “In-Place Editing” to edit existing layer instead of a new layer. Only a subset of algorithms support this mode. [Course Material]
    • [exception] Certain tools execute a command to a data connection, i.e. PostgreSQL execute SQL
    • [exception] Certain tools update missing information to a layer, i.e. Add Spatial Index, Update layer metadata etc.
  • Extra Materials on Modeler
    • Automating GIS Workflows using QGIS [Video]
    • Split Polygons into Equal Parts using QGIS [Blog]
    • Spatial Homogeneity Testing of Raingauge Data with Advanced QGIS Expressions [Blog]
    • Calculating Weighted Centroids [Blog]
  • Extracting Data from web pages using Python/Pandas [GitHub]
  • Get the index/text of an Enum inputs in Models? [QGIS Feature Request]
  • Iterate function in QGIS [QGIS Docs]
    • Python Console Script to Rename Layers [GitHub]
  • Processing in Web Client (video) [media.ccc.de], website
  • Python script to rename layers after ‘Iterate’ batch processing [GitHub]
  • QGIS Processing Feature Requests [Crowdfund 2021 Ideas]
  • QGIS processing model from Brett [GitHub]
  • QGIS version for caching steps in the model designer
    • Run Selected Steps option added in QGIS 3.38 [changelog]
  • Road length model [Course Material]
  • Run models from command line [GitHub]
  • Run QGIS processing algorithms from the command line - [bnhr.xyz]
  • Split a layer and group into different folders
    • QGIS Processing Toolbox - Split vector layer algorithm
    • PyQGIS Scripting [GitHub]
  • Sum Line Lengths algorithm [GitHub]
  • USE TEMPORARY_OUTPUT as the output in batch processing [GIS StackExchange]
  • Using “Calculate by Expression” in Batch Processing [Video]
  • Workflow Automation with QGIS: Case Studies and Tips [FOSS44G Talk]

Spatial Analysis Techniques

  • Fuzzy Table Joins in QGIS [Blog]
  • QGIS for Urban and Regional Planning [Blog]
    • Analyzing Street Intersection Density for Walkability [Tutorial]
    • Analyzing Urban Form using Momepy [Video]
  • QGIS Network Analysis [Video]
  • Calculating Areal Mean Rainfall [Tutorial]
  • Modifiable areal unit problem [Wikipedia]
  • Service Area Analysis using Openrouteservice [Tutorial]
  • Uber Travel Time Prediction [nbviewer.jupyter.org] [GitHub]
  • Using ‘Execute SQL’ tool to run SQL queries against vector layers. [Tutorial]
  • Approximating Geodesic Buffers with PyQGIS [blog]
  • Deforestation Monitoring [LandTrendr]
  • How to visualize sum of line lengths for each district
  • Interpolating point data [Tutorial]
  • Calculating shared border lengths [Blog]
  • Creating heatmap [Tutorial]
  • Fix Topological and Geometry Errors using QGIS and Mapshaper [Video]
  • Mapping Crime: Understanding Hotspots [manual]
    • Locating A New Bicycle Parking Station using Multicriteria Overlay Analysis in QGIS [Video]
  • Advanced Spatial Indexing [Slides]
  • Clustering Algorithms [towardsdatascience.com]
  • Connect Buildings to Nearest Point on the Road - Spatial Analysis challenge. [Video]
  • Create Attribute Index [QGIS Docs]
  • Dasymetric Mapping [GRASS] [PySAL]
  • Detecting Fish in Ocean with Remote Sensing - [coursework]
  • Fuzzy Table Joins in QGIS [Blog].
  • Geo-statistical operations using python [Spatial autocorrelation]
  • GeoCoding - New Built-in Geocoder in QGIS 3.18+ [qgis.org]
  • GeoDA [geodacenter.github.io] [Videos]
  • Geometry checker & pseudo nodes. [Topology Rules Poster PDF]
    • Solution 1: Collect Geometries -> Merge Lines
    • Solution 2: Dissolve Geometries -> Multipart to Singleparts -> Join Attributes by Location
    • Reference Tutorial [Tutorial]
  • Google S2 vs Uber H3 Geometry [s2geometry.io]
  • Heatmap (Kernel density estimation) [QGIS Docs]
  • Interpolating Point Data [Tutorial]
  • Isochrones [Wikipedia]
  • K-Means clustering [Blog]
  • Locating A New Bicycle Parking Station using Multicriteria Overlay Analysis [Video]
  • Merge vs Dissolve [GIS StackExchange]
  • Monitoring Settlements Growth using Dynamic World data (2017-onwards) [Course Material]
  • Multi Criteria Overlay Analysis [Tutorial]
  • QGIS (Network analysis) with Ujaval Gandhi [Video]
  • QGIS Network Analysis with Ujaval Gandhi [Video]
  • Raster Joins: Raster Sampling and Zonal Statistics [Video]
  • Similarity Search with Embeddings [Tutorial]
  • Spatial analysis challenges [youTube playlist]
  • Spatial Index [Wikipedia]
  • Spatial Index Visualized [App][RTree Algorithm]
  • Spatial Statistics in QGIS Some tutorials on spatial statistics [QGIS Docs]
  • Split Line vs Split Part [QGIS Docs]
  • Urban planning course material! [Google Drive]
    • QGIS for Urban Planning Blog post with details [Blog]

3D, Mesh and Terrain

  • Deep Learning for Creating Swiss style Hillshading [Paper] [software]
  • Convert between Orthometric and Ellipsoidal Elevations using GDAL - [Blog]
  • DEMs
  • Hydrological model [LISFLOOD-FP]
  • LIDAR in QGIS [QGIS Docs]
  • LIDAR Viewers
    • Potree web point cloud viewer [GitHub]
  • Mesh data in QGIS
  • Plugins:
    • Visibility analysis (3D Analysis) [Blog]
      • Get High-Resolution DSM [OpenTopography]
      • Simulated Hi-res DSM based on OpenBuildings and Tree Heights [Blog]
    • HotSpot Analysis (LISA) [GitHub]
  • QGIS for Geology and Mineral Exploration
  • QGIS for visualizing hydrological models [Mesh datasets]
  • QGIS Geology Suite [Video]
  • QGIS2threejs [QGIS Plugin]
  • Qgis2threejs plugin [Document]
  • QGIS3 RayTracer Plugin [Twitter]
  • Unity/Unreal Gaming Engines for AR/VR with GIS data [aerometrex.com.au]
  • Visualize and export 3D scenes from QGIS [QGIS2ThreeJs]
  • Visualizing Elevation Profile of a GPS Track
    • QGIS Elevation Profile Tool [Video]
      • Open View → Elevation Profile
      • Right-click and set Tolerance to 0.
  • Working with point cloud data [Video]

Field Data Collection

Data Sources

PyQGIS Masterclass

Course material: PyQGIS Masterclass

PyQGIS and Plugin Development

Books and References

Data Sources

Mastering GDAL Tools

Course material: Mastering GDAL Tools

GDAL and OGR Reference

Cloud Optimized Formats and Remote Data

Raster Processing Workflows

  • Histogram Matching in Google Earth Engine [Blog]
  • Georeferencing toposheets [Tutorial]
  • HSV Transform
  • GDAL processing workflow on Planet data [Blog]
  • Tutorials for raster analysis
    • Basic raster styling and analysis [Tutorial]
    • Raster mosaicing and clipping [Tutorial]
  • Create Hill shade using AI - [researchgate.net] [Video]
  • Data fusion techniques [HISTARFM]
  • Extracting values form a raster [Supplement]
  • GDAL, MrSid, and nearblack [smathermather.com]
  • Non-GPU based Farm Delineation using Sentinel-2 [demo]
  • Planet RGB data process - Blog Series [Part-1] [Part-2] [Part-3][Part-4]
  • Raster Algebra and Extracting Coordinates [Course Material]
  • Real-time weather data stats using GDAL georeferencing [Climaya]
  • Rendering Polar Stereographic Image [Blog] [gdal commands]
  • SMAP Downscaling [Script] [Paper]
  • Virtual raster in QGIS - [Spatial data viz]
  • Weighted Multi-Criteria Overlay Analysis using GDAL Tools (Reclassification) [Blog]
  • Working with GeoTIFF files using Meta AI Segment Anything models [Notebook]

Command Line and Environment

  • Code to extract the MAXIMUM value from the output
    • Download and install ‘jq’ command [stedolan.github.io]
      • gdalinfo gdal-tools\srtm\N27E086.hgt -json -stats | jq-win64.exe ".bands[0].maximum"
      • Learn more about jq and other tools [book chapter]
  • Data Science at the Command Line - [Free Book]
  • PCRaster 4.3 using conda [Video]
  • Running Cron Jobs with GDAL/OGR and Conda [Course Material]
  • Running GDAL commands from Jupyter [GitHub]
  • Saving Terminal History
  • The next generation command line [warp.dev]

Data Sources

Python Foundation for Spatial Analysis

Course material: Python Foundation for Spatial Analysis

Python Language

Pandas and Data Wrangling

GeoPandas and Vector Data

Raster Data

APIs, Routing and Web Services

Environment and Tools

Remote Sensing and GeoAI

Example Projects and Notebooks

Further Learning

Mapping and Data Visualization with Python

Course material: Mapping and Data Visualization with Python

Charts with Matplotlib

Static and Interactive Maps

Web Apps and Dashboards

Raster and XArray

Further Learning

  • QGIS for Urban and Regional Planning [Blog]
    • Analyzing Street Intersection Density for Walkability [Tutorial]
    • Analyzing Urban Form using Momepy [Video]
  • Spatial Thoughts python tutorials [gitHub repo]
  • Calculating Areal Mean Rainfall [Tutorial]
  • How to visualize sum of line lengths for each district
  • Unpivot GIS data [GitHub]
  • A GitHub tutorial [Video]
  • A practical introduction to GIS [Video]
  • Cloud based Remote Sensing using Python [Course Material]
  • pd.concat() with DataFrames of different columns [Docs]
  • Code for unzipping data in python environment [Notebook]
  • Crop yield prediction [Regression Model][Random Forest Model][AI Model]
  • Downloading shared files from Google Drive [gist]
  • Geographiclib documentation [geographiclib.sourceforge.io]
  • Geopackage Viewer [ngageoint.github.io]
  • Getting the file size using python
    • Using Shell Command !ls -lh
    • Using Python [shutil]
  • Ideas for teaching GIS to high-schoolers
    • Mapping Basketball data in QGIS [Video] [talk]
    • Mapping Music Bands and Places from Songs [map]
    • Open Door to GIS Book [Book]
    • Adaptation of qgis tools in high school geography education [researchgate.net]
  • News about default map coordinates [News]
  • Pandas for data cleaning [realpython.com]
  • Python Foundation Course [OpenCourseWare]
  • SpatialThoughts Webinar recordings [archive]

Data Sources

Cloud Native Remote Sensing with Python

Course material: Cloud Native Remote Sensing with Python

Data Access and STAC

XArray Workflows

GeoAI, Foundation Models and Embeddings

Spectral Indices and Applications

  • Detecting algal bloom using NDCI [Course Material]
  • Spectral Indices source
  • Creating Interactive Story Maps with GeoLibre [Video]
  • Earth engine code for adding the Spatial context [Course Material]
  • Monitoring Economic Development from Space: Using Nighttime Light and Land Cover Data to Measure Economic Growth [Paper]
  • Spectral Indices for Land and Aquatic Applications [Earthdata training]

Datasets

End-to-End Google Earth Engine

Course material: End-to-End Google Earth Engine

Earth Engine Fundamentals

Image Processing and Composites

  • Working with QA Bands and Bitmasks in Google Earth Engine [Blog]
  • Histogram Matching in Google Earth Engine [Blog]
  • More accurate and flexible cloud masking for Sentinel-2 images [Blog]
  • Create a percentile composite [Script]
  • Different resampling methods in GEE [Resampling and Reducing Resolution]
  • GEE resampling methods [GEE Documentation]
  • HSV Transform
  • Topographic correction in GEE [mygeoblog.com]
  • Calculating Band Correlation Matrix [Course Material]
  • Composite Images
  • Create a percentile composite [Script]
  • Filter images by cloud cover within a region [Course Material]
  • Landsat 7 SLC-off Gap Filling [Script]
  • Multi-criteria Overlay analysis [Script]
  • Resampling and Reducing Resolution [GEE Docs]
  • Spectral Indices source
  • Talk on the cloud score+ mask [Video]
  • Understanding selfMask() function [Video]
  • Working with Landsat Collection 2 [Course Material]
  • Advanced cloud-free annual composite – [Paper]
  • Atmospheric Correction for Sentinel 2 Level 1 (only needed for data between 2015-2017)
    • SIAC Level 2 correction [Script]
    • Remote Sensing Reflectance [Script]
  • Central Pivot Irrigation Detector [Script] [Finding Circles, Revisited] - by Noel Gorelick
  • Combining multiple indices [Script]
  • Create composite for all seasons [Script]
  • Data Fusion
    • The Harmonized Landsat Sentinel-2 (HLS) data [Dataset Overview][HLS-L30][HLS-S30]
    • Stacking Sentinel-1 and Sentinel-2 bands for Classification [Script]
    • Join Sentinel-1 and Sentinel-2 images collected on the same day over the same area for regression modeling [Script]
    • Downscaling SMAP soil moisture by fusing with MODIS [Script] [Paper]
  • Derive LST from Landsat images [Supplement script]
  • Downscaling code example with paper [Script]
  • Example code to mask zeroes using selfMask() [Script]
  • Filter by Cloud Cover in a Region [Script]
  • Filter Sentinel-2 collection by satellite name [Script]
  • Find pixels with maximum NDVI [Script]
  • Forest Canopy Density Monitoring, Using Satellite Images [isprs.org]
    • Log, sqrt and power syntax for expressions [Script]
  • GEE implementation of ‘Remote Sensing Reflectance’ correction in GEE [Script]
  • Get date of each pixel in a composite [Script]
  • Image registration in GEE [register] [displacement]
  • Index Database - [indexdatabase.de]
  • Kernels and Convolutions
  • Landcover Statistics of Pixel Neighborhood [Script]
  • Landsat 8 EVI. : [Theory] [Script]
  • Landsat Harmonization Tutorial [GEE Docs]
  • Masking NoData
    • updateMask() to mask pixels [Script]
    • Creating a water mask [Video]
    • What is selfMask() [Video]
  • Medoid composite [explanation and code]
  • Mosaic Vs. Composite [Script]
  • Multi-criteria overlay analysis [Script]
  • neighborhoodToBands [Script] [Reference paper]
  • OmniCloudMask [GitHub]
  • Pan sharpening [GEE Docs]
  • Pan-Sharpening [concepts][GEE algorithm]
  • Quality mosaic [GEE Docs]
  • References for composites
    • Land Cover Classification using Google Earth Engine and Random Forest Classifier—The Role of Image Composition [Paper]
    • Pan-tropical Sentinel-2 cloud-free annual composite datasets [Paper]
  • Script for cloudy pixel count within the geometry [Script]
  • Select images from Sentinel-2A [Script]
  • Sensor fusion (S2 and S1) [Script] [joins documentation]
  • Sensor Fusion HISTARFM [GEE Docs]
  • Sentinel-2 Surface Reflectance Product (Level 2A)
    • Default algorithm. Sen2Cor [step.esa.int]
    • Other algorithms - [MAJA], [SIAC], CorA, FORCE, iCOR, LaSRC, MACCS, S2-AC2020, GFZ-AC, … [comparison]
    • Why GEE doesn’t have earlier Level2 Products [Discussion]
    • Adding support for atmospheric corrections in GEE [Discussion]
  • Site-Suitability Analysis using Multi-Criteria Overlay [Script]
  • Spectral transformation- rgb2Hsv [GEE Docs]
  • Spectral unmixing in GEE [GEE Docs]
  • STARFM data fusion: Explore the data without a GEE account [app] [Paper]
  • Tasseled Cap Transform [GEE Docs]
  • Texture in Google Earth Engine [GEE Docs]
  • Using a Percentile Reducer to create cloud-free composites in very cloudy regions [Script]
  • Working with CORONA imagery on GEE [Script]

Vectors, Zonal Statistics and Exports

  • Understanding Pixel Weights in Zonal Statistics [Blog]
  • Calculating Area in GEE [Blog]
  • Tiling Large Exports in Google Earth Engine [Blog]
  • Aggregating gridded population data in GEE [blog]
  • Advanced vector operations [eefa book Chapter]
  • Advanced Vector Operations [EEFA Chapter] [Youtube playlist]
  • Calculating Raster Area [Tutorial using ESA World cover]
  • Calculating shared border lengths [Blog]
  • GDAL and Google Cloud Storage [blog]
  • Weighted Vs. Unweighted reducer example [Script]
  • Area calculation for featureCollection [Script]
  • Buffer the region in GEE [Script]
  • Calculate area of multiple polygon - [Script]
  • Calculate statistics on a FeatureCollection using reduceColumns() [Script]
  • Calculating Area by Class [group reducer code]
  • Calculating Buffer Region along the border of 2 polygons [Script]
  • Calculating building density within a region [Script]
  • Calculating Visual Centers for Polygons
    • Centroids vs. Pole of Inaccessibility [blog.mapbox.com]
    • Calculating Weighted Centroids in GEE [Blog]
  • Creating grid on GEE [Script]
  • Creating grid-lines in GEE [Script]
  • Export with custom layer name : [Script]
  • Exporting a featureCollection [code example]
  • Exporting Composite for Dhaka (with updated filters) [Script]
    • Merging exported tiles [watch GDAL tutorial]
    • gdalbuildvrt -o dhaka.vrt *.tif; gdal_translate -of COG dhaka.vrt dhaka.tif
  • Exporting feature collections for charting [Script]
  • Exporting ImageCollection Metadata [Course Material]
  • Exporting images of a collection [Course Material]
  • Extracting Farm Polygons
    • Raster to Vector conversion [Script]
    • Shoreline detection using satellite data : [Script]
  • Filter the features matching with ids in CSV [Script]
  • Geodesic buffer using GEE [Script] [Slides]
  • Grouped Reductions and Zonal Statistics : [GEE Docs]
  • Kriging and IDW : [GEE Docs]
  • Least cost path script [Discussion]
  • Merge polygons in GEE [Script]
  • reduceRegions application [Script]
  • Smoothing vectors [Script]
  • Split polygons by Area [Script]
  • Sum vs. Count - Weighted Reducers [Script] [GEE Docs] [blog article]
  • Vector data in EE [Slides]
  • Weighted vs Unweighted - [community guide]
  • Working with geometries [Multi Point] [Bounding box]

Visualization, Charts and Maps

Time Series and Change Detection

Classification and Machine Learning

Water, SAR and Hazards

  • Automated Coastline Extraction from Satellite Images [Blog]
  • Automated otsu thresholding [Blog] [Course Material]
  • Detecting Algae Blooms
    • Detecting Chlorophyll using Remote Sensing. Normalized difference chlorophyll index (NDCI) [Paper]
    • A harmonized image processing workflow using Sentinel-2/MSI and Landsat-8/OLI for mapping water clarity in optically variable lake systems [Paper] [Script]
    • Chlorophyll a concentration from Ocean Colour SMI: Standard Mapped Image MODIS Terra Data [GEE Docs]
    • Algal Blooms using Sentinel-3 using Maximum Chlorophyll Index (MCI) [Discussion] [Script]
  • Water Quality Monitoring in GEE
    • Satellite Imagery for Monitoring and Predicting Water Quality in Kutch Region [omdena.com]
    • Detecting Chlorophyll using Remote Sensing. Normalized difference chlorophyll index (NDCI) [Paper]
    • Algal Blooms using Sentinel-3 using Maximum Chlorophyll Index (MCI) [Discussion] [Script]
  • Detect change in the area of water [Course Material]
  • Detecting algal bloom using NDCI [Course Material]
  • Fire monitoring using GEE [EEFA book chapter]
  • Flood mapping using Sentinel-1 [Course Material] [Video]
  • Otsu dynamic thresholding [Supplement Script]
  • Anomalies Analysis of Soil Moisture and Precipitation Over a River Basin [GEE Docs]
  • Areas affected by landslide converted to vector [Script]
  • Automatic Water Detection from Multidimensional Hierarchical Clustering [Script]
  • Change in water class (different approaches) [Script]
  • Convert landslide affected regions to polygons [Script]
  • Damaged Building Detection from Sentinel-1 imagery
  • Dehradun NDWI Thresholding [Script]
  • Detecting algal bloom with NDCI [Course Material] [Video]
  • Drought Monitoring in GEE [course module]
  • ET computation model [GitHub]
  • Flood Mapping : [Video]
  • Get burned area polygons [Script]
  • Global Surface Water - Expert system classification [Google Drive]
  • Ground Water Monitoring with GRACE [EEFA Book chapter]
  • [Script], Extract water bodies from NDWI
  • Hydrological Analysis in GEE
  • Improvement and bias correction for CHIRPS with rain gauge data [iopscience.iop.org]
  • Morphological operations in surface water mapping [Course Material]
  • Normalized Burn Ratio - [un-spider.org]
  • Otsu dynamic thresholding [Script]
  • SAR Flood Mapping [Guided Project]
  • SAR pre-processing [Script]
  • SAR Water Detection [Script]
  • Sentinel-1 ARD pre-processing [Course Material]
  • Ship detection using Sentinel-1 SAR data [script1][script2]
  • Simple Water Balance model using MODIS ET and precipitation [Script]
  • Stream and Catchment Delineation [courses.gisopencourseware.org]
  • Surface water mapping [Slides] [Script]
  • Unsupervised classification
    • Water detection using unsupervised method [Script]
    • Post-processing using unsupervised method [Course Material]
  • Using Sentinel-1 data for water detection [Course Material]
  • Water Balance GEE code [Script]
  • Water Detection

Apps and User Interface

Applications and Research

  • Mapping landcover in India’s Open Natural Ecosystems [gitHUB project]
  • Mapping Building Density with Open Building Datasets [Blog]
  • NCF study on LPG distribution near Forest settlement : [outreach]
  • Urban growth material
    • Spatio-temporal modelling paper [Paper]
    • Urban growth repository [Script]
  • An Analysis of Long-Term Rainfall Trends and Variability in the Uttarakhand Himalaya Using Google Earth Engine [Paper]
  • Conflict Ecology lab [conflict-ecology.org]
  • Mapping global travel time using Global Friction Surface dataset [Blog]
  • Santhosh Urban Growth Prediction Project ([GEE repository] - click to add to Readers folder). [Reference paper]
  • Calculation for 3D area and volumes [onlinelibrary.wiley.com]
  • Calculation of Evapotranspiration and Crop Coefficient (Kc)
    • SEBALIGEE: 30m Landsat-based ET retrieval [Paper] [GitHub]
    • Example for India [Script]
  • Cloud Score+ in Action: Land Cover Mapping in Ecuador [Blog]
  • Coastal Change Examples
  • Determining Impact of Change
    • Application: An exploratory analysis of urbanization effects on climatic variables [Paper]
    • Application: Relationship between Burned Area and Precipitation [book chapter] [Script]
  • DINOv3 helping in forest and farm restoration [ai.meta.com]
  • Downscaling soil moisture data [Paper] [Script]
  • Forest Data & Applications - GEDI & Obiwan [Video]
  • GEE application in Agricultural Environments [eefa book chapter]
  • Google AI Models for flood forecasting [Google Research]
  • Land-Surface Temperature (LST)
    • Why LST should not be used to measure Heat Stress [Paper]
    • Relationship between LST and Heat Stress [Paper]
    • Landsat LST [Course Material]
    • MODIS Night LST [Script] (Nighttime LST has better correlation to nighttime Air Temperature)
    • Drought Monitoring with Remote Sensing [full module with videos]
    • VCI (Vegetation Condition Index) [Course Material]
    • TCI (Temperature Condition Index) [Script]
  • Mangrove Mapping
    • Mangrove Mapping Methodology [GitHub]
    • Mangrove Mapping using Google Earth Engine [Paper]
  • Map Complex Shade-Grown Coffee Landscapes using GEE [Paper]
  • Mapping jhum (shifting) cultivation [Paper]
  • Nighttime lights limitations with LED lights [Twitter thread]
  • Resources on habitat modelling
    • Species Distribution Modeling in GEE [Paper]
    • Species Distribution Modeling using Random Forest [GEE Docs]
  • River Morphology in Earth Engine
    • Paper: Avulsion flow-path selection on rivers in foreland basins. [pubs.geoscienceworld.org]
    • [Code] and [Discussion]
    • Python-based software called PyRIS- esp for channel morphodynamics over time
    • Automated extraction of meandering river morphodynamics from multitemporal remotely sensed data [Paper]
  • Segmented World, Dynamic Emissions [Slides]
  • Soil Erosion model (RUSLE) implementation using GEE
    • Concept: Learn about RUSLE and Soil Erosion [Blog]
    • Soil Erosion App with Code [app] [GitHub]
    • Other GEE Implementations
    • RUSLE_GEE (Python) [GitHub]
    • Modified_RUSLE_model (Javascript) [GitHub]
  • Spectranomics for Remote Sensing [Paper]
  • Surface temperature and heat island in GEE
    • Use MODIS based UHI data in EE [GEE Docs]
    • Landsat 8 LST code with example [Script]
    • WRI Twitter Post about LST and UHI [Twitter]
  • Tracking economic activity using nighttime lights [Paper1][Paper2]
  • Urban expansion : [Repository] [Reference Paper]
  • Using Buildings Data in GEE
    • Urban Growth with Building Counts [code example]
    • Mapping Building Density with Open Building Datasets [Blog]

Learning Resources and Tools

Datasets

Google Earth Engine for Water Resources Management

Course material: Google Earth Engine for Water Resources Management

Earth Engine Fundamentals

Image Processing and Composites

Vectors, Zonal Statistics and Exports

  • Understanding Pixel Weights in Zonal Statistics [Blog]
  • Calculating Area in GEE [Blog]
  • Interpolating point data [Tutorial]
  • Calculating Raster Area [Tutorial using ESA World cover]
  • Advanced vector operations [EEFA book chapter]
  • Bhutan Forest Area Using ESA WorldCover [Script] New!
  • Creating Multi-Point Geometry with Coordinates [Script]
  • Landcover Analysis for All Admin2 regions - Guided GEE Project [Course Material]
  • Reduce Resolution : [GEE Docs]
    • Aggregating Gridded Population Data (Advance projections) : [Blog]
  • Weighted - Un-Weighted Reduction in GEE : [GEE Docs] [Blog]

Visualization, Charts and Maps

  • Color Brewer : [colorbrewer2.org]
  • Creating Publication Quality Charts with GEE [Course Material] [Multi-year time series]
  • Feature and FeatureCollection Visualization [GEE Docs]
  • GEE animations [GEE Docs]
  • Box Plot (Whisker Plot) in GEE [Script]
  • Charting across years – [Script]
  • Adithya’s script for animating MNDWI [corrected code]
  • Calendar chart [Google Charts]
  • Chart with Trendline [Script]
  • Charting by series by region (Bangalore vs Chennai precipitation) - [Script]
  • Create Animations from ImageCollection [Script]
  • Creating choropleth maps and advanced visualisation using GEE [Video]
    • New Supplement Script [Script]
  • Creating discrete lasses from continuous values [Script]
  • Dynamic Visualization Parameters [Script]
  • Dynamically setting min/max values for visualization [Script]
  • False-color visualization for Enhancing surface water [Script]
  • Legend for ESA Worldcover [Script]
  • Plot 2 variables with different scale factors [Script]
  • Vector data visualization [GEE Docs]
  • Wind Speed Animation in GEE [Script]

Time Series and Change Detection

Classification and Machine Learning

  • Estimating Above Ground Biomass using RF Regression in GEE [Blog]
  • Object based classification approach [Paper] [Script]
  • Segmentation of High Resolution Imagery [samgeo]
  • Enhancing Land Cover with Local Knowledge [Blog]
  • Keep distance between points to avoid spatial autocorrelation [GEE Docs]
  • Foundation Models and Embeddings
  • Automatic Hyperparameter Tuning [Script]
  • Classification with Uploaded Table [Script]
  • Entropy classifier : [GEE Function]
  • Landcover classification using migrated training samples [Paper]
  • Post-processing Classification Results [Course Material]
  • Post-processing the classification result [Supplementary material]
  • ROC-AUC Curve in GEE [forum post with code]
  • Unsupervised Classification with Satellite Embedding Dataset [GEE Docs]

Water, SAR and Hazards

  • Automated Coastline Extraction from Satellite Images [Blog]
  • Calculate RiverWidth using Landsat [RivWidthCloud]
  • Detecting Algae Blooms
    • Detecting Chlorophyll using Remote Sensing. Normalized difference chlorophyll index (NDCI) [Paper]
    • A harmonized image processing workflow using Sentinel-2/MSI and Landsat-8/OLI for mapping water clarity in optically variable lake systems [Paper] [Script]
    • Chlorophyll a concentration from Ocean Colour SMI: Standard Mapped Image MODIS Terra Data [GEE Docs]
    • Algal Blooms using Sentinel-3 using Maximum Chlorophyll Index (MCI) [Discussion] [Script]
  • River Centerline Extraction
  • Water Quality Monitoring in GEE
    • Satellite Imagery for Monitoring and Predicting Water Quality in Kutch Region [omdena.com]
    • Detecting Chlorophyll using Remote Sensing. Normalized difference chlorophyll index (NDCI) [Paper]
    • Algal Blooms using Sentinel-3 using Maximum Chlorophyll Index (MCI) [Discussion] [Script]
  • Detect change in the area of water [Course Material]
  • Automated Water Extraction Index [Reference]
  • Burnt area detection [Course Material]
  • C, S and L band SAR penetration comparison : [earthdata.nasa.gov]
  • Convolutional Neural Net (CNN) for Water Detection DeepWaterMap2 [GitHub]
  • Date of first appearance of a Pond [Script]
  • Detecting Algae Blooms: New Script in Supplement > Surface Water > Detecting_Algae_Blooms [Script] using NDCI
  • Detection of frost using Sentinel-1 Data [Paper]
  • ESA WorldCover vs Global Surface Water [Script]
  • Estimation of reservoir volume
  • Export of Otsu Thresholding Result [Script]
  • Find pixels stayed majority as water over years [reducer script]
  • Flood Risk Index Mapping [frontiersin.org]
  • Gaza Bombing Change Detection Code [Script]
  • Global Surface Water dataset for Coastal Land Reclamation Analysis [paper with code]
  • GSW methodology paper [nature]
  • Identify Brackish Water using Salinity Index [Script]
  • Interferometry [nisar.jpl.nasa.gov]
  • Near Realtime Fire Monitoring using GOES data
  • New Permanent Water in Lake Atitlán [Script]
    • From the User Guide : There are instances where water is not present at the beginning or the end of the observation record but is present in some intervening years. Stability must be checked at the pixel scale by using the long term water history described by the temporal profiles plus the recurrence and occurrence maps. [storage.googleapis.com]
  • SAR Handbook [gis1.servirglobal.net]
  • SAR Sigma vs Gamma - [forum.step.esa.int]
  • Soil Water Balance Bucket model [Script]
  • Water detection in Bright Areas [Percentile Composite]
  • Water extraction using dynamic world [Supplement script]

Apps and User Interface

  • Interesting GEE Apps [earthengine.app]
  • Disaster Apps
  • Apps :
    • GLAD global surface water [App]
    • Urban Heat Island [App]
    • Kerala Floods [App]
    • Forest vegetation condition [App]
    • Harvest monitoring [App]
  • Create Custom Time-lapse Videos using GEE [streamlit.gishub.org]
  • Downloading within the App [Script]
  • Drill-down selector [Script]
  • Flood mapping app - [App]
  • Hierarchical drop down - [Script]
  • Hierarchical Drop-down [Script]
  • Hierarchical dropdown [Script]
  • Hierarchical Selection of Admin boundaries [Script]
  • NDMI Explorer (MODIS) by Tachara Larocque - [App]
  • Reclamation app by Subir Chowdhury [researchgate.net]
  • Sentinel-5p Explorer App Code [Script]
  • Streamlit GEE App for Creating TimeLapse [app]
  • WorldPop Explorer App Code [Script]

Applications and Research

  • Mapping landcover in India’s Open Natural Ecosystems [gitHUB project]
  • Mapping Building Density with Open Building Datasets [Blog]
  • NCF study on LPG distribution near Forest settlement : [outreach]
  • An Analysis of Long-Term Rainfall Trends and Variability in the Uttarakhand Himalaya Using Google Earth Engine [Paper]
  • Comparison of different Precipitation data paper : [Twitter]
  • NDFI : [Paper] [Script]
  • Rainfall trends in India using 135-year precipitation data from IMD [Paper]
  • SpatialTemporal Modeling of Urban Growth using Machine Learning [Paper] [GEE repository] (click to add to Code Editor)
  • Species Modelling : [Material]

Learning Resources and Tools

Datasets

Creating Publication Quality Charts with Google Earth Engine

Course material: Creating Publication Quality Charts with Google Earth Engine

Charts and Visualization

  • Animated plots with Matplotlib [Blog]
  • Adding a threshold line to chart [Script]
  • Chart example for dual y-axis [Script]
  • Custom style for basemap in GEE [Script]
  • Data table for charts [GEE Docs]
  • GEE charts trendlines options [developers.google.com]
  • Labelling years on the X axis [Script]
  • Looping to create charts for all years [Script]
  • Mapbiomass Chart [Script]
  • Pie-chart label options [Script]
  • Plotting B3 vs. B8 for all the classes [Script]
  • Reformat data in visualization [formatters]
  • Removing gridlines [Script]
  • Showing mean value on box plot [Script]

Time Series

  • Extracting Time Series using [Blog]
  • Learning Joins in Earth Engine: Time-series processing using GEE [Video]
  • Calculate Rainfall-NDVI correlation [Script]
  • Fit harmonic model to the NDVI time-series [Script]
  • Plotting trend line with Forest Loss [Script]

Earth Engine Fundamentals and Code

  • Working with QA Bands and Bitmasks in Google Earth Engine [Blog]
  • Functional programming concepts [GEE Docs]
  • HSV Transform
  • Keep distance between points to avoid spatial autocorrelation [GEE Docs]
  • Client Vs. Server [Course Material]
  • Create percentile composite [Script]
  • Creating donut buffer [Script]
  • Exporting imageCollection [Script]
  • Get centroids of features in a collection [Script]
  • Otsu thresholding [Script]
  • Single-sided buffer [Script] [Video]

Apps and User Interface

Learning Resources and Tools

Datasets

Agentic Coding for Geospatial

Course material: Agentic Coding for Geospatial

Claude Code and Skills

  • DeepSeek Harness — source code included [deepseek.com]
  • Makes your AI agent think like the laziest senior dev in the room [ponytail]
  • Reducing Token Usage
    • Caveman: A skill that makes Claude less verbose [GitHub]
    • Ponytail: A skill that reduces the amount of code produced [GitHub]
  • Reference for Claude Code hook events [code.claude.com]
  • The Open Agent Skills Ecosystem [skills.sh]

Tools and Integrations

Building Your Geospatial Portfolio Website

Course material: Building Your Geospatial Portfolio Website

Git and Markdown

  • Geospatial and tabular data in Git [Kart Project]
  • Python tool for converting files and office documents to Markdown [markitdown]
  • Change default Git editor
    • By default, Git opens the Vi editor whenever it needs some input from the user. If you get stuck in a Vi editor, enter Esc key followed by :wq to close it.
    • You can update your Git config to set VS Code as the default editor. [Updated VS Code Config Instructions]
  • Creating and highlighting code blocks in markdown file [docs.github.com]

Websites and Publishing


If you want to report any issues with this page, please comment below.