TERN AusPlots is a national plot-based terrestrial ecosystem surveillance monitoring method and dataset for Australia (Sparrow et al. 2020). Through ausplotsR, users can directly access AusPlots data collected by on-ground observers on vegetation and soils, including physical sample/voucher details and barcode numbers. The dataset can be downloaded in its entirety or as individual modules, or as a subset by geographic bounding box or species name or site search. The package also includes a series of bespoke functions for working with AusPlots data, including visualisation, creating tables of species composition, and calculation of tree basal area, fractional cover or vegetation cover by growth form/structure/strata and so on.
This is a short guide for getting started with analysis of AusPlots data through the ausplotsR R package. More information on making use of AusPlots data in ausplotsR is available through the package help files and manual. Below, we demonstrate installing the package, accessing some AusPlots data, generating matrices and running simple example analyses.
More comprehensive (but not necessarily updated) tutorials on accessing and analysing AusPlots data (Blanco-Martin 2019) are available at: https://github.com/ternaustralia/TERN-Data-Skills/tree/master/EcosystemSurveillance_PlotData
The latest version of ausplotsR can be installed
from CRAN or directly from github using the devtools
package, which must be installed first.
library(devtools)
install_github("ternaustralia/ausplotsR", build_vignettes = TRUE, dependencies = TRUE)
Once installed, load the package as follows. Note, packages ggplot2 and mapdata are required for ausplotsR to load, and functions are also imported from packages: vegan, plyr, R.utils, httr, jsonlite, gtools, jose, curl, r2r, stringr, and betapart, while knitr and rmarkdown are required to build this package vignette (i.e., if ‘build_vignettes’ is set to TRUE above).
We can now access live data, starting here with basic site
information and vegetation point-intercept modules and using a bounding
box to spatially filter the dataset to central Australia. All data
modules are extracted via a single function,
get_ausplots
:
my.ausplots.data <- try(get_ausplots(veg.PI = TRUE, veg.vouchers = TRUE, bounding_box = c(125,
140, -40, -10)))
#> Calling the database. Please wait...
#> 200
#> Calling the database. Please wait...
#> 200
#> Calling the database. Please wait...
#> 200
#> Calling the database. Please wait...
#> 200
The output of the above call is a list with the following
$elements
:
The ‘site.info’ table contains basic site and visit details. Here are a selected few of the many fields:
head(my.ausplots.data$site.info[, c("site_location_name", "site_unique", "longitude",
"latitude", "bioregion_name")])
#> site_location_name site_unique longitude latitude bioregion_name
#> 1 NTAARP0001 NTAARP0001-58422 132.2701 -13.55729 ARP
#> 2 NTAARP0002 NTAARP0002-58423 132.2944 -13.54561 ARP
#> 3 NTAARP0003 NTAARP0003-58424 132.4571 -13.51697 ARP
#> 4 NTAARP0004 NTAARP0004-58918 132.9865 -12.69178 ARP
#> 5 NTAARP0004 NTAARP0004-58932 132.9865 -12.69178 ARP
#> 6 NTAARP0005 NTAARP0005-58919 132.9850 -12.72723 ARP
Each survey is identified by the ‘site_unique’
field, which is unique combination of site ID (‘site_location_name’) and
visit ID (‘site_location_visit_id’). The ‘site_unique’ field
therefore links all tables returned from the get_ausplots
function.
The ‘site.info’ table and can be used to identify, subset or group surveys in space and time, for example:
The package has an in-built function - see
?ausplots_visual
- to rapidly map AusPlots over Australia
and to visualise the relative cover/abundance of green vegetation, plant
growth forms and species. Maps can also be generated manually using the
longitude and latitude fields in the $site.info
table.
Alternatively, the following call generates a pdf with a map of all
sites and attribute graphics for selected AusPlots:
ausplotsR::ausplots_visual()
Here is a snippet of the raw point-intercept data that will be used in the following examples to derive vegetation attributes:
head(subset(my.ausplots.data$veg.PI, !is.na(herbarium_determination)))
#> site_unique site_location_name site_location_visit_id transect
#> 2 SAARIV0007-57096 SAARIV0007 57096 S1-N1
#> 3 SAARIV0007-57096 SAARIV0007 57096 S1-N1
#> 5 SAARIV0007-57096 SAARIV0007 57096 S1-N1
#> 6 SAARIV0007-57096 SAARIV0007 57096 S1-N1
#> 7 SAARIV0007-57096 SAARIV0007 57096 S1-N1
#> 9 SAARIV0007-57096 SAARIV0007 57096 S1-N1
#> point_number herbarium_determination substrate in_canopy_sky dead
#> 2 1 Duma florulenta Litter FALSE TRUE
#> 3 2 Duma florulenta CWD FALSE FALSE
#> 5 4 Duma florulenta Litter FALSE TRUE
#> 6 5 Duma florulenta Litter FALSE FALSE
#> 7 6 Duma florulenta Litter FALSE FALSE
#> 9 8 Duma florulenta Bare FALSE TRUE
#> growth_form height veg_barcode standardised_name
#> 2 Shrub 0.5 SAA005421 Duma florulenta
#> 3 Shrub 1.2 SAA005421 Duma florulenta
#> 5 Shrub 0.5 SAA005421 Duma florulenta
#> 6 Shrub 1.2 SAA005421 Duma florulenta
#> 7 Shrub 2.0 SAA005421 Duma florulenta
#> 9 Shrub 0.7 SAA005421 Duma florulenta
#> standardised_scientific_name kingdom
#> 2 Duma florulenta (Meisn.) T.M.Schust. Plantae
#> 3 Duma florulenta (Meisn.) T.M.Schust. Plantae
#> 5 Duma florulenta (Meisn.) T.M.Schust. Plantae
#> 6 Duma florulenta (Meisn.) T.M.Schust. Plantae
#> 7 Duma florulenta (Meisn.) T.M.Schust. Plantae
#> 9 Duma florulenta (Meisn.) T.M.Schust. Plantae
#> taxa_id family genus
#> 2 https://id.biodiversity.org.au/name/apni/229634 Polygonaceae Duma
#> 3 https://id.biodiversity.org.au/name/apni/229634 Polygonaceae Duma
#> 5 https://id.biodiversity.org.au/name/apni/229634 Polygonaceae Duma
#> 6 https://id.biodiversity.org.au/name/apni/229634 Polygonaceae Duma
#> 7 https://id.biodiversity.org.au/name/apni/229634 Polygonaceae Duma
#> 9 https://id.biodiversity.org.au/name/apni/229634 Polygonaceae Duma
#> specific_epithet infraspecific_rank infraspecific_epithet taxa_status
#> 2 florulenta NA NA accepted
#> 3 florulenta NA NA accepted
#> 5 florulenta NA NA accepted
#> 6 florulenta NA NA accepted
#> 7 florulenta NA NA accepted
#> 9 florulenta NA NA accepted
#> taxa_group genus_species authorship
#> 2 Equisetopsida Duma florulenta (Meisn.) T.M.Schust.
#> 3 Equisetopsida Duma florulenta (Meisn.) T.M.Schust.
#> 5 Equisetopsida Duma florulenta (Meisn.) T.M.Schust.
#> 6 Equisetopsida Duma florulenta (Meisn.) T.M.Schust.
#> 7 Equisetopsida Duma florulenta (Meisn.) T.M.Schust.
#> 9 Equisetopsida Duma florulenta (Meisn.) T.M.Schust.
#> published_in rank hits_unique
#> 2 https://id.biodiversity.org.au/reference/apni/53841 Species S1-N1 1
#> 3 https://id.biodiversity.org.au/reference/apni/53841 Species S1-N1 2
#> 5 https://id.biodiversity.org.au/reference/apni/53841 Species S1-N1 4
#> 6 https://id.biodiversity.org.au/reference/apni/53841 Species S1-N1 5
#> 7 https://id.biodiversity.org.au/reference/apni/53841 Species S1-N1 6
#> 9 https://id.biodiversity.org.au/reference/apni/53841 Species S1-N1 8
Note that ‘veg_barcode’ links species hits to the vegetation vouchers
module, while the ‘hits_unique’ field identifies the individual
point-intercept by transect and point number (see
help(ausplotsR)
and references for more details on the plot
layout and survey method). At each point, plant species (if any), growth
form and height are recorded along with substrate type.
Let’s visualise basic vegetation cover as a function of latitude.
First, we call the fractional_cover
function on the
extracted point-intercept data ($veg.PI
). The function
converts the raw data to proportional cover of green/brown vegetation
and bare substrate. Note the calculation may take a few minutes for many
AusPlots, so for this example we will pull out a subset of 100 randomly
drawn sites to work with.
sites100 <- my.ausplots.data$veg.PI[which(my.ausplots.data$veg.PI$site_unique %in%
sample(my.ausplots.data$site.info$site_unique, 100)), ]
my.fractional <- fractional_cover(sites100)
head(my.fractional)
#> site_unique bare brown green other
#> NTAARP0004-58932 NTAARP0004-58932 4.8 9.7 85.5 0.0
#> NTABRT0001-58861 NTABRT0001-58861 25.2 33.8 41.0 0.0
#> NTABRT0002-53617 NTABRT0002-53617 11.8 25.7 61.5 1.0
#> NTABRT0002-58862 NTABRT0002-58862 14.9 41.3 43.9 0.0
#> NTABRT0004-58873 NTABRT0004-58873 19.5 53.6 26.6 0.3
#> NTABRT0005-58863 NTABRT0005-58863 57.8 15.1 27.0 0.0
Next, we need to merge the fractional cover scores with longlat
coordinates from the site information table. We use the ‘site_unique’
field (unique combination of site and visit IDs) to link tables returned
from the get_ausplots
function:
my.fractional <- merge(my.fractional, my.ausplots.data$site.info, by = "site_unique")[,
c("site_unique", "bare", "brown", "green", "other", "longitude", "latitude")]
my.fractional <- na.omit(my.fractional)
head(my.fractional)
#> site_unique bare brown green other longitude latitude
#> 1 NTAARP0004-58932 4.8 9.7 85.5 0.0 132.9865 -12.69178
#> 2 NTABRT0001-58861 25.2 33.8 41.0 0.0 133.2473 -22.28360
#> 3 NTABRT0002-53617 11.8 25.7 61.5 1.0 133.2506 -22.28367
#> 4 NTABRT0002-58862 14.9 41.3 43.9 0.0 133.2506 -22.28367
#> 5 NTABRT0004-58873 19.5 53.6 26.6 0.3 133.6164 -22.28981
#> 6 NTABRT0005-58863 57.8 15.1 27.0 0.0 133.6121 -22.29108
Now we can plot out the continental relationship, e.g., between the proportion of bare ground with no kind of vegetation cover above and latitude.
There appears to be a hump-backed relationship, with a higher proportion of bare ground in the arid inland at mid-latitudes. We can add a simple quadratic model to test/approximate this:
my.fractional$quadratic <- my.fractional$latitude^2
LM <- lm(bare ~ latitude + quadratic, data = my.fractional)
summary(LM)
#>
#> Call:
#> lm(formula = bare ~ latitude + quadratic, data = my.fractional)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -31.406 -11.507 -3.629 11.302 45.844
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -152.97447 23.22856 -6.586 2.49e-09 ***
#> latitude -15.80834 1.91325 -8.263 8.40e-13 ***
#> quadratic -0.31863 0.03757 -8.481 2.89e-13 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 17.44 on 95 degrees of freedom
#> Multiple R-squared: 0.4345, Adjusted R-squared: 0.4226
#> F-statistic: 36.49 on 2 and 95 DF, p-value: 1.744e-12
# generate predicted values for plotting:
MinMax <- c(min(my.fractional$latitude), max(my.fractional$latitude))
ND <- data.frame(latitude = seq(from = MinMax[1], to = MinMax[2], length.out = 50),
quadratic = seq(from = MinMax[1], to = MinMax[2], length.out = 50)^2)
ND$predict <- predict(LM, newdata = ND)
#
plot(bare ~ latitude, data = my.fractional, pch = 20, bty = "n")
points(ND$latitude, ND$predict, type = "l", lwd = 2, col = "darkblue")
Aside from ‘gross’ values from plots such as fractional cover, many
analyses in community ecology begin with species abundance information.
With ausplotsR you can generate this easily from the
more complex vegetation point-intercept data. The first step to work
with species-level AusPlots data is to create a species occurrence
matrix. The species_table
function in the
ausplotsR package can be used to create this type of
matrix. This function takes a data frame of individual raw
point-intercept hits (i.e. a $veg.PI
data frame) generated
using the get_ausplots
function and returns a ‘species
against sites’ matrix:
# The species_table function below can also take the `$veg.voucher` module as
# input, but `m_kind='PA'` must be specified to get a sensible presence/absence
# output.
# The 'species_name' argument below specifies use of the 'standardised_name'
# field to identify species, which is based on herbarium_determination names
# (i.e., 'HD' option in species_name) matched to accepted scientific name
# according to a standard (APC:
# https://www.anbg.gov.au/cpbr/program/hc/hc-APC.html).
my.sppBYsites <- species_table(my.ausplots.data$veg.PI, m_kind = "percent_cover",
cover_type = "PFC", species_name = "SN")
# check the number of rows (plots) and columns (species) in the matrix
dim(my.sppBYsites)
#> [1] 473 2187
# look at the top left corner (as the matrix is large)
my.sppBYsites[1:5, 1:5]
#> Abutilon Abutilon.fraseri Abutilon.halophilum Abutilon.hannii
#> NTAARP0001-58422 0 0 0 0
#> NTAARP0002-58423 0 0 0 0
#> NTAARP0003-58424 0 0 0 0
#> NTAARP0004-58918 0 0 0 0
#> NTAARP0004-58932 0 0 0 0
#> Abutilon.hannii.subsp..prostrate..p.k.latz.427.
#> NTAARP0001-58422 0
#> NTAARP0002-58423 0
#> NTAARP0003-58424 0
#> NTAARP0004-58918 0
#> NTAARP0004-58932 0
We can crudely pull out the 10 highest ranking species in terms of their percent cover cumulative across all plots they occur in:
rev(sort(colSums(my.sppBYsites)))[1:10]
#> Na Triodia.basedowii Eucalyptus.tetrodonta
#> 672.8 634.1 417.6
#> Triodia.pungens Poaceae Triodia.bitextura
#> 412.6 395.7 389.4
#> Eucalyptus.diversifolia Eucalyptus.baxteri Eucalyptus.obliqua
#> 386.2 381.7 370.0
#> Cenchrus.ciliaris
#> 346.8
A simple example of downstream visualisation and analysis of species-level AusPlots data is Rank-Abundance Curves (also known as Whittaker Plots). Rank-Abundance Curves provide further information on species diversity. They provide a more complete picture than a single diversity index. Their x-axis represents the abundance rank (from most to least abundant) and in the y-axis the species relative abundance. Thus, they depict both Species Richness and Species Evenness (slope of the line that fits the rank; steep gradient indicates low evenness and a shallow gradient high evenness).
# Whittaker plots for some selected AusPlots with alternative relative
# abundance models fitted to the plant community data:
par(mfrow = c(2, 2), mar = c(4, 4, 1, 1))
for (i in c(1:4)) {
plot(vegan::radfit(round(my.sppBYsites[9 + i, ], digits = 0), log = "xy"), pch = 20,
legend = FALSE, bty = "l")
legend("topright", legend = c("Null", "Preemption", "Lognormal", "Zipf", "Mandelbrot"),
lwd = rep(1, 5), col = c("black", "red", "green", "blue", "cyan"), cex = 0.7,
bty = "n")
}
Perhaps you simply want to browse which plant species have been
recorded in AusPlots, without all the associated raw data? Here, the
species_list
function is your friend:
# print a list of genus_species-only records from selected plots (for
# demonstration we print only part):
species_list(my.ausplots.data$veg.vouch, grouping = "by_site", species_name = "GS")[1:2]
#> $NTAARP0001
#> [1] Acacia alleniana
#> [2] Acacia cowleana
#> [3] Acacia dimidiata
#> [4] Acacia lamprocarpa
#> [5] Acacia mimula
#> [6] Alphitonia excelsa
#> [7] Aristida longicollis
#> [8] Arthrostylis aphylla
#> [9] Blumea saxatilis
#> [10] Bonamia brevifolia
#> [11] Boronia decumbens
#> [12] Brachychiton megaphyllus
#> [13] Breynia cernua
#> [14] Buchanania obovata
#> [15] Cartonema spicatum
#> [16] Clerodendrum floribundum
#> [17] Cochlospermum fraseri
#> [18] Cyperus sporobolus
#> [19] Denhamia ferdinandi
#> [20] Denhamia obscura
#> [21] Digitaria bicornis
#> [22] Dodonaea hispidula
#> [23] Eriachne NA
#> [24] Eriachne basedowii
#> [25] Eriachne ciliata
#> [26] Eriachne triseta
#> [27] Erythrophleum chlorostachys
#> [28] Eucalyptus tetrodonta
#> [29] Eulalia mackinlayi
#> [30] Euphorbia muelleri
#> [31] Euphorbia schultzii
#> [32] Exocarpos latifolius
#> [33] Flemingia parviflora
#> [34] Gardenia megasperma
#> [35] Gompholobium subulatum
#> [36] Gonocarpus leptothecus
#> [37] Goodenia armstrongiana
#> [38] Goodenia holtzeana
#> [39] Grevillea goodii
#> [40] Grona brownii
#> [41] Grona pycnotricha
#> [42] Helicteres NA
#> [43] Heteropogon triticeus
#> [44] Hibbertia NA
#> [45] Hibbertia dealbata
#> [46] Hibbertia echiifolia
#> [47] Hibbertia juncea
#> [48] Hibbertia sphenandra
#> [49] Ipomoea gracilis
#> [50] Livistona humilis
#> [51] Marsdenia viridiflora
#> [52] Murdannia graminea
#> [53] Opilia amentacea
#> [54] Owenia vernicosa
#> [55] Pavetta brownii
#> [56] Persoonia falcata
#> [57] Petalostigma pubescens
#> [58] Planchonia careya
#> [59] Polycarpaea corymbosa
#> [60] Samadera sp. Mary River (I.D.Cowie 1454) NT Herbarium
#> [61] Sauropus brunonis
#> [62] Schizachyrium pseudeulalia
#> [63] Setaria NA
#> [64] Sorghum NA
#> [65] Sorghum brachypodum
#> [66] Sorghum plumosum
#> [67] Spermacoce leptoloba
#> [68] Sporobolus NA
#> [69] Stylidium semipartitum
#> [70] Tephrosia porrecta
#> [71] Tephrosia remotiflora
#> [72] Terminalia NA
#> [73] Terminalia carpentariae
#> [74] Terminalia ferdinandiana
#> [75] Thaumastochloa NA
#> [76] Trachymene rotundifolia
#> [77] Triodia NA
#> [78] Urochloa holosericea
#> [79] Yakirra nulla
#>
#> $NTAARP0002
#> [1] Acacia alleniana
#> [2] Acacia latescens
#> [3] Acacia mimula
#> [4] Acacia oncinocarpa
#> [5] Acacia torulosa
#> [6] Aristida holathera
#> [7] Arthrostylis aphylla
#> [8] Blepharocarya depauperata
#> [9] Boronia decumbens
#> [10] Calytrix exstipulata
#> [11] Capparis umbonata
#> [12] Cartonema spicatum
#> [13] Cassytha capillaris
#> [14] Commelina sp. Sandstone (R.J.Fensham 739) NT Herbarium
#> [15] Denhamia ferdinandi
#> [16] Ehretia saligna
#> [17] Eriachne NA
#> [18] Eriachne basedowii
#> [19] Eriachne nodosa
#> [20] Erythrophleum chlorostachys
#> [21] Eucalyptus tetrodonta
#> [22] Euphorbia muelleri
#> [23] Fimbristylis NA
#> [24] Fimbristylis squarrulosa
#> [25] Gardenia megasperma
#> [26] Gardenia resinosa
#> [27] Gomphrena canescens
#> [28] Goodenia holtzeana
#> [29] Grevillea goodii
#> [30] Grevillea pteridifolia
#> [31] Heliotropium foliatum
#> [32] Hibbertia juncea
#> [33] Hibbertia lepidota
#> [34] Jacksonia dilatata
#> [35] Livistona humilis
#> [36] Lomandra tropica
#> [37] Marsdenia trinervis
#> [38] Marsdenia viridiflora
#> [39] Owenia vernicosa
#> [40] Pandanus spiralis
#> [41] Persoonia falcata
#> [42] Petalostigma quadriloculare
#> [43] Planchonella arnhemica
#> [44] Planchonia careya
#> [45] Polycarpaea staminodina
#> [46] Portulaca bicolor
#> [47] Ptilotus distans
#> [48] Sauropus stenocladus
#> [49] Schizachyrium fragile
#> [50] Senna sp. Pine Creek (P.Martensz 480) NT Herbarium
#> [51] Sorghum NA
#> [52] Sorghum plumosum
#> [53] Spermacoce NA
#> [54] Tephrosia porrecta
#> [55] Terminalia carpentariae
#> [56] Thaumastochloa striata
#> [57] Triodia NA
#> [58] Yakirra nulla
# overall species list ordered by family (for demonstration we print only
# part):
species_list(my.ausplots.data$veg.vouch, grouping = "collapse", species_name = "SN",
append_family = TRUE)[1:50]
#> [1] Abutilon cryptopetalum--Malvaceae
#> [2] Abutilon fraseri subsp. fraseri--Malvaceae
#> [3] Abutilon fraseri--Malvaceae
#> [4] Abutilon halophilum--Malvaceae
#> [5] Abutilon hannii subsp. prostrate (p.k.latz 427)--Malvaceae
#> [6] Abutilon hannii--Malvaceae
#> [7] Abutilon leucopetalum--Malvaceae
#> [8] Abutilon macrum--Malvaceae
#> [9] Abutilon malvifolium--Malvaceae
#> [10] Abutilon otocarpum--Malvaceae
#> [11] Abutilon oxycarpum--Malvaceae
#> [12] Abutilon--Malvaceae
#> [13] Acacia acinacea--Fabaceae
#> [14] Acacia adoxa--Fabaceae
#> [15] Acacia adsurgens--Fabaceae
#> [16] Acacia alleniana--Fabaceae
#> [17] Acacia anceps--Fabaceae
#> [18] Acacia ancistrocarpa--Fabaceae
#> [19] Acacia aneura var. aneura--Fabaceae
#> [20] Acacia aneura var. major--Fabaceae
#> [21] Acacia aneura--Fabaceae
#> [22] Acacia aptaneura--Fabaceae
#> [23] Acacia araneosa--Fabaceae
#> [24] Acacia areolata--Fabaceae
#> [25] Acacia asperulacea--Fabaceae
#> [26] Acacia auriculiformis--Fabaceae
#> [27] Acacia ayersiana--Fabaceae
#> [28] Acacia bivenosa--Fabaceae
#> [29] Acacia burkittii--Fabaceae
#> [30] Acacia caesaneura--Fabaceae
#> [31] Acacia calamifolia--Fabaceae
#> [32] Acacia calligera--Fabaceae
#> [33] Acacia cambagei--Fabaceae
#> [34] Acacia chamaeleon--Fabaceae
#> [35] Acacia chippendalei--Fabaceae
#> [36] Acacia cochlearis--Fabaceae
#> [37] Acacia continua--Fabaceae
#> [38] Acacia cowleana--Fabaceae
#> [39] Acacia cupularis--Fabaceae
#> [40] Acacia cyclops--Fabaceae
#> [41] Acacia dictyocarpa--Fabaceae
#> [42] Acacia dictyophleba--Fabaceae
#> [43] Acacia difficilis--Fabaceae
#> [44] Acacia dimidiata--Fabaceae
#> [45] Acacia dunnii--Fabaceae
#> [46] Acacia erinacea--Fabaceae
#> [47] Acacia estrophiolata--Fabaceae
#> [48] Acacia euthycarpa--Fabaceae
#> [49] Acacia fuscaneura--Fabaceae
#> [50] Acacia galioides--Fabaceae
In addition to the key site info and vegetation point-intercept
modules introduced above, get_ausplots
is your gateway to
raw data modules for vegetation structural summaries, vegetation
vouchers (covers the full species diversity observed at the plot and
includes tissue sample details), basal wedge, and soils subsites, bulk
density and pit/characterisation (including bulk and metagenomics soil
samples).
Blanco-Martin, B. (2019) Tutorial: Understanding and using the ‘ausplotsR’ package and AusPlots data. Terrestrial Ecology Research Network. Version 2019.04.0, April 2019. https://github.com/ternaustralia/TERN-Data-Skills/
Sparrow, B., Foulkes, J., Wardle, G., Leitch, E., Caddy-Retalic, S., van Leeuwen, S., Tokmakoff, A., Thurgate, N., Guerin, G.R. and Lowe, A.J. (2020) A vegetation and soil survey method for surveillance monitoring of rangeland environments. Frontiers in Ecology and Evolution, 8:157.