TDS WCS 1.0+ Implementation Details
Changes to Mapping between netCDF and Coverage/Range
In the TDS 1.0.0 server:
- a netCDF dataset is a WCS service endpoint;
- a grid variable is a WCS coverage;
- the grid variable is the only WCS range in the coverage;
- the temporal axis (if one exists) and the horizontal
axes make up the domain; and
- the vertical axis (if one exists) is given as a WCS range
axis.
In the TDS 1.0+ server:
- a netCDF dataset is still a WCS service endpoint;
- all the grid variables on a particular coordinate system make up a single WCS coverage;
- each grid variable on the coordinate system is a range
field;
- the temporal axis (if one exists), the horizontal axes, and
the vertical axis (if one exits) make up the domain.
- Don't handle range axes yet [we don't have much data that would have range axes].
Changes from 1.0.0 Spec
There are a number of differences between the WCS 1.0.0
specification and the TDS WCS 1.0+ implementation.
- Only KVP requests supported
- GetCapabilities Response
- latLonEnvelope: third axis in pos is vertical but not
necessarily in meters (units are native vertical); srsName is left as
"crs84".
- DescribeCoverage Response
- latLonEnvelope and Envelope[WithTimePeriod] both include
vertical (if coverage has vertical) with units from native vertical
- Changed content of WCS 1.0.0 rangeSet
element from a single RangeSet element to
one or more Field elements. The Field
element is a very loose merging of the 1.0.0 axisDescription
element (description, name, label) and the 1.1 Field
element (dataType, units, and nullValue; I left interpolation methods
outside of the range). I was going to include the 1.1 Axis
element but none of our data has extra axes so I haven't looked into
that much.
- GetCoverage Request
- Use 1.1 KVP RangeSubset
key instead of 1.0 KVP <PARAMETER> key (which in our case
was always Vertical). Since only allow "none" interpolation and don't have data with range axes, the value of RangeSubset is assumed to be a semi-colon (";") seperated list of range field names.
Here's an example of the rangeSet/Field element:
<Field>
<description xmlns="">Temperature @ isobaric</description>
<name>Temperature</name>
<label>Temperature K true Temperature @ isobaric</label>
<dataType>float</dataType>
<units>K</units>
<nullValues>
<singleValue>NaN</singleValue>
</nullValues>
</Field>
CRS Issues
- Current CRS URIs are just EPSG projection codes rather than CRS codes and in 1.0 form (e.g., "EPSG:9802").
- Actual CRS of data are not standard EPSG codes so need to construct CRS description:
- Compound and parameterized OGC URNs seem very awkward.
- 1.1
spec doesn't specify what a CRS URL response should look like (or did I
miss it?). GML I assume. I looked at the "GML 3.1.1 grid CRSs profile"
(OGC 05-096r1) but it looked like it was only 2-D (???). I also looked
at GML 3.2.1 but thought I would ask for suggestions before digging
into any of this too deep.
Restrictions
- Only netCDF-CF supported (no GeoTIFF)
- Temporal selection: only min/max is supported. No resolution is allowed on the min/max and no lists are allowed.
Unhandled WCS 1.0+ Goals
- Asynchronous request/response
- CV_ReferenceableGrid
- Move towards 1.1 style handling of binary response encodings. [What did we mean by this?]