Skip to content
Study / Workflows
Workflows
Each topic follows one task from start to finish, with the steps, the code, the checks in between and the mistakes to avoid.
26 guides
Downloading data
13 guides
- 01How to Download Sentinel-2 Imagery: Copernicus Browser and PythonTwo ways to get free Sentinel-2 scenes for your study area: the Copernicus Browser, where you click and download a zip, and a short Python script that reads only the pixels you need, with no account.TheoryBrowserPython
- 02How to Download Landsat Imagery: EarthExplorer and PythonGet free Landsat 8 and 9 surface reflectance for your study area, either by searching and downloading in USGS EarthExplorer or with a short Python script that reads only your area and needs no account.TheoryBrowserPython
- 03How to Download a DEM: Copernicus DEM Tiles for Your Study AreaDownload free 30 m elevation data for any place: pick the right tile by its name, download it with a link or a short Python script, join tiles when your area crosses an edge, and check that the heights make sense.TheoryBrowserPython
- 04How to Download OpenStreetMap Data: QuickOSM and the Overpass APIGet roads, buildings, hospitals and other features from OpenStreetMap for your study area, either with the QuickOSM plugin in QGIS or with a short Python script, and save them as a GeoPackage you can use anywhere.TheoryQGISPython
- 05How to Download Rainfall Data: CHIRPS Monthly FilesDownload free monthly rainfall for the whole tropics and sub-tropics, read the value for your place, build a year of rainfall as a table, and learn what a 5 km rainfall cell can and cannot tell you.TheoryBrowserPython
- 06How to Download Administrative Boundaries: States and Districts from geoBoundaries, GADM and Natural EarthGet state and district polygons for any country, pick a district by name, find its neighbours, and see how much three free sources disagree, so that you can choose one and say which you used.TheoryBrowserPython
- 07How to Download Land Cover: ESA WorldCover 10 m Tiles for Your Study AreaGet a free 10 m land cover map for any place, read the class codes, count what covers your area, and keep the colours and the credit line that go with it. Python reads only your window from a tile of 100 MB.TheoryBrowserPython
- 08How to Download Sentinel-1 Radar Data: Cloud-Free Images in PythonGet free Sentinel-1 radar images for your area, choose scenes that you can compare, read the VV and VH bands for just your window, convert them to decibels, reduce the speckle, and see what water, fields and buildings look like in radar.TheoryBrowserPython
- 09How to Download Weather Data for a Place: ERA5 Rainfall and Temperature in PythonGet daily rainfall and temperature for any point on Earth back to 1940, with no account, from the ERA5 reanalysis through the Open-Meteo archive. See what a reanalysis is, check for missing values, and compare it with CHIRPS.TheoryBrowserPython
- 10How to Download Building Footprints: Microsoft Global Buildings in PythonGet the outline of every building in your area from the free Microsoft Global ML Building Footprints, find the right file from a quadkey, cut it to your box, count and measure the buildings, and compare the count with OpenStreetMap.TheoryPython
- 11How to Download Night Lights (VIIRS) for Your AreaGet the yearly VIIRS night lights map for a country, cut it to your district, read the brightness, find where the light is, and learn what the number means and what it misses.TheoryBrowserPython
- 12How to Download Soil Moisture and Land Surface TemperatureGet soil moisture for a place from a free weather model, get land surface temperature from MODIS satellite images, compare the two with rainfall, and learn what each number means and where it is weak.TheoryPython
- 13How to Download Roads and Rivers for a DistrictGet the roads and the rivers, canals and drains of a district from OpenStreetMap, cut them to the district boundary, measure their length by type, and learn what OSM lines can and cannot tell you.TheoryQGISPython
Preparing data
6 guides
- 14How to Mosaic Rasters: Join Tiles into One Raster in QGIS and PythonJoin several tiles or scenes into one seamless raster, check that they match first, choose what happens where they overlap, and avoid the empty edge row and column that a mosaic can leave behind.TheoryQGISPython
- 15How to Clip a Raster to a Boundary: Cut a DEM to a District in QGIS and PythonCut a raster to the shape of a district or any polygon, so that only your study area remains. Learn the difference between cropping to an extent and masking to a shape, and the CRS mistake that returns nothing.TheoryQGISPython
- 16How to Reproject a Raster: From Degrees to a UTM Zone in QGIS and PythonMove a raster from latitude and longitude to a projected CRS in metres, pick the right UTM zone for your place, choose a resampling method that fits your data, and check that areas and slopes now make sense.TheoryQGISPython
- 17How to Mask Clouds in Sentinel-2 with the Scene Classification LayerUse the scene classification layer (SCL) that comes with every Level-2A scene to hide clouds, cloud shadow and cirrus before you calculate an index, and see how much the mask changes the answer.TheoryQGISPython
- 18How to Convert Between Geospatial Formats: Shapefile, GeoPackage, GeoJSON and Cloud Optimized GeoTIFFMove vector data between Shapefile, GeoPackage and GeoJSON, and turn a GeoTIFF into a Cloud Optimized GeoTIFF, in QGIS and in Python. Know what each format keeps, what it loses, and which one to choose.TheoryQGISPython
- 19How to Georeference a Scanned Map: Ground Control Points in QGIS and PythonTurn a scanned paper map or a picture of a map into a GeoTIFF that sits in the right place on the Earth, by matching points on the scan to known coordinates, and then measure how good the fit is.TheoryQGISPython
Satellite imagery
1 guide
- 20NDVI from Sentinel-2: A Step-by-Step Satellite Imagery WorkflowDownload a Sentinel-2 scene, mask clouds with the scene classification layer, calculate NDVI with Rasterio and check the result before you trust it.TheoryPython
Using data
6 guides
- 21How to Extract Raster Values at Points: Height, Rainfall or NDVI for Every LocationRead the value of a raster under each point of a layer, such as the height under every hospital, in QGIS with Sample Raster Values and in Python with rasterio. Handle points that fall on NoData, and check the result two ways.TheoryQGISPython
- 22How to Calculate Zonal Statistics: Mean Height of Every District from a DEMSummarise a raster for each polygon of a layer, such as the mean, lowest and highest height of every district, in QGIS with Zonal Statistics and in Python with rasterio. Learn what the cell rule and NoData do to the answer.TheoryQGISPython
- 23How to Turn a Table into Points and Join It to Polygons: CSV, Spatial Join and Attribute JoinMake a point layer from a CSV with coordinates, count points in each polygon, and join a table of numbers to a layer by code. See how a join by name silently loses rows, and how to join so that it does not.TheoryQGISPython
- 24How to Calculate Slope, Aspect and Hillshade from a DEM in QGIS and PythonTurn a DEM into three maps that describe the terrain: how steep it is, which way it faces, and what it looks like under a low sun. Do it in QGIS with the Raster Analysis tools and in Python with a short function that matches them.TheoryQGISPython
- 25How to Measure Distance and Find the Nearest Feature: Buffers and Nearest Neighbour in QGIS and PythonFind the distance from every hospital to the nearest main road, the nearest hospital to each town, and the hospitals within 2 km of a place, using nearest-feature joins and buffers. Know why the layers must be in metres, and what a straight-line distance leaves out.TheoryQGISPython
- 26How to Get a Time Series for a Point from a Stack of RastersRead the value of one place from twelve monthly NDVI rasters, in QGIS with a virtual stack and in Python with rasterio, turn it into a table, and check what one pixel does and does not tell you.TheoryQGISPython

