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
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
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 variable****@geometry,@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
Print Layouts and Atlas
- Automating Map Creation with Print Layout Atlas [Tutorial]
- Exporting Print Layouts from Processing Scripts [Blog]
- Print Layout on selected features.
- Use ‘Filter’ in Atlas with
is_selected() expression.
[details]
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]
PyQGIS Masterclass
Course material: PyQGIS
Masterclass
PyQGIS and Plugin Development
Books and References
- Information video on COG [Video]
- QGIS Actions Deep Dive [Video]
- QGIS source code [GitHub]
- ESRI to QGIS compatibility [SLYR]
- PyQGIS cookbook : [QGIS
Docs]
- Python Learning Resources
- QGIS community events [GitHub]
- QGIS official Telegram group : [Join]
- Ujaval GitHub repo : [GitHub]
- 3D Geospatial Platform – [Cesium]
- Anita Graser’s tutorials [PyQGIS
101]
- Book Recommendations
- Python Object-Oriented programming Tutorials : [Video]
- Qgis Hats [GitHub]
- Streamlit Apps
- Uninstalling QGIS [Course
Material]
Python Foundation for Spatial Analysis
Course material: Python Foundation
for Spatial Analysis
Pandas and Data Wrangling
GeoPandas and Vector Data
APIs, Routing and Web Services
Example Projects and Notebooks
Cloud Native Remote Sensing with Python
Course material: Cloud Native
Remote Sensing with Python
GeoAI, Foundation Models and Embeddings
- Foundation Models and Embeddings
segment_length vs. iteration parameter for
smoothify [GitHub]
- Agentic coding for geospatial [Course
Material]
- Building Classification with GeoAI – Google AlphaEarth in Python [Video]
- Extracting building heights [Supplement
Notebook]
- GeoTessera examples [GitHub]
- Mapping Tree Canopy Fragmentation
- Using GeoAI for Object Detection [Course
Material]
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
- Building Heights Datasets
- Data for Celestian bodies in GeoLibre [geolibre.app]
- Introduction to Population Grids [Earthdata
course]
- OpenTopography Raster DEM Data Catalog [GitHub]
- WorldCereal Data Download [Zenodo]
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
- 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]
- Available training datasets for classification [LandCoverNet]
[LUCAS]
- Using LandcoverNet for building a classifier [Script]
- Using LUCAS data for building a crop classifier [Script]
- Classification using migrated training samples [Paper]
- Improving selection of spectral variables [GIS
StackExchange]
- Machine Learning algorithms in GEE [smile]
- Object-based method for burnt area identification [GEE
Docs]
- Stratified sampling using GEE [Course
Material]
- 30 years classification using Landsat and extracting urban footprint
[Script]
- Accuracy assessment methods
- Add Latitude/Longitude information to Image for Machine Learning [Script]
- Add NDVI statistics for Supervised Classification [Script]
- Alternate workflow for validation (machine learning method) : [Script]
- Area Under Curve [GIS
StackExchange]
- Canopy height regression model in GEE [Script]
- Collection of Labeled Datasets for Machine Learning Awesome
Satellite Imagery Datasets [GitHub]
- Crop classification in GEE [Script]
- Do you need to split your samples for regression? [Twitter]
- Extracting farm boundaries [samgeo
tutorial]
- Farm Boundary Detection
- Overview of Approaches [Blog]
- CNN Based Segmentation Approach with Python Code (non-GEE) [GitHub]
- Agriculture Field Boundary Detection [book
chapter] [Script]
- Central-Pivot Irrigation Detector [Script]
- Feature Scaling
- Formatting Consumers/producers accuracy arrays [Script]
- Forward and Backward correction for the classification [Script]
- Fragmentation analysis for landscape
- GCP Table upload - [Script]
- Hyperparameter Tuning for Multiple Parameters [complete
script]
- Identify misclassified points - [Script]
- Identify Misclassified Points using Filters [complete
script]
- Importing spectral signatures [data
format] [Script]
- Link to ground truth data for classification
- Meta’s new Segment Anything Model (SAM)
- Object-based classification - [GEE
Docs]
- Object-oriented classification approach [Script]
- Preparing training data [Vertex
AI]
- samgeo [farm
boundary extraction] [Tutorials]
- Segment Geospatial [GitHub]
- Segmentation in GEE - [clustering]
[object
based]
- Stratified Sampling of GCPs [Script]
- Tensorflow Neural Net Classification [GitHub]
- TensorFlow Tutorials [Example
Workflows] [TensorFlow
and Cloud AI]
- Tutorials on vertexAI [User Guide
Article]
- Unsupervised classification method for crop identification [Paper]
- Use LandCoverNet Data for supervised classification [Script]
- Use migrated training samples for multi-year classification [Supplement
script]
- Using dynamic world data for classification [Course
Material] [Blog]
- Using existing landcover data for classification [GEE
docs for Supervised Classification]
- Using GLCM Texture bands for classification [Script]
- Visualizing Random Forest Trees [Notebook]
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
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]
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]
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]
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]
If you want to report any issues with this page, please comment below.