Introduction to DEA Land Cover 9a4ba8db79334eb0b5bc8a2ae03e9239


Land cover is the physical surface of the Earth, including trees, shrubs, grasses, soils, exposed rocks, water bodies, plantations, crops and built structures. Land cover changes for many reasons, including seasonal weather, severe weather events, and human activities. Remote sensing data recorded over time allows the observation of land cover dynamics. DEA Land Cover aims to provide a national land cover data set that places current land cover status and changes into a historical context at a national, regional and local scale.

What this product offers

Digital Earth Australia Land Cover (DEA Land Cover) is a continental dataset that maps annual land cover classifications for Australia from 1988 to the present. DEA Land Cover is at a 25 m resolution, meaning each pixel represents a 25 m × 25 m area on the ground. Each pixel shows the predominant land cover condition for the selected year. The product combines Landsat satellite data and related data products from Geoscience Australia’s Digital Earth Australia program.

The classification system used in DEA Land Cover follows the Food and Agriculture Organization of the United Nations land cover classification taxonomy, allowing for comparison and integration with other national and international datasets. The product defines six base land cover classes (Level 3), seven land cover environmental descriptors, and a final land cover classification (Level 4) that combines both base classes and environmental descriptors. More information about each class can be found further down in this notebook (see Plotting data), and on the DEA Land Cover product details page.


DEA Land Cover allows users to analyse land cover over a range of spatial, temporal and thematic scales. Scientists, resource managers and policymakers can use the product to support environmental monitoring, emergency management, sustainable natural resource management, and more. Specific examples include:

  • Environmental monitoring: ecosystem mapping, understanding surface water dynamics, erosion management

  • Primary industries: understanding crop responses to water availability, understanding and mitigating impact of drought, monitoring vegetation change

  • Community interests: mapping urban expansion, mapping impacts of natural disasters, bushfire recovery.


  • Lucas R, Mueller N, Siggins A, Owers C, Clewley D, Bunting P, Kooymans C, Tissott B, Lewis B, Lymburner L, Metternicht G (2019) ‘Land Cover Mapping using Digital Earth Australia’, Data, 4(4):143, doi: 10.3390/data4040143.

  • Owers C, Lucas R, Clewley D, Planque C, Punalekar S, Tissott B, Chua S, Bunting P, Mueller N, Metternicht G (2021) ‘Living Earth: Implementing national standardised land cover classification systems for Earth Observation in support of sustainable development’, Big Earth Data, 5(3):368-390, doi:10.1080/20964471.2021.1948179.

Note: For more technical information about DEA Land Cover, visit the official Geoscience Australia DEA Land Cover product description page.


This notebook will demonstrate how to load and visualise DEA Land Cover data using Digital Earth Australia. Topics covered include:

  1. Inspecting available measurements in DEA Land Cover.

  2. Choosing and loading DEA Land Cover data for an area of interest.

  3. Plotting DEA Land Cover data.

Getting started

To run this analysis, run all the cells in the notebook starting with the ‘Load packages’ cell.

Load packages

Load key Python packages and supporting functions for the analysis.

%matplotlib inline

import sys

import datacube
import matplotlib.pyplot as plt
import numpy as np

sys.path.insert(1, "../Tools/")
from dea_tools.plotting import rgb, display_map
from dea_tools.landcover import plot_land_cover
from matplotlib import colors as mcolours

Connect to the datacube

Connect to the datacube database, which provides functionality for loading and displaying stored Earth observation data.

dc = datacube.Datacube(app="DEA_Land_Cover")

View measurements list

We can generate a table listing all of the measurements in DEA Land Cover using the dc.list_measurements() function. The table also shows information about measurement data types, nodata values, and aliases. Aliases (e.g. lifeform) can be used instead of the official measurement name (e.g. lifeform_veg_cat_l4a) when loading data (see Load and view DEA Land Cover data).

product = "ga_ls_landcover_class_cyear_2"

measurements = dc.list_measurements()
name dtype units nodata aliases flags_definition
level3 level3 uint8 1 0 NaN NaN
lifeform_veg_cat_l4a lifeform_veg_cat_l4a uint8 1 0 [lifeform] NaN
canopyco_veg_cat_l4d canopyco_veg_cat_l4d uint8 1 0 [vegetation_cover] NaN
watersea_veg_cat_l4a_au watersea_veg_cat_l4a_au uint8 1 0 [water_seasonality] NaN
waterstt_wat_cat_l4a waterstt_wat_cat_l4a uint8 1 0 [water_state] NaN
inttidal_wat_cat_l4a inttidal_wat_cat_l4a uint8 1 0 [intertidal] NaN
waterper_wat_cat_l4d_au waterper_wat_cat_l4d_au uint8 1 0 [water_persistence] NaN
baregrad_phy_cat_l4d_au baregrad_phy_cat_l4d_au uint8 1 0 [bare_gradation] NaN
level4 level4 uint8 1 0 [full_classification] NaN

Select and view your study area

If running the notebook for the first time, keep the default settings below. This will demonstrate how the analysis works and provide meaningful results. The following example loads land cover data for Broome, Western Australia.

# Coordinates for Broome, Western Australia
lat = -18.10
lon = 122.32
lat_buffer = 0.18
lon_buffer = 0.18

# Combine central coordinates with buffer values to create the latitude and longitude range for the analysis
lat_range = (lat - lat_buffer, lat + lat_buffer)
lon_range = (lon - lon_buffer, lon + lon_buffer)

# Set the range of dates for the analysis
time_range = ("2017", "2020")

The following cell will display the selected area on an interactive map. You can zoom in and out to better understand the area you’ll be analysing. Clicking on any point on the map will reveal that point’s latitude and longitude coordinates.

display_map(x=lon_range, y=lat_range)
Make this Notebook Trusted to load map: File -> Trust Notebook

Load and view DEA Land Cover data

The following cell will load data for the lat_range, lon_range and time_range we defined above. We can do this using the dc.load() function.

Note: The following cell loads all available measurements in DEA Land Cover, however, the query can be adapted to only load measurements of interest.

# Create the 'query' dictionary object, which contains the longitudes, latitudes and time defined above
query = {
    "y": lat_range,
    "x": lon_range,
    "time": time_range,

# Load DEA Land Cover data from the datacube
lc = dc.load(
    resolution=(-25, 25),

We can now view the data. The measurements listed under Data variables should match the measurements listed in the above query.

More information on interpreting xarray.Dataset results can be found in our Beginner’s guide.

Dimensions:              (time: 4, y: 1706, x: 1641)
  * time                 (time) datetime64[ns] 2017-01-01 ... 2020-01-01
  * y                    (y) float64 -1.951e+06 -1.951e+06 ... -1.993e+06
  * x                    (x) float64 -1.044e+06 -1.044e+06 ... -1.003e+06
    spatial_ref          int32 3577
Data variables:
    level3               (time, y, x) uint8 220 220 220 220 ... 112 112 112 112
    lifeform             (time, y, x) uint8 0 0 0 0 0 0 0 0 ... 2 2 2 2 2 2 2 2
    vegetation_cover     (time, y, x) uint8 0 0 0 0 0 0 0 ... 13 13 13 13 13 13
    water_seasonality    (time, y, x) uint8 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
    water_state          (time, y, x) uint8 1 1 1 1 1 1 1 1 ... 0 0 0 0 0 0 0 0
    intertidal           (time, y, x) uint8 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
    water_persistence    (time, y, x) uint8 1 1 1 1 1 1 1 1 ... 0 0 0 0 0 0 0 0
    bare_gradation       (time, y, x) uint8 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
    full_classification  (time, y, x) uint8 101 101 101 101 101 ... 34 34 34 34
    crs:           EPSG:3577
    grid_mapping:  spatial_ref

Plotting data

The following section will show you how to plot DEA Land Cover data using two different methods: the plot_layer() function that allows you to define your own colour map, and the plot_land_cover() function that uses DEA’s standard colour maps.

Level 3 visualisation

The Level 3 classification contains six base classes:

  • 111: Cultivated terrestrial vegetation Cultivated vegetation is vegetation that has been changed by human influence, such as planted crops or improved pasture. This is different from areas left to minor grazing or fallow.

  • 112: Natural terrestrial vegetation Natural vegetation is vegetation that has not been changed by human influence. This includes native forests as well as pastures or paddocks left unchanged for the year. It does not identify whether the vegetation is native or otherwise.

  • 124: Natural aquatic vegetation Aquatic vegetation is vegetation that gets regularly inundated with water. Mangroves are the main type of aquatic vegetation featured in DEA Land Cover.

  • 215: Artificial surface Artificial surfaces are human-made, unvegetated areas. This includes the roofs of houses, concrete areas, road surfaces and other similar surfaces that we associate with civilisation.

  • 216: Natural bare surface Natural bare surface is mostly soil. It is very likely that there is still vegetation in the area, but it is dominated by soil.

  • 220: Water Water captures terrestrial and coastal open water such as dams, lakes, large rivers and the coastal and near-shore zone.

To plot the level3 data, we will use the plot_layer() function. The plot_layer() function allows you to define your own colour map as shown in the cell below. The keys respond to the Level 3 classifications, and the values are colour specifications (red, green, blue, alpha) and labels to be used in the legend.

# Define a colour scheme for the Level 3
    0: (255, 255, 255, 255, "No Data"),
    111: (172, 188, 45, 255, "Cultivated terrestrial vegetation"),
    112: (14, 121, 18, 255, "Natural terrestrial vegetation"),
    124: (30, 191, 121, 255, "Natural aquatic vegetation"),
    215: (218, 92, 105, 255, "Artificial surface"),
    216: (243, 171, 105, 255, "Natural bare surface"),
    220: (77, 159, 220, 255, "Water"),

The following cell defines the plot_layer() function which takes DEA Land Cover data and a colour map as arguments.

# Plot layer from colour map
def plot_layer(colours, data):
    colour_arr = []

    for key, value in colours.items():
        colour_arr.append(np.array(value[:-2]) / 255)

    cmap = mcolours.ListedColormap(colour_arr)
    bounds = list(colours)
    norm = mcolours.BoundaryNorm(np.array(bounds) - 0.1, cmap.N)

    lables = {'ticks' : [0,111,112,124,215,216,220],}

    if len(data.time) == 1:
          # Plot the provided layer
        im = data.isel(time=0).plot(
        cmap=cmap, norm=norm, add_colorbar=True, size=5, cbar_kwargs=lables

        # Plot the provided layer
        im = data.plot(
        cmap=cmap, norm=norm, add_colorbar=True, col="time", col_wrap=4, size=5, cbar_kwargs=lables

    return im

We can now plot the data:

plot_layer(LEVEL3_COLOUR_SCHEME, lc.level3)
<xarray.plot.facetgrid.FacetGrid at 0x7ffb0b0e6730>

In the following sections, we will plot data using the plot_land_cover() function. More details about the function can be found in

Visualising environmental descriptors

There are seven environmental descriptors in DEA Land Cover: lifeform, vegetation cover, water seasonality, water state, intertidal area, water persistence, and bare gradation.

The following section provides more detail about each environmental descriptor, then uses the plot_land_cover() function to visualise them.


Lifeform describes the predominant vegetation type in vegetated areas. It is categorised as follows:

  • 0: No data or not vegetated

  • 1: Woody vegetation (trees, shrubs)

  • 2: Herbaceous vegetation (grasses, forbs)

Lifeform provides detail to the following Level 3 classes: cultivated terrestrial vegetation (111), natural terrestrial vegetation (112), and natural aquatic vegetation (124).

<matplotlib.image.AxesImage at 0x7ffae95acdc0>

Vegetation cover

Vegetation cover describes the percentage of cover in vegetated areas. It is categorised as follows:

  • 0: Not applicable (such as in bare areas)

  • 10: Closed (>65%)

  • 12: Open (40 to 65%)

  • 13: Open (15 to 40%)

  • 15: Sparse (4 to 15%)

  • 16: Scattered (1 to 4%)

Vegetation cover provides detail to the following Level 3 classes: cultivated terrestrial vegetation (111), natural terrestrial vegetation (112), and natural aquatic vegetation (124).

<matplotlib.image.AxesImage at 0x7ffb043f7700>

Water seasonality

Water seasonality describes the length of time an aquatic vegetated area was measured as being inundated. It is categorised as follows:

  • 0: No data or not an aquatic environment

  • 1: Semi-permanent or permanent (> 3 months)

  • 2: Temporary or seasonal (< 3 months)

Water seasonality provides detail to the following Level 3 class: natural aquatic vegetation class (124).

<matplotlib.image.AxesImage at 0x7ffae920d7f0>

As water seasonlity only relates to wet vegetation, it’s hard to see the seasonality changes at this scale. We can easily ‘zoom in’ to see more detail.

plot_land_cover(lc.water_seasonality[:, 100:300, 400:600])
<matplotlib.image.AxesImage at 0x7ffae9018dc0>

Water state

Water state describes whether the detected water is snow, ice or liquid water. It is categorised as follows:

  • 0: No data or not water

  • 1: Water

Water state provides detail to the following Level 3 class: water (220).

Note: Only liquid water is described in this release.

<matplotlib.image.AxesImage at 0x7ffae8e2f760>


Intertidal delineates the intertidal zone. It is categorised as follows:

  • 0: No data or not intertidal

  • 3: Intertidal zone

Intertidal provides detail to the following Level 3 class: water (220).

<matplotlib.image.AxesImage at 0x7ffae8c30190>

Water persistence

Water persistence describes the number of months a water body contains water. It is categorised as follows:

  • 0: No data or not water

  • 1: > 9 months

  • 7: 7-9 months

  • 8: 4-6 months

  • 9: 1-3 months

Water persistence provides detail to the following Level 3 class: water (220).

<matplotlib.image.AxesImage at 0x7ffae8a25f40>

Bare gradation

Bare gradation describes the percentage of bare cover in naturally bare areas. It is categorised as follows:

  • 0: No data or not a natural bare surface

  • 10: Sparsely vegetated (< 20 % bare)

  • 12: Very sparsely vegetated (20 to 60 % bare)

  • 15: Bare areas, unvegetated (> 60 % bare)

Bare gradation provides detail to the following Level 3 class: natural bare surface (216).

<matplotlib.image.AxesImage at 0x7ffae8fd8160>

Level 4 visualisation

The Level 4 classification combines the Level 3 classes with the seven environmental descriptors. For the full list of classification values, visit DEA Land Cover product details.

plot_land_cover(lc.full_classification, year='2010')
<matplotlib.image.AxesImage at 0x7ffae865dca0>

Next steps

There are several supplementary notebooks in this repository that demonstrate different DEA Land Cover data visualisation and analysis functions:

Additional information

License: The code in this notebook is licensed under the Apache License, Version 2.0. Digital Earth Australia data is licensed under the Creative Commons by Attribution 4.0 license.

Contact: If you need assistance, please post a question on the Open Data Cube Slack channel or on the GIS Stack Exchange using the open-data-cube tag (you can view previously asked questions here). If you would like to report an issue with this notebook, you can file one on GitHub.

Last modified: December 2023

Compatible datacube version:



**Tags**: :index:`sandbox compatible`, :index:`landsat 5`, :index:`landsat 7`, :index:`landsat 8`, :index:`DEA Land Cover`, :index:`time series`, :index: `LCCS`, :index:`colour maps`, :index:`data visualisation`