Introduction
The package was designed to make EMODnet vector data layers easily
accessible in R. The package allows users to query information on and
download data from all available EMODnet
Web Feature Service (WFS) endpoints directly into their R working
environment. Data are managed as sf
objects which
are currently the state-of-the-art in handling of vector spatial data in
R. The package also allows user to specify the coordinate reference
system of imported data.
Installation
You can install the development version of emodnet.wfs from GitHub with:
pak::pak("EMODnet/emodnet.wfs")
Explore the EMODnet WFS services with R
For this tutorial we will make use of the sf
,
dplyr
and mapview
packages. The simple
features sf
package is a well known standard for dealing
with geospatial vector data. The package dplyr
is a strong
library for data manipulation. This package also loads
magrittr
’s pipe operator %>%
(you could
also use the base
pipe), which allows to write pipelines in R. To visualize
geometries, mapview
will create quick interactive maps.
Run this line to install these packages:
install.packages(c("sf", "dplyr", "mapview"))
With the emodnet.wfs package, we can explore and combine the data served by the EMODnet lots through OGC Web Feature Services or WFS.
Imagine we are interested in seabed substrates. The first step is to
choose what EMODnet lot can provide with these data. For that, we can
check the services available with the emodnet_wfs()
function.
library(emodnet.wfs)
library(mapview)
library(dplyr)
library(sf)
emodnet_wfs()
#> service_name
#> 1 bathymetry
#> 2 biology
#> 3 biology_occurrence_data
#> 4 chemistry_cdi_data_discovery_and_access_service
#> 5 chemistry_cdi_distribution_observations_per_category_and_region
#> 6 chemistry_contaminants
#> 7 chemistry_marine_litter
#> 8 geology_coastal_behavior
#> 9 geology_events_and_probabilities
#> 10 geology_marine_minerals
#> 11 geology_sea_floor_bedrock
#> 12 geology_seabed_substrate_maps
#> 13 geology_submerged_landscapes
#> 14 human_activities
#> 15 physics
#> 16 seabed_habitats_general_datasets_and_products
#> 17 seabed_habitats_individual_habitat_map_and_model_datasets
#> service_url
#> 1 https://ows.emodnet-bathymetry.eu/wfs
#> 2 https://geo.vliz.be/geoserver/Emodnetbio/wfs
#> 3 https://geo.vliz.be/geoserver/Dataportal/wfs
#> 4 https://geo-service.maris.nl/emodnet_chemistry/wfs
#> 5 https://geo-service.maris.nl/emodnet_chemistry_p36/wfs
#> 6 https://geoserver.hcmr.gr/geoserver/EMODNET_SHARED/wfs
#> 7 https://www.ifremer.fr/services/wfs/emodnet_chemistry2
#> 8 https://drive.emodnet-geology.eu/geoserver/tno/wfs
#> 9 https://drive.emodnet-geology.eu/geoserver/ispra/wfs
#> 10 https://drive.emodnet-geology.eu/geoserver/gsi/wfs
#> 11 https://drive.emodnet-geology.eu/geoserver/bgr/wfs
#> 12 https://drive.emodnet-geology.eu/geoserver/gtk/wfs
#> 13 https://drive.emodnet-geology.eu/geoserver/bgs/wfs
#> 14 https://ows.emodnet-humanactivities.eu/wfs
#> 15 https://prod-geoserver.emodnet-physics.eu/geoserver/ows
#> 16 https://ows.emodnet-seabedhabitats.eu/geoserver/emodnet_open/wfs
#> 17 https://ows.emodnet-seabedhabitats.eu/geoserver/emodnet_open_maplibrary/wfs
The column service_name
shows services available, while
service_url
has the corresponding base url to perform a WFS
request. The Seabed portal should have the data we are looking for. A
WFS client can be created by passing the corresponding
service_name
to the function
emodnet_init_wfs_client()
. The layers available to this WFS
client are consulted with emodnet_get_wfs_info()
.
seabed_wfs_client <- emodnet_init_wfs_client(service = "seabed_habitats_general_datasets_and_products")
#> ✔ WFS client created successfully
#> ℹ Service: "https://ows.emodnet-seabedhabitats.eu/geoserver/emodnet_open/wfs"
#> ℹ Version: "2.0.0"
emodnet_get_wfs_info(wfs = seabed_wfs_client)
#> # A tibble: 72 × 9
#> # Rowwise:
#> data_source service_name service_url layer_name title abstract class format
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 2 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 3 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 4 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 5 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 6 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 7 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 8 emodnet_wfs seabed_habitat… https://ow… art17_hab… 2013… "Gridde… WFSF… sf
#> 9 emodnet_wfs seabed_habitat… https://ow… carib_eus… 2023… "Output… WFSF… sf
#> 10 emodnet_wfs seabed_habitat… https://ow… biogenic_… Biog… "This l… WFSF… sf
#> # ℹ 62 more rows
#> # ℹ 1 more variable: layer_namespace <chr>
Each layer is explained in the abstract
column. We can
see several layers with the information provided by the EU member states
for the Habitats
Directive 92/43/EEC reporting. We will select the layers about
coastal lagoons, mudflats and sandbanks with their respective
layer_name
.
habitats_directive_layer_names <- c("art17_hab_1110", "art17_hab_1140", "art17_hab_1150")
emodnet_get_layer_info(
wfs = seabed_wfs_client,
layers = habitats_directive_layer_names
)
#> # A tibble: 3 × 9
#> # Rowwise:
#> data_source service_name service_url layer_name title abstract class format
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 emodnet_wfs https://ows.emo… seabed_hab… art17_hab… 2013… "Gridde… WFSF… sf
#> 2 emodnet_wfs https://ows.emo… seabed_hab… art17_hab… 2013… "Gridde… WFSF… sf
#> 3 emodnet_wfs https://ows.emo… seabed_hab… art17_hab… 2013… "Gridde… WFSF… sf
#> # ℹ 1 more variable: layer_namespace <chr>
We are now ready to read the layers into R with
emodnet_get_layers()
. emodnet.wfs reads the geometries as
simple features (See sf
package) transformed to 4326 by default. Specifying another map
projection is possible by passing a EPGS code or projection string with
emodnet_get_layers(crs = "your projection")
where crs is a
coordinate reference system (CRS). The argument
reduce_layers = TRUE
stack all the layers in one single
tibble. Default is FALSE and returns a list of sf objects, one per
layer.
habitats_directive_layers <- emodnet_get_layers(
wfs = seabed_wfs_client,
layers = habitats_directive_layer_names,
reduce_layers = TRUE
)
class(habitats_directive_layers)
#> [1] "sf" "data.frame"
glimpse(habitats_directive_layers)
#> Rows: 221
#> Columns: 9
#> $ gml_id <chr> "art17_hab_1110.13", "art17_hab_1110.22", "art17_ha…
#> $ habitat_code <chr> "1110", "1110", "1110", "1110", "1110", "1110", "11…
#> $ ms <chr> "DK", "ES", "ES", "PT", "PT", "PL", "DK", "FR", "UK…
#> $ region <chr> "ATL", "MAC", "MMAC", "MMAC", "MATL", "MBAL", "MBAL…
#> $ cs_ms <chr> "U2+", "U1+", "U1+", "XX", "U1-", "U1-", "U1-", "U1…
#> $ country_code <chr> "Denmark", "Spain", "Spain", "Portugal", "Portugal"…
#> $ habitat_code_uri <chr> "http://dd.eionet.europa.eu/vocabulary/art17_2018/h…
#> $ habitat_description <chr> "Sandbanks which are slightly covered by sea water …
#> $ geom <MULTISURFACE [m]> MULTISURFACE (POLYGON ((420..., MULTIS…
Run the following code to have a quick look at the layers geometries
# Transform to Polygon geometry type from Multisurface
if (unique(st_geometry_type(habitats_directive_layers)) == "MULTISURFACE") {
habitats_directive_layers <- habitats_directive_layers %>%
st_cast(to = "GEOMETRYCOLLECTION") %>%
st_collection_extract(type = "POLYGON")
}
# Visualize
map <- mapview(habitats_directive_layers, zcol = "habitat_description", burst = TRUE)
map
EMODnet provides also physics, chemistry, biological or bathymetry data. Explore all the layers available with.
More information
References
Blondel, Emmanuel. (2020, May 27). ows4R: R Interface to OGC Web-Services (Version 0.1-5). Zenodo. https://doi.org/10.5281/zenodo.3860330
Flanders Marine Institute (2019). Maritime Boundaries Geodatabase, version 11. Available online at https://www.marineregions.org/. https://doi.org/10.14284/382.
Hadley Wickham, Romain François, Lionel Henry and Kirill Müller (2020). dplyr: A Grammar of Data Manipulation. R package version 1.0.2.https://CRAN.R-project.org/package=dplyr
Pebesma E (2018). “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal, 10(1), 439–446. doi: 10.32614/RJ-2018-009, https://doi.org/10.32614/RJ-2018-009.
R Core Team (2020). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
Tim Appelhans, Florian Detsch, Christoph Reudenbach and Stefan Woellauer (2020). mapview: Interactive Viewing of Spatial Data in R. R package version 2.9.0. https://CRAN.R-project.org/package=mapview
Code
Please cite this package as:
Anna Krystalli (2020). emodnet.wfs: Access EMODnet Web Feature Service data through R. R package version 0.0.2. https://github.com/EMODnet/emodnet.wfs. Integrated data products created under the European Marine Observation Data Network (EMODnet) Biology project (EASME/EMFF/2017/1.3.1.2/02/SI2.789013), funded by the by the European Union under Regulation (EU) No 508/2014 of the European Parliament and of the Council of 15 May 2014 on the European Maritime and Fisheries Fund.