Geospatial analysis you can run, check and reuse.
A library of step-by-step GIS tutorials, from your first GeoPandas map to InSAR and deep learning. Every Python tutorial ships with the exact scripts we ran, and every map, chart and table on the page is the real output.
- GIS data sources
- 2,590
Learning paths
Paths in the tutorial hub →Four routes through the library, each from a first step to research-grade analysis. Every step is a complete tutorial with its own data and code, so you can start at whichever one matches what you already know.
Python GIS foundations
Vector data, projections, joins and maps, then rasters, zonal statistics and cloud-native formats.
- Getting started with GeoPandas: projections, spatial joins and choropleth maps Beginner
- Coordinate reference systems in Python: EPSG codes, pyproj transforms and reprojecting vectors and rasters Beginner
- Spatial joins in GeoPandas: sjoin, predicates, sjoin_nearest and point in polygon Beginner
- Make a map in Python with matplotlib and cartopy: projections, classified choropleths, scale bars, north arrows and inset maps Beginner
- Interactive web maps from Python with Folium and GeoPandas .explore() Beginner
- Terrain analysis in Python: stream, clip and analyse a DEM with rasterio and rioxarray Intermediate
- Zonal statistics in Python: exactextract vs rasterstats, with partial pixels, land-cover fractions and a benchmark Intermediate
- Raster to vector in Python: polygonize with rasterio, rasterize boundaries and convert a GeoTIFF to a Cloud Optimized GeoTIFF Intermediate
- Fast vector geoprocessing in Python: spatial indexes, overlays and modern file formats Intermediate
- Query Overture Maps with DuckDB spatial and GeoParquet in Python Intermediate
Remote sensing and Earth observation
Search Sentinel-2 with STAC, mask clouds, build index time series, then measure fire, water, heat, snow and gas.
- Measuring Lake Mead's shrinking shoreline with Sentinel-2, STAC and Python Intermediate
- Sentinel-2 cloud and cloud-shadow masking in Python: SCL vs s2cloudless vs OmniCloudMask Intermediate
- NDVI time series in Python with Sentinel-2, odc-stac and xarray Intermediate
- Burn severity mapping with Sentinel-2 and dNBR in Python (Saddleworth Moor 2018) Intermediate
- Monitoring reservoir water quality from space with Sentinel-2 and Python (Peak District case study) Intermediate
- Land surface temperature from Landsat in Python: mapping London's urban heat island Intermediate
- Snow cover mapping with NDSI in Python: Sentinel-2 and MODIS over the Cairngorms Intermediate
- Sentinel-5P NO₂ in Python: mapping air pollution from TROPOMI over the UK and north-west Europe Intermediate
- Coastal erosion and shoreline change from Sentinel-2 in Python (Holderness, 2017–2026) Advanced
- Methane plume detection in Python with NASA EMIT: mapping and quantifying landfill plumes Advanced
SAR and InSAR
Radar from first principles: speckle, floods, ships and crops with Sentinel-1, then interferometry and source modelling.
- SAR speckle filtering in Python: Lee, refined Lee, Frost and Gamma-MAP on Sentinel-1 Intermediate
- Sentinel-1 SAR flood mapping in Python: the 2022 Pakistan floods Intermediate
- Sentinel-1 ship detection in Python: a CA-CFAR detector off the Port of Rotterdam Intermediate
- Sentinel-1 crop monitoring in Python: SAR time series for wheat and oilseed rape Intermediate
- Sentinel-1 soil moisture in Python: change detection checked against COSMOS-UK Intermediate
- Earthquake damage mapping with Sentinel-1 in Python: log ratio and z-scores in Antakya Intermediate
- InSAR ground subsidence in Python: one year of Mexico City sinking, from Sentinel-1 Advanced
- InSAR volcano deformation in Python: mapping magma inflation at Svartsengi, Iceland, with Sentinel-1 Advanced
- Mogi model inversion in Python: magma depth and volume from InSAR at Svartsengi, Iceland Advanced
- InSAR time series in Python: Svartsengi inflation cycles validated with GNSS Advanced
Machine learning and AI
From rule-based maps and random forests to U-Nets, transformers and foundation-model embeddings, validated honestly.
- Habitat mapping with Sentinel-2 in Python: spectral index rules and an honest accuracy assessment Beginner
- Land cover classification in Python: a Sentinel-2 random forest with scikit-learn Intermediate
- Habitat classification with LightGBM in Python: Sentinel-2, Sentinel-1 and terrain fusion Intermediate
- Segment Anything on satellite and aerial imagery in Python: a samgeo tutorial Intermediate
- Training data for deep learning on satellite imagery: Sentinel-2 image chips in Python Intermediate
- U-Net satellite image segmentation in PyTorch: a TorchGeo and Sentinel-2 tutorial on a CPU Advanced
- Deep learning inference on large rasters: sliding-window prediction, COGs and polygons in Python Advanced
- Object-based image analysis in Python: OBIA habitat classification with Sentinel-2 Advanced
- Satellite image time series classification with deep learning: TempCNN and L-TAE in PyTorch on a CPU Advanced
- AlphaEarth satellite embeddings in Python: few-shot habitat mapping, uncertainty and area estimates Advanced
Straight from the tutorials
Browse all 60 →A few of the 309 figures in the library, each produced by its tutorial's own code: run the scripts and you get the same output. Pick one to see how it was made.
-
Glacier velocity in Python with NASA ITS_LIVE: Jakobshavn Isbræ, 1985–2025 -
InSAR volcano deformation in Python: mapping magma inflation at Svartsengi, Iceland, with Sentinel-1 -
Burn severity mapping with Sentinel-2 and dNBR in Python (Saddleworth Moor 2018) -
Street network analysis with OSMnx: routes, isochrones and walking accessibility -
Sentinel-1 SAR flood mapping in Python: the 2022 Pakistan floods -
Habitat classification with LightGBM in Python: Sentinel-2, Sentinel-1 and terrain fusion -
LiDAR point clouds in Python with laspy: from a LAZ file to a DTM, DSM and canopy height model -
Sentinel-5P NO₂ in Python: mapping air pollution from TROPOMI over the UK and north-west Europe -
Hot spot analysis in Python: Getis-Ord Gi*, Moran's I and LISA on Birmingham road collisions -
Watershed delineation in Python with pysheds: the River Derwent above Ladybower
Browse by topic and level
All topics →| Topic | Beginner | Intermediate | Advanced | All |
|---|---|---|---|---|
| Python | 6 | 36 | 13 | 55 |
| QGIS | 1 | 1 | – | 2 |
| Remote Sensing | 2 | 21 | 12 | 35 |
| Hydrology | 1 | 4 | – | 5 |
| Data Sources | – | 1 | – | 1 |
| 3D | 1 | 6 | 1 | 8 |
| ArcGIS Pro | 1 | 1 | – | 2 |
| Machine Learning | 1 | 4 | 5 | 10 |
| Spatial Analysis | 3 | 8 | 1 | 12 |
| SAR & InSAR | – | 6 | 4 | 10 |
| Cryosphere | – | 1 | 1 | 2 |
| Ecology | 1 | 5 | 3 | 9 |
Start from your data
Tutorials grouped by the data they work with. Each link opens the hub filtered to that data.
Multi-part series
Series in the tutorial hub →-
Geospatial Python essentials
- Coordinate reference systems in Python: EPSG codes, pyproj transforms and reprojecting vectors and rasters
- Spatial joins in GeoPandas: sjoin, predicates, sjoin_nearest and point in polygon
- Raster to vector in Python: polygonize with rasterio, rasterize boundaries and convert a GeoTIFF to a Cloud Optimized GeoTIFF
-
AI habitat classification with Python
- Habitat mapping with Sentinel-2 in Python: spectral index rules and an honest accuracy assessment
- Habitat classification with LightGBM in Python: Sentinel-2, Sentinel-1 and terrain fusion
- Object-based image analysis in Python: OBIA habitat classification with Sentinel-2
- Satellite image time series classification with deep learning: TempCNN and L-TAE in PyTorch on a CPU
- AlphaEarth satellite embeddings in Python: few-shot habitat mapping, uncertainty and area estimates
-
Volcano deformation with InSAR in Python
-
Deep learning for satellite imagery with Python
-
Mapping NO₂ air pollution from space and from the ground
-
Cloud-native vector GIS with Python
Latest posts
Everything →- H3 hexagon grids in Python: indexing, aggregating and smoothing 541,000 London places with Uber's H3
- Methane plume detection in Python with NASA EMIT: mapping and quantifying landfill plumes
- Make a map in Python with matplotlib and cartopy: projections, classified choropleths, scale bars, north arrows and inset maps
- Earthquake damage mapping with Sentinel-1 in Python: log ratio and z-scores in Antakya
- Raster to vector in Python: polygonize with rasterio, rasterize boundaries and convert a GeoTIFF to a Cloud Optimized GeoTIFF
- Rooftop solar potential from LiDAR in Python: pvlib, PVGIS and shading for every roof
GIS data for every country
Open the globe →237 countries and territories and 2,590 catalogued sources, from national mapping agencies, boundaries and elevation to imagery and open-data portals, each with its licence, formats and link status. These are the best-covered countries in each region; the globe has them all.