Introduction
Within Europe, the Water Framework Directive (WFD) sets EU-wide standards for how the quality of surface- and ground-waters across Europe is assessed and classified. Assessment of quality using the WFD is based on a range of elements that vary depending on the type of water being assessed and are combined to give an overall classification of waterbodies into five classes (High, Good, Moderate, Poor and Bad) for surface waters and two classes (Good or Poor) for groundwaters.
In the UK the Environment Agency (EA) is the competent authority responsible for monitoring and assessment of water quality within England. The EA have made the reporting data relating to the requirements of the WFD available via the Catchment Data Explorer (CDE) website, https://environment.data.gov.uk/catchment-planning/.
cde
is a package for R which facilitates searching and
download of the WFD reporting data for all waterbodies from the EA CDE
website.
The types of data that can be downloaded are: WFD status classification data, Reasons for Not Achieving Good (RNAG) status, objectives set for waterbodies and details of associated protected areas.
The CDE data are made available under the Open Government Licence v3.0 and use of the data accessed by and contained within this package implies acceptance of these licence conditions.
Installation
You can install the current development version from github with:
# if you have not done so already
# install.packages("remotes")
remotes::install_github("ropensci/cde")
Searching for sites
The search_sites
function allows you to search for
waterbodies, Operational or Management Catchments or River Basin
Districts that contain a match or partial match for a specified search
string (which is case-sensitive). There is a hierarchical relationship
between waterbodies, catchments and River Basin Districts (RBD) as shown
here.
As an example, we will search for waterbodies containing the name
“Lark”.
# load the package
library(cde)
# search for waterbodies containing the name "Lark"
lark_wb<-search_names(string="Lark", column="name")
The dataframe returned contains details of all the waterbodies containing the string “Lark” in their name. The details returned include waterbody id codes (WBID), type of waterbody, Operational and Management Catchment names and River Basin District.
# show the top 6 rows of the 'name' column
head(lark_wb$name)
#> [1] "Lark (US Hawstead)"
#> [2] "Lark downstream of Mill Street Bridge"
#> [3] "Lark (Hawstead to Abbey Gardens)"
#> [4] "Lark (Abbey Gardens to Mildenhall)"
#> [5] "Lark"
#> [6] "Lark - Fynn (d/s confluence)"
To search for Operational Catchments containing the same string we would use the following code.
lark_oc<-search_names(string="Lark", column="OC")
Retrieving quality status classification data
Having located a waterbody, catchment or River Basin District that we
want to retrieve data for, we can use the get_status
function to retrieve the status classification information from the CDE
website. We can extract the data for a specific year, or a range of
years. For Operational/Management Catchment or River Basin District
level downloads, we can also extract information just for a specific
waterbody type (such as rivers) or for all waterbody types. In addition
it is possible to extract classification data relating to a specific
element of the classification.
The overall classification is made up of a number of different
elements in a hierarchy. Details of the hierarchy of classification
levels can be found here.
By default it retrieves the “Overall Water Body”” classification status,
but by specifying the level
, information on a specific
level of classification can be retrieved. The possible values are:
Level 1 | Level 2 | Level 4 |
---|---|---|
Ecological | Biological quality elements | Overall Water Body |
Chemical | Chemical Status element | - |
Quantitative | Hydromorphological Supporting Elements | - |
- | Other Substances | - |
- | Physico-chemical quality elements | - |
- | Priority hazardous substances | - |
- | Priority substances | - |
- | Quantitative Status element | - |
- | Specific pollutants | - |
- | Supporting elements | - |
The function returns an object of class cde_df
(basically a dataframe with custom print and plot methods) containing
the status (and other details) for the specified combination of column,
value, level and dates. Note that during 2013 and 2014 waterbodies were
classified under both Cycle 1 and Cycle 2 methodologies. The status
information extracted for these years is just for the Cycle 2
classification, to avoid double counting. There was also a change in
some of the environmental standards applied to chemical aspects of
status assessment between cycles, so there may be some noticeable
changes in status between these years. See here
for more details.
For details of the meaning of the the different columns returned, see the output reference list.
# extract overall waterbody status classification data for a single
# waterbody in all years
# first decide which waterbody, we can use one from the first search
# above (need the WBID information)
head(lark_wb)
#> WBID name type OC
#> 1911 GB105033042920 Lark (US Hawstead) River Lark
#> 1912 GB105033043052 Lark downstream of Mill Street Bridge River Lark
#> 1914 GB105033042940 Lark (Hawstead to Abbey Gardens) River Lark
#> 1918 GB105033043051 Lark (Abbey Gardens to Mildenhall) River Lark
#> 2197 GB105035040360 Lark River Deben
#> 2200 GB105035040300 Lark - Fynn (d/s confluence) River Deben
#> MC RBD
#> 1911 Cam and Ely Ouse Anglian
#> 1912 Cam and Ely Ouse Anglian
#> 1914 Cam and Ely Ouse Anglian
#> 1918 Cam and Ely Ouse Anglian
#> 2197 East Suffolk Anglian
#> 2200 East Suffolk Anglian
# we will get data for the first waterbody here (WBID: GB105033042920,
# name: Lark (US Hawstead))
lark_hawstead<-get_status(ea_name="GB105033042920", column="WBID")
# the dataframe returned contains all of the data for this site in all
# years (we did not specify year/year range).
lark_hawstead
#> river_basin_district management_catchment operational_catchment
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> With an additional 17 columns of data.
#> Row values may be truncated to fit console.
# just a quick look at the actual status data
table(lark_hawstead$status)
#>
#> Good Moderate
#> 1 9
An example of a higher level download, specifying a year range and type (in this case Rivers).
# download status data for a given year range and type of waterbody
lark_OC_rivers<-get_status(ea_name="Lark", column="OC", startyr=2013, endyr=2015, type="River")
# print out the results
lark_OC_rivers
#> river_basin_district management_catchment operational_catchment
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> Anglian Cam and Ely Ouse Lark
#> With an additional 26 rows and 17 columns of data.
#> Row values may be truncated to fit console.
To get information about status classification in relation to a
specific level in the classification, we can specify level
as well (see table above for options and here
for more details on the classification levels used).
# download Chemical status for rivers in all years
lark_OC_rivers_chem<-get_status(ea_name="Lark", column="OC", type="River", level="Chemical")
Plotting quality status classification data
The get_status
function, along with other
get_...
functions, has a plot
method which
provides quick overview plots of status classes, giving a plot of
percentages of waterbodies in different status classes for the
combination of criteria specified. Plotting is only possible for
Operational/Management Catchment or River Basin District downloads.
# get overall waterbody status information for the Lark OC between 2013 and 2015
lark_OC_2013_15 <- get_status(ea_name="Lark", column="OC", startyr=2013, endyr=2015)
# plot the data
plot(lark_OC_2013_15)
For plots, the colour scheme used is based on the
viridis
palette. For get_status
and
get_objectives
an alternative colour scheme, based on the
WFD-defined status class colours, can be used instead by setting
scheme="wfd"
within a plot
call. Also if a
single year is specified, a standard (as opposed to stacked) barplot is
produced as shown below.
# get the overall waterbody status information for rivers in the Lark OC in 2015
lark_OC_rivers_2015 <- get_status(ea_name="Lark", column="OC", startyr=2015, type="River")
# plot these data, using WFD colour scheme
plot(lark_OC_rivers_2015, scheme="wfd")
Reasons for Not Achieving Good status
Not all waterbodies in the Lark Operational Catchment example above
have achieved Good status. The get_rnag
function downloads
Reasons for Not Achieving Good (RNAG) data, which allow us to find out
more detail on the pressures on the waterbodies that have been assessed
to be driving the failure. The RNAG data can be extracted for specific
classification levels, as per the status data above.
For details of the meaning of the the different columns returned, see the output reference list.
# what are the RNAG for the Lark OC
lark_OC_RNAG <- get_rnag(ea_name="Lark", column="OC")
Plots of RNAG data are given as frequency histograms of the occurence
of information in the pressure_tier_3
column. For details
of this, see the reference list.
# plot RNAG data for the Lark OC
plot(lark_OC_RNAG)
Objectives set for waterbodies
For those waterbodies that are at less than Good status, objectives
are set to indicate what status is aimed for in the longer term. The
objectives are set in relation to what is determined to be achievable in
the given timescale. Therefore objectives have been set in relation to
the 6-year cycle of assessment (so years 2015, 2021 and 2027, then also
2040 and 2050 for long-term objectives). Using the
get_objectives
function, we can download objectives for
waterbodies, catchments or River Basin Districts. Objectives can be
downloaded for a specific year (2015, 2021, 2027, 2040 or 2050), level
of classification and waterbody type as per the get_status
function. Note however that not all waterbodies have objectives set for
all years, levels or types. If no objectives are set for the criteria
specified, a message is given.
For details of the meaning of the the different columns returned, see the output reference list.
# download the objectives set for 2015 for the Lark Operational Catchment
lark_OC_obj_2015<-get_objectives(ea_name="Lark", column="OC", year=2015)
Plotting of objectives is similar to that of get_status
data, except the status classes represent the target objectives
predicted to be achieved by the date specified.
# plot the objectives for the Lark OC in 2015
plot(lark_OC_obj_2015)
Protected Areas
The get_pa
function downloads details of the protected
areas associated with a waterbody, catchment or River Basin District.
The protected areas listed include those designated under conservation
reasons, such as SACs (Habitats and Species Directive), pollution
reduction, such as Nitrate Vulnerable Zones (Nitrates Directive) or
human use (Bathing Water Directive).
For details of the meaning of the the different columns returned, see the output reference list.
# get details of the protected areas within the Lark Operational Catchment
lark_OC_pa<-get_pa(ea_name="Lark", column="OC")
Plotting the output of get_pa
produces a frequency
histogram of the protected_area_type
column within the area
specified.
plot(lark_OC_pa)