The OGC Web Coverage Service (WCS) standards suite esablishes a structured, modular collection of increasingly powerful services. WCS Core defines basic functionality: coverage subsetting and format encoding. Any implementation claiming to support WCS must support this Core functionality (which is not hard, it's tentatively kept simple) and may additionally support any of the WCS extensions defined, such as the Earth datacube analytics and fusion language, Web Coverage Processing Service (WCPS). [more on coverage services]
While coverages can be served through a variety of interfaces - including WFS, WMS, and WPS - only WebCoverage Service (WCS) offers comprehensive, tailored functionality. Similar to the modularly organized CIS, the WCS suite also has a mandatory Core around which a series of optionally implementable extensions gather. This structure is tentqtive so as to have the lowest possible effort and skill level for WCS implementers while, at the same time, allow advanced implementers building compliant, but more elaborate WCS tools.
A synoptic view of the OGC coverage data and service model is presented below.
Now I hear you ask: And how do I find out which extension the particular service supports?
The answer is: The list of extensions as well as data formats supported, CRSs supported, and so on is listed in the Capabilities document of a service,
to be obtained via a GetCapabilities request.
The following diagram shows the architecture of the complete WCS suite with its components and their relationships:
WCS extensions can be classified into functionality extensions and protocol bindings. The latter allow expressing any request of Core and extensions in one of GET/KVP, POST/XML, SOAP, and (still under discussion) OpenAPI.
WCS Core offers very simple, focused coverage access and extraction functionality:
Technically, WCS Core offers three request types:
GetCapabilities: what data does this service offer, and what are its capabilities?
DescribeCoverage: tell me details about this coverage!
GetCoverage: give me that coverage (or part of it), and in my favourite format!
We focus on GetCoverage as the central workhorse of WCS and explain it by example.
The following request, using GET/KVP encoding, performs trimming in space and slicing in time,
effectively extracting a 2D image from a 3D timeseries datacube, delivered as GeoTIFF
(we use this WCS demo service):
https://ows.rasdaman.org/rasdaman/ows ? SERVICE=WCS & VERSION=2.0.1
& REQUEST=GetCoverage
& COVERAGEID=AvgTemperatureColorScaled
& SUBSET=Lat(-30,70)
& SUBSET=Long(-140,140)
& SUBSET=ansi(%222000-02-01T00:00:00.000Z%22)
& FORMAT=image/jpeg
We can see the SUBSET parameters, one for each axis (yes, unix is a crazy name for a time axis, agreed).
In this particular example we might obtain a time slice at a particular point in time and for some particular geographic region from an x/y/t datacube for display on screen.
The encoding format in which a coverage is stored in the server is called the coverage's Native Format; without any FORMAT parameter in a request the coverage will be delivered in this Native Format (also in case of subsetting). The CRS in which the coverage’s domain set coordinates are expressed is referred to as its Native CRS. A WCS Core will always interpret subsetting coordinates and deliver coverage results in the Native CRS of the coverage addressed.
A central promise of WCS Core is that coverage values will be delivered guaranteed unchanged – no rounding, no resampling etc. may take place. Of course, this may change if some lossy format is used (such as JPEG with a quality factor less than 100%). Further, WCS extensions may change this behavior as we will see below.
The functionality-enhancing extensions provide a variety of useful extras over WCS Core; we look at each in turn.
GetCoverage request with an extra, optional parameter
to select range components (“bands”, “variables”). With RANGESUBSET a selection of bands can
be extracted by band name, allowing to select and also reorder.
For example, the following request extracts a false-color image from some hyperspectral scene:
http://www.acme.com/wcs ? SERVICE=WCS & VERSION=2.1
& REQUEST=GetCoverage & COVERAGEID=c001
& RANGESUBSET=nir,red,green
Generally, one or more bands can be extracted and brought into any sequence desired.
For large amounts of bands, intervals can be specified, such as red:blue, based on the order defined in the range type.
SCALING parameter is added to the GetCoverage request.
The interpolation method applied is implementation dependent unless WCS Interpolation is implemented in the server (see below).
Obviously, in presence of scaling it cannot be guaranteed any longer that range values remain unchanged.
OUTPUTCRS lets users indicate the target CRS in which the coverage should be delivered.
Additionally, the CRS of a subsetting bbox given by one or more SUBSET parameters
can be changed from the coverage's Native CRS through the optional request parameter SUBSETTINGCRS.
Following OGC convention, CRSs are expressed as URLs, such as in the following example:
http://www.acme.com/ows?SERVICE=WCS & VERSION=2.1
& REQUEST=GetCoverage & COVERAGEID=c001
& OUTPUTCRS=http://www.opengis.net/def/crs/EPSG/0/4326
The list of CRSs supported by a server are listed in its capabilities document which can be retrieved through a GetCapabilities request.
GetCapabilities request.
Such methods might include nearest-neighbor, linear, or quadratic.
ProcessCoverages.
It has a single parameter, query, which is supposed to contain a WCPS query string. See the WCPS section for details.
InsertCoverage creates a new coverage in the server;
DeleteCoverage removes one or more, and UpdateCoverage performs a partial replacement within an existing coverage.
For example, the following request generates a new coverage in the server by reading the coverage from some other server via the URL indicated:
http://www.acme.com/wcs
? SERVICE=WCS & VERSION=2.1
& REQUEST=InsertCoverage
& COVERAGEREF=http://bcme.com/archive/hurricane.nc
Since its inception, WCS offers several different protocol bindings, i.e., languages between client and server. This does not address coverage encodings - they are just the optic of communication - but rather the way requests and responses are formatted.
GET requests and responses, with functionality (REQUEST=...) and parameters (SUBSET=...)
encoded in the query part of the URL.
This allows for a convenient single-line command that any browser can send, but in is restricted in its length by built-in restrictions of Web client and server libraries.
POST requests instead, with commands and parameters transmitted through an XML structure specified in the standards.
This is convenient in particular when large data have to be transmitted (such as in a WCS-T request), but cannot be copy-pasted into a browser.
OGC OAPI-Coverages is a draft-stage effort in OGC to unify feature, coverage, map, and processing based on OpenAPI concepts. From a WCS perspective, this is an evolution, not a disruptive replacement, that constitutes an additional way of expressing requests to the server and handling responses. Most notably, OAPI-Coverages is based on the Coverage Implementation Schema (CIS) 1.1 just as WCS 2.1 is. Currently, OAPI-Coverages functionality is a small subset of WCS (more or less: WCS-Core).
For compliance testing, OGC provides a free, open test suite which examines WCS implementations and the coverages delivered down to the level of single pixels, thereby ensuring interoperability across the large and increasing ecosystem of open-source and proprietary servers and clients.
OGC WCS 2 is the current version (WCS 1 is deprecated since long). WCS 2.0.1 is based on CIS 1.0; WCS 2.1, adopted in 2019, is identical except that it also knows about CIS 1.1 General Grid Coverages. The WCS 2 extensions likewise have been enhanced; some of them have been at version 1.0 and are lifted now to 1.1, some already had 2.0 and are now 2.1. The WCPS language (which is independent from the WCS request protocol binding) is originally 1.0 and has been elevated to 1.1 to incorporate the CIS 1.1 coverage structure. OGC WQS has the status of a Discussion Paper.
OAPI-Coverages is under discussion for quite some time now (official kickoff in May 2018), but not yet stable and still changing; recent estimates expect adoption sometime 2022.
We gladly share our experience to answer any questions you may have, from strategic issues down to any technical depth. This can be discussed based on your own data, your own ecosystem requirements, and of course under strict confidentiality (such as under an NDA). Webinars as well as on-site meetings are possible.
Contact us - we gladly share our experience and insight from 20+ years of writing, implementing, and testing OGC, ISO, and INSPIRE standards, implementing them from Raspberry Pi to dozens-of-Petabytes archives.
The open-source pioneer datacube engine, rasdaman is OGC Coverages reference implementation.
The rasdaman engine has pioneered Actionable Datacubes® and Array Databases. With its enabling approach of a high-level datacube analytics language -- adopted into ISO SQL -- and underpinned by a po werful datacube architecture with federation, distributed data fusion, AI, highly effective query optimization, and more -- rasdaman remains the gold standard for modern multi-dimensional raster data services, being up to 74x faster than other engines.