
Google Earth Engine is a cloud-based platform that enables working with large-scale earth observation datasets effectively. The Google Earth Engine Plugin for QGIS brings this power to the desktop and enables QGIS users to combine their geospatial workflows with cloud-based datasets. This workshop will give you hands-on experience using plugin to leverage cloud-based datasets in desktop-based geospatial workflows.
This workshop requires QGIS LTR version 3.40 but any recent version will be fine. If you need to install QGIS, please review QGIS-LTR Installation Guide for step-by-step instructions.
If you already have a Google Earth Engine account, you can skip this step.
Visit our GEE Sign-Up Guide for step-by-step instructions.
This workshops requires the Google Earth Engine Plugin for QGIS.The plugin can be installed by the Plugin Manager from the official QGIS plugin repository and involves a few extra steps to authenticate with your Google Earth Engine account and set the Google Cloud project.
Visit the QGIS Earth Engine Plugin Installation Guide for step-by-step instructions.
We have created a data package containing checkpoint projects that will allow you to load the results of each section. You can download the data package from qgis-gee-workshop.zip. Once downloaded, unzip the contents to a folder on your computer.
Earth Engine supported georeferenced raster and vector datasets. The terminology used by Earth Engine is different than used by QGIS. Below is the explanation of common data types in Earth Engine.
The Google Earth Engine team maintains a large catalog of ready-to-use datasets that can be readily accessed via the plugin. You can search and browse the datasets at the Earth Engine Data Catalog.

The Earth Engine Community, led by Samapriya Roy maintains another large catalog of datasets that have been processed and ingested in Earth Engine. This catalog can be accessed from awesome-gee-community-catalog. The dataset available in this catalog can also be used directly in the QGIS Earth Engine plugin.

Earth Engine users can also upload their own datasets and use them in the plugin. This is useful if you wanted to access your private assets through the QGIS Earth Engine plugin. You must be either the owner of the asset or need read access to the asset.
The Google Earth Engine plugin comes with a handy Export Image to GeoTIFF algorithm that allows you to download images from GEE directly to your computer as GeoTIFF files. In this tutorial, we will use the plugin to create a Sentinel-2 median composite for a region and download it as a GeoTIFF file.

> paris. Make sure there is a space between the
> character and the search term. From the results, click
on the first one to zoom to the location.


COPERNICUS/S2_SR_HARMONIZED shown on
the page.
COPERNICUS/S2_SR_HARMONIZED. Next, we can
apply a metadata filter to select images with less cloud. In the
Filter by Image Properties section, select
CLOUDY_PIXEL_PERCENTAGE as the property, <
as the operator and enter 30 as the value. This will select
all images with < 30% cloud cover.
In the Compositing section, select Median
as the Compositing Method. This method will take all available
images and calculate the median value for each pixel. For optical
imagery, such as Sentinel-2, this method is useful in selecting the best
representative pixel for the chosen duration without being affected by
outliers such as clouds and cloud-shadow. We want to create an annual
composite, so in the Filter by Dates section, enter the
Start and End dates as 01-01-2024 and
01-01-2025.
Remember that the End date in the Earth Engine date filter is exclusive - so we need to add an extra day to ensure do not exclude the last day of the year.

Map Canvas Extent button to load the selected region in the
canvas.
B4 (Red) , B3 (Green) and
B2 (Blue) as the bands. The typical range of pixel values
for Sentinel-2 images are between 0-3000, so enter 0 as
Min and 3000 as Max. Check the Clip
to Extent box to load only the pixels within the selected extent
and click Run.
IC: COPERNICUS/S2_SR_HARMONIZED (Median) will be added to
the Layers panel. This layer is being streamed from the Earth
Engine servers. As you zoom or pan the image - new pixels will be
computed on-the-fly and displayed. Lets download this image so we can
use it within QGIS for analysis. Locate the
Export → Export Image to GeoTIFF algorithm from the Google
Earth Engine provider in the Processing Toolbox. Double-click to open
it.If the image appears blank, move the map slightly using the Pan tool. This will refresh the canvas and request loading of the tiles from Earth Engine.

IC: COPERNICUS/S2_SR_HARMONIZED (Median) as the EE Image.
We want to export this at its native resolution, so enter
10 as the Scale (meters). We can also specify the
projection in which we want the output image. Click the Select
CRS button.
WGS84 / UTM zone 31N (EPSG:32631) CRS. Once selected, click
the arrow at the top of the selector to go back to the previous
dialog.

s2_median_composite.tif. Once
configured, click Run.

IC: COPERNICUS/S2_SR_HARMONIZED (Median) layer as it is no
longer required. In the Browser panel, locate the directory
where you saved the output file. Drag and drop the
s2_median_composite.tif file to the canvas to see the
downloaded image.
The processing algorithms provided by the Google Earth Engine plugin can be used in the QGIS Model Designer to automate workflows that combine data from the Earth Engine Data Catalog with processing algorithms from QGIS.
In this section, we will build a model that will run the following steps in a single workflow:
QGIS Model for Calculating Landcover Statistics
There are many landcover datasets available in the Earth Engine Data Catalog as well as GEE Community Catalog. A similar process can be used to load any of the available datasets.
We will use the ESA WorldCover 10m v200 global land cover map for 2021 at 10 m resolution. Visit the dataset description page and note the ImageCollection ID.

This dataset contains a data band named Map and 11-class classification with each class assigned a value between 10-100.

bangalore.geojson file and double-click to open it. This
will load a vector layer containing a single feature representing the
municipal boundary for the city of Bengaluru, India. Next, open the
Processing Toolbox from Processing → Toolbox. From the toolbar,
select Models → Create New Model...
Calculate Landcover Statistics and click the Save
model button. When prompted to enter the file name, enter
calculate_landcover_statistics.model3.
Input Vector Layer as the Description and select
Polygon as the Geometry type. Click
OK.
Projection for Area Calculation as the
Description. As the layer we are using falls in the UTM Zone
43N, we can enter the Default value of the CRS as
EPSG:32643 - WGS84 / UTM Zone 43N. Click OK.
Input Vector Layer parameter. Similarly for Target
CRS select the Projection for Area Calculation
parameter. Click OK.

ESA/WorldCover/v200 for the ESA WorldCover dataset. For the
Extent, switch to Using algorithm output and select
"Reprojected" from algorithm "Reproject layer". For the
Extent CRS, select Using model input and select
Projection for Area Calculation.
Mosaic for the Compositing
Method and click OK.

"Layer Name"from algorithm "Add Image Collection". For
Extent, switch to Using algorithm output and select
"Reprojected" from algorithm "Reproject layer". The spatial
resolution of the dataset is 10m, so enter 10 as the
Scale (meters). Enter Map as the Bands to
export. Click OK.

"Output File" from algorithm "Export Image to GeoTIFF".
Specify the Mask layer by switching to Using algorithm
output and selecting
"Reprojected" from algorithm "Reproject layer". Click
OK.
Note: The Raster layer unique values report algorithm gives you the areas for the entire raster layer. If you want to calculate areas for different regions over the raster, you can use the Zonal histogram tool to get pixel counts for each class and then multiply it with the area of each pixel.

"Clipped (mask)" from algorithm "Clip raster by mask layer".
Keep other parameter values to their default and click OK.

"Unique values table" from algorithm "Raster layer unique values report".
Enter the Field name as area_sqkm and Result
field type as Decimal (double). For the
Formula, we will divide the area in square meters by 1000 x
1000 (i.e. 1e6) to convert it to square kilometers. Enter the expression
as "m2"/1e6.
class_areas and click OK.

bangalore as the Input Vector Layer. Keep the
other values to their default and click Run.
class_areas
will be added to the Layers panel. Open the attribute table and
you will see new column with class area statistics computed from the ESA
WorldCover dataset..


If you’d like to catch up to this point, you can load the
Model_Designer_Checkpoint1.qgz file in the
solutions folder of the data package.
At this point, the model works and generates the landcover statistics for any input region in the world. Let’s learn how to get the model production ready by adding some validation checks and adding visual cues to make model maintenance easy.



layer_property() to
get a count of features for the input layer. Enter the expression as
shown below and click OK..layer_property(@input_vector_layer, 'feature_count')


The Input Layer has more than 1 feature as the Error
message. For the Condition, switch to Pre-calculated
Value, enter the following expression. This configuration will
throw an error when the number of features is greater than 1. @Calculate_expression_OUTPUT > 1



Calculate expression and
Raise exception algorithms and click OK. This will
ensure these algorithms are completed before this step.


Earth Engine and select a color of your
choice.


If you’d like to catch up to this point, you can load the
Model_Designer_Checkpoint2.qgz file in the
solutions folder of the data package.
This workshop material is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0). You are free to re-use and adapt the material but are required to give appropriate credit to the original author as below:
Cloud-based Remote Sensing with QGIS and Google Earth Engine by Ujaval Gandhi www.spatialthoughts.com
© 2025 Spatial Thoughts www.spatialthoughts.com
If you want to report any issues with this page, please comment below.