Using satellite imagery to identify shelterbelts and measure their impacts on agricultural productivity
Project description
shelterbelts
This repo is for using satellite imagery to map and categorise shelterbelts across Australia, in preparation for measuring impacts on agricultural productivity at scale.
Google Earth Engine App
You can visualise some results from the repo in this Earth Engine App:
https://christopher-bradley-phd.projects.earthengine.app/view/shelterbelts
Or a mobile friendly version at:
https://christopher-bradley-phd.projects.earthengine.app/view/shelterbelts-mobile
Notebook Examples
There are jupyter notebooks to demo the functionality of this repo in examples.
Documentation
View the published docs at:
https://christopherbradley.github.io/shelterbelts/index.html
Installation
pip install shelterbelts
View the pypi package at: https://pypi.org/project/shelterbelts
Current Methods
The tree predictions come from annual Sentinel-2 imagery largely following a method by Stewart et al. (2025), using a tree/no-tree training dataset provided by Nicolas Pucino.
After the predictions, pixels were categorised using the following method:
- Assign trees from model confidence (50% threshold)
- Assign scattered trees to small groups (< 20 pixels)
- Assign core & buffers to big groups (> 3 pixels thick)
- Assign sheltered vs unsheltered pixels based on percent cover within 100m (5% threshold) , or wind direction (20 pixels leeward, 10 pixels upwind)
- Assign grassland, cropland, urban and water categories from WorldCover 2021
- Assign riparian and roads trees (3 pixel buffer)
- Assign linear vs non-linear patches by fitting an ellipse and skeleton to each group and applying length and width thresholds.
Upcoming Plans
- Calculate summary statistics for different regions (IBRA, LGAs, GRDC agricultural zones)
- Include 1m shelter categories for all of ACT & NSW
- Analyse effects on productivity & potential future benefits
- Add layers with opportunities for more trees.
Parameter Reference
The main parameters for categorising shelterbelts are below:
| Parameter | Default | Low Threshold | High Threshold | Description |
|---|---|---|---|---|
min_patch_size |
20 | 15 | 25 | Minimum area (pixels) to classify as a patch rather than scattered trees |
min_core_size |
1000 | 100 | 10000 | Minimum patch size (pixels) to classify as a core area |
edge_size |
3 | 2 | 5 | Distance (pixels) defining the edge region around patch cores |
buffer_width |
4 | 3 | 5 | Number of pixels away from the feature that still counts as within the buffer |
distance_threshold |
20 | 10 | 30 | Distance from trees that counts as sheltered |
density_threshold |
5 | 3 | 10 | Percentage tree cover within distance_threshold that counts as sheltered |
wind_threshold |
20 | 15 | 25 | Wind speed threshold in km/h |
wind_method |
WINDWARD | MOST_COMMON | ANY | Method to determine primary wind direction |
min_shelterbelt_length |
20 | 15 | 25 | Minimum skeleton length (in pixels) to classify a cluster as linear |
max_shelterbelt_width |
6 | 5 | 7 | Maximum skeleton width (in pixels) to classify a cluster as linear |
Parameters can be modified when calling functions directly in Python or via command-line arguments. For example:
python -m shelterbelts.indices.tree_categories input.tif --min_patch_size 30 --edge_size 5
Setup
Local Setup
- Download and install Miniconda from https://www.anaconda.com/download/success
- Add the miniconda filepath to your ~/.zhrc, e.g. export PATH="/opt/miniconda3/bin:$PATH"
git clone https://github.com/ChristopherBradley/shelterbelts.gitcd shelterbeltsconda env create -f environment.ymlconda activate shelterbelts
Setup on gadi at the National Computing Infrastructure (NCI)
- Create an account and request access to the projects xe2 (Borevitz Lab), v10 (Digital Earth Australia modules), ka08 (Sentinel-2 Imagery), ob53 (BARRA Wind).
ssh {username}@nci.org.auand enter the password used to create your account.git clone https://github.com/ChristopherBradley/shelterbelts.git- There are examples usage of the environments in pbs_scripts
- (optional) I like to have git ignore the .ipynb files, so that images don't clog up the git history
git ls-files "*.ipynb" | xargs git update-index --skip-worktree
Usage on NCI ARE (National Computing Infrastructure's Australian Research Environment)
- Login here: https://are.nci.org.au/
- Go to JupyterLab and create a session with 1 hour, queue normalbw, compute size small, project xe2, storage gdata/+gdata/xe2+gdata/v10+gdata/ka08+gdata/ob53, python environment base /g/data/xe2/cb8590/miniconda, conda environment /g/data/xe2/cb8590/miniconda/envs/shelterbelts. Except for demo_sentinel_nci.py, use Module Directories /g/data/v10/public/modules/modulefiles and Modules: dea/20231204.
- Right click any .py file and open as a jupyter notebook.
Testing
If on gadi:
qsub -I -P xe2 -q copyq -l ncpus=1 -l mem=8GB -l walltime=02:00:00 -l storage=gdata/xe2+scratch/xe2+gdata/v10+gdata/ka08 -l wd
Then:
conda activate shelterbelts
pytest tests # everything should pass except test_sentinel_nci.py
Finally:
module use /g/data/v10/public/modules/modulefiles
module load dea/20231204
pytest tests/test_classifications/test_sentinel_nci.py
Generating the Documentation
Generate the html:
make clean && make html
You can view the documenation locally in a browser by opening docs/build/index.html
Run the doctests:
make doctest
Upload the html to github pages:
ghp-import -n -p -f docs/build/html
Uploading to PyPI
- rm dist/*
- Update the version in pyproject.toml
- python3 -m build
- twine upload dist/*
- Enter the API token
- Check it out at https://pypi.org/project/shelterbelts
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file shelterbelts-0.0.3.tar.gz.
File metadata
- Download URL: shelterbelts-0.0.3.tar.gz
- Upload date:
- Size: 93.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20fc5e4b9d46e94a8381f7bafebaf55822862ba515cc87430f42d17cad377b5e
|
|
| MD5 |
5526411be52fee5e41840b41ab5f0f78
|
|
| BLAKE2b-256 |
b1c0f6f4494300d79a8c6432a310afd45c6b546766e2676d62f6fde570a445db
|
File details
Details for the file shelterbelts-0.0.3-py3-none-any.whl.
File metadata
- Download URL: shelterbelts-0.0.3-py3-none-any.whl
- Upload date:
- Size: 114.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51620c79874a6cbe799310ea36c49cf870466807615c6c1a5024cf01191de3ea
|
|
| MD5 |
0d339cab7d562eb430948f9916eb765d
|
|
| BLAKE2b-256 |
cc1ef7a6eb7dcf4973670ba30ab5179a5ba24689a47f98a43c382985bb792c10
|