OGC 14-100r2 - CF-netCDF3.0 Open Geospatial Consortium Submission Date: 2015-04-15 Approval Date: 2015-06-08 Publication Date: 2015-11-18 External identifier of this OGC ® document: http://www.opengis.net/doc/IS/cf-netcdf3-encoding-gml-as/2.0 URL for this OGC ® document: https://docs.ogc.org/is/14-100r2/14-100r2.html Additional Formats (informative): Internal reference number of this OGC ® document: 14-100r2 Version: 2.0 Category: OGC ® Implementation Standard Editors: Ben Domenico , Stefano Nativi OGC® CF-netCDF 3.0 encoding using GML Coverage Application Schema Copyright notice Copyright © 2015 Open Geospatial Consortium To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . Warning This document is an OGC Member approved international standard. This document is available on a royalty free, non-discriminatory basis. Recipients of this document are invited to submit, with their comments, notification of any relevant patent rights of which they are aware and to provide supporting documentation. Document type: OGC Standard Document subtype: Encoding Document stage: Approved Document language: English License Agreement Permission is hereby granted by the Open Geospatial Consortium, ("Licensor"), free of charge and subject to the terms set forth below, to any person obtaining a copy of this Intellectual Property and any associated documentation, to deal in the Intellectual Property without restriction (except as set forth below), including without limitation the rights to implement, use, copy, modify, merge, publish, distribute, and/or sublicense copies of the Intellectual Property, and to permit persons to whom the Intellectual Property is furnished to do so, provided that all copyright notices on the intellectual property are retained intact and that each person to whom the Intellectual Property is furnished agrees to the terms of this Agreement. If you modify the Intellectual Property, all copies of the modified Intellectual Property must include, in addition to the above copyright notice, a notice that the Intellectual Property includes modifications that have not been approved or adopted by LICENSOR. THIS LICENSE IS A COPYRIGHT LICENSE ONLY, AND DOES NOT CONVEY ANY RIGHTS UNDER ANY PATENTS THAT MAY BE IN FORCE ANYWHERE IN THE WORLD. THE INTELLECTUAL PROPERTY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE DO NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE INTELLECTUAL PROPERTY WILL MEET YOUR REQUIREMENTS OR THAT THE OPERATION OF THE INTELLECTUAL PROPERTY WILL BE UNINTERRUPTED OR ERROR FREE. ANY USE OF THE INTELLECTUAL PROPERTY SHALL BE MADE ENTIRELY AT THE USER’S OWN RISK. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ANY CONTRIBUTOR OF INTELLECTUAL PROPERTY RIGHTS TO THE INTELLECTUAL PROPERTY BE LIABLE FOR ANY CLAIM, OR ANY DIRECT, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM ANY ALLEGED INFRINGEMENT OR ANY LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR UNDER ANY OTHER LEGAL THEORY, ARISING OUT OF OR IN CONNECTION WITH THE IMPLEMENTATION, USE, COMMERCIALIZATION OR PERFORMANCE OF THIS INTELLECTUAL PROPERTY. This license is effective until terminated. You may terminate it at any time by destroying the Intellectual Property together with all copies in any form. The license will also terminate if you fail to comply with any term or condition of this Agreement. Except as provided in the following sentence, no such termination of this license shall require the termination of any third party end-user sublicense to the Intellectual Property which is in force as of the date of notice of such termination. In addition, should the Intellectual Property, or the operation of the Intellectual Property, infringe, or in LICENSOR’s sole opinion be likely to infringe, any patent, copyright, trademark or other right of a third party, you agree that LICENSOR, in its sole discretion, may terminate this license without any compensation or liability to you, your licensees or any other party. You agree upon termination of any kind to destroy or cause to be destroyed the Intellectual Property together with all copies in any form, whether held by you or by any third party. Except as contained in this notice, the name of LICENSOR or of any other holder of a copyright in all or part of the Intellectual Property shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Intellectual Property without prior written authorization of LICENSOR or such copyright holder. LICENSOR is and shall at all times be the sole entity that may authorize you or any third party to use certification marks, trademarks or other special designations to indicate compliance with any LICENSOR standards or specifications. This Agreement is governed by the laws of the Commonwealth of Massachusetts. The application to this Agreement of the United Nations Convention on Contracts for the International Sale of Goods is hereby expressly excluded. In the event any provision of this Agreement shall be deemed unenforceable, void or invalid, such provision shall be modified so as to make it valid and enforceable, and as so modified the entire Agreement shall remain in full force and effect. No decision, action or inaction by LICENSOR shall be construed to be a waiver of any rights or remedies available to it. i. Abstract The OGC CF-netCDF data model supports multi-dimensional gridded data and multi-dimensional multi-point data, representing space and time-varying phenomena. In particular, this extension standard is limited to multi-point, and regular and warped grids. This standard specifies the CF-netCDF data model encoding using the OGC GML 3.2.1 coverage application schema, as well as CF-netCDF data exchange format and protocol encoding. This standard specifies: (a) the CF-netCDF GML encoding to be used by OGC standards; (b) the CF-netCDF data format exchanged using OGC standards; (c) the Internet protocol characteristics to effectively exchange CF-netCDF data. As per the GML 3.3. standard, GML 3.3 imports the 3.2 schema. The canonical location of the 3.2 all components schema document for 3.3 is http://schemas.opengis.net/gml/3.2.1/gml.xsd ii. Keywords The following are keywords to be used by search engines and document catalogues. ogcdoc, netcdf, cf-netcf, encoding extension, multi-dimensional, gml, data format. iii. Preface This standard describes an extension of the CF-netCDF 3.0 data model [OGC 11-165r02]. This extension is required to encode CF-netCDF 3.0 datasets using the “OGC Implementation Schema for Coverages” specification [OGC 09-146r2] and to exchange CF-netCDF datasets. Suggested additions, changes, and comments on this draft standard are welcome and encouraged. Such suggestions may be submitted by email message or by making suggested changes in an edited copy of this document. Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. The Open Geospatial Consortium shall not be held responsible for identifying any or all such patent rights. Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by any implementation of the standard set forth in this document, and to provide supporting documentation. iv. Submitting organizations The following organizations submitted this Document to the Open Geospatial Consortium (OGC): The University Corporation for Atmospheric Research (UCAR); The Italian National Research Council, Institute of Atmospheric Pollution Research (CNR-IIA, Florence Dept.). v. Submitters All questions regarding this submission should be directed to the editor or the submitters. Name Representing OGC Member Stefano Nativi CNR-IIA/ESSI-lab YES Ben Domenico UCAR/Unidata YES 1 Scope This document specifies the CF-netCDF model encoding using the GML 3.2.1 Application Schema –Coverage entities. Besides, it specifies the data format and Internet protocol characteristics to serve CF-netCDF data in an effective and usable way. GML 3.2.1 has not been deprecated. As per the GML 3.3. standard, GML 3.3 imports the 3.2 schema. The canonical location of the 3.2 all components schema document for 3.3 is http://schemas.opengis.net/gml/3.2.1/gml.xsd . This CF-netCDF 3.0 extension allows discovery and access services to exchange CF-netCDF data –e.g. encoded in GML. In fact, this specification introduces a set of requirements which a WxS implementation must fulfil to describe and exchange CF-netCDF 3.0 datasets from server to client using the coverage extension of the GML 3.2.1 encoding format. This standard specifies: (a) the CF-netCDF GML encoding to be used by OGC standards; (b) the CF-netCDF data format exchanged using OGC standards; (c) the Internet protocol characteristics to effectively exchange CF-netCDF data. CF-netCDF encoding format is netCDF conforming to the Climate and Forecast (CF) conventions (CF-netCDF). It consists of either a binary, XML, or ASCII format which encodes the CF-netCDF data model. CF-netCDF 3.0 has emerged as a well-supported data model and encoding for several different domains, including: atmospheric science, oceanography, climatology, meteorology, hydrology, etc. This specification deals with multi-dimensional discrete coverage data and multi-dimensional multi-point data. 2 Conformance Standardization target is the encoding of netCDF-CF datasets returned by any WxS implementation (currently: servers). In particular, this standard defines three standardization targets: (a) CF-netCDF GML implementations (currently encodings); (b) CF-netCDF data format (currently encodings); (c) CF-netCDF data format (currently encodings) returned by multiple part messages. This document establishes three requirements classes, one for each standardization target: 1. CF-netCDF-1.6 GML encoding , of http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding -for the standardization target (a); 2. CF-netCDF-1.6 data format , of http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format -for the standardization target (b); 3. CF-netCDF-1.6 multipart data encoding , of http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Multipart-encoding -for the standardization target (c); and three corresponding pertaining conformance class, CF-netCDF-1.6 , with URIs: 1. http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding 2. http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format 3. http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Multipart-encoding Requirements and conformance test URIs defined in this document are relative to http://www.opengis.net/spec/netCDF_data-model/ . Annex A lists the conformance tests which shall be exercised on any software artifact claiming to implement an CF-netCDF 3.0 extension for GML 3.2.1 encoding. 3 References The following normative documents contain provisions that, through reference in this text, constitute provisions of this document. For dated references, subsequent amendments to, or revisions of, any of these publications do not apply. For undated references, the latest edition of the normative document referred to applies. OGC 10-090, NetCDF Core version 1.0 Conformance classes used: core OGC 10-092, NetCDF Binary Encoding Extension Standard: NetCDF Classic and 64-bit Offset Format version 1.0 Conformance classes used: netCDF classic netCDF 64-bit OGC 11-165r2, CF-netCDF Data Model extension specification , version 2.0.1 Conformance classes used: CF-netCDF core CF-netCDF Discrete Sampling CF-netCDF Mapping onto ISO 19123 OGC 07-036, Geography Markup Language (GML) Encoding Standard , version 3.2.1 Conformance classes used: GML writing OGC 09-146r1, OGC ® Implementation Schema for Coverages , version 1.0 Conformance classes used: gml-coverage 4 Terms and Definitions This document uses the terms defined in Sub-clause 5.3 of [OGC 06-121r8], which is based on the ISO/IEC Directives, Part 2, Rules for the structure and drafting of International Standards. In particular, the word “shall” (not “must”) is the verb form used to indicate a requirement to be strictly followed to conform to this standard. For the purposes of this document, the following additional terms and definitions apply. 4.1 Coverage Feature that acts as a function to return values from its range for any direct position within its spatiotemporal domain [OGC 07-111] 4.2 Data Model A description of the organization of data in a manner that reflects an information structure [ISO/IEC 11179-1 Specification and standardization of data elements – Part 1: Framework] NOTE: netCDF literature reports the following definition for data model: a way of thinking about scientific data by applying a data model theory. It is an abstraction that describes how datasets are represented and used. In computer terms, a data model can be thought of as equivalent to an abstract object model in Object Oriented Programming in that an abstract data model describes data objects and what methods can be used on them. 4.3 Feature abstraction of real world phenomena [5]. NOTE A feature may occur as a type or an instance. 4.4 GMLCOV Note that OGC Coverage Implementation Schema 1.1 supersedes its predecessor version, GML 3.2.1 Application Schema – Coverages version 1.0.1, nicknamed GMLCOV, in a backwards compatible way. Instead of naming the new version GMLCOV 1.1, the standard has been renamed to Coverage Implementation Schema (CIS) 1.1 to remedy misunderstandings caused by the initial title, such as that only a GML encoding is defined here (whereas in fact a format-independent implementable coverage model is established). For simplicity, the GMLCOV shorthand is used throughout this specification. 4.5 Grid Network composed of two or more sets of curves in which the members of each set intersect the members of the other sets in a algorithmic way [5] NOTE: the curves partition a space into grid cells. 4.6 MIME MIME (Multi-Purpose Internet Mail Extensions) is an extension of the original Internet e-mail protocol that lets people use the protocol to exchange different kinds of data files on the Internet: audio, video, images, application programs, and other kinds, as well as the ASCII text handled in the original protocol, the Simple Mail Transfer Protocol (SMTP). 4.7 Multipart messages Through the use of the multipart type, MIME allows mail messages to have parts arranged in a tree structure where the leaf nodes are any non-multipart content type and the non-leaf nodes are any of a variety of multipart types. 4.8 Multi-point coverage A discrete coverage which is characterized by a finite domain consisting of points. Generally, the domain is a set of irregularly distributed points. A set of hydrographic soundings is an example of a discrete point coverage. 4.9 NetCDF NetCDF is a standard for data on complex grids –curvilinear in XY; sigma and density-related in Z; climatological and artificial calendars in T; and heading towards “tile mosaics” and 5D forecast ensembles in the near future. 4.10 Web address For purposes of this document, Web address is an HTTP URL that allows applications to access remote (optionally, time-aggregated collections of) netCDF-CF files (virtual datasets – often terabyte sized) through netCDF API –as if they were local netCDF files. 5 Conventions 5.1 Namespace prefix conventions The following namespaces are used in this document. The prefix abbreviations used constitute conventions used here, but are not normative. The namespaces to which the prefixes refer are normative, however. Namespace mappings Prefix Namespace URI Description GML http://www.opengis.net/gml/3.2 GML 3.2.1 GMLCOV http://www.opengis.net/gmlcov/1.0 GML Application Schema for Coverages 1.0 ncml http://unidata.ucar.edu/ncml ncML schema xsd http://www.w3.org/2001/XMLSchema XML Schema 5.2 CF-netCDF data model This document does not contain inline a formal specification of the CF-netCDF data model. In fact, it is available as an OGC specification [OGC 11-165r2]. This specification formalizes the CF-netCDF data model mapping onto the ISO 19123 coverage geometry model. For reader’s convenience, the CF-netCDF data model is shown in Figure 1, Figure 2, and Figure 3. An example of CF-netCDF dataset is reported in the Annex B. Figure: : CF-netCDF data model: Dataset and Variable elements [OGC 11-165r2] Figure: : CF-netCDF data model: Coordinate Variable and Coordinate System elements [OGC 11-165r2] Figure: : CF-netCDF data model: Discrete Sampling Geometry elements [OGC 11-165r2] 5.3 Web address For the scope of this document, a Web address is a transparent mechanism by which an application can use netCDF API calls on a remote file. Thus, for any netCDF subset that may be derived from a WxS server, there may be a Web URL that is an indirect reference to that same subset. Essentially, the netCDF file is just a de-referencing of this URL. Any application program that can utilize a netCDF file can (in principal) utilize the URL equivalently. NetCDF Community applications commonly make use of Web addresses (i.e. HTTP URLs) to access remote (optionally, time-aggregated collections of) netCDF-CF files (virtual datasets – often terabyte sized) through netCDF API –as if they were local netCDF files. 6 CF-NetCDF dataset encoding with GML 3.2.1 – application schema – Coverages GML 3.2.1 Application Schema -Coverage data model [OGC 09-146r1] introduces the concept of Coverage (i.e. GMLCOV:Coverage). For the reader’s convenience the data model is depicted in Figure 4 and Figure 5. The related GML:DomainSet and GML:RangeSet entities are defined in [7]; while, SWE Common:DataRecord is defined in [8]. Figure: : GML 3.2.1 Coverage structure [OGC 09-146r1] Figure: : GML:DomainSet implementations [OGC 09-146r1] 6.1 GML 3.2.1 Coverage types Since CF-netCDF dataset realizes the ISO19123:CV_DiscreteCoverage type [4], the following GML 3.2.1 coverage types are considered for the mapping (see Figure 4): GMLCOV:GridCoverage type, GMLCOV:RectifiedGridCoverage type, GMLCOV:ReferenceableGridCoverage type, or GMLCOV:MultiPointCoverage –i.e. ISO 19123:CV_DiscretePointCoverage. 6.2 Encoding rules for CF-netCDF dataset Considering the mapping between the GMLCOV:Coverage object and property names to the corresponding class names and their attributes in ISO 19123 (see Table D.8 of [7] and the constraints introduced by [OGC 09-146r1]), and the mapping between the CF-netCDF dataset object and property names to the corresponding class names and their attributes in ISO 19123 (see OGC 11-165r2 [4]), Table 1 defines the mapping between the CF-netCDF dataset object and property names to the corresponding GMLCOV:Coverage object and property names. Figure 6 and Figure 7 depict these mapping rules. Table 1. Encoding rules for CF-netCDF dataset CF-netCDF entity ISO Grid Coverage entity Encoding Cardinality GMLCOV:Coverage entity Rule # CF_Dataset and sub-types (e.g. MultidimensionalArray and RaggedArray entities) CV_DiscreteCoverage (CV_DiscreteGridPointCoverage or CV_DiscretePointCoverage ) 1 to 0..n GML:Coverage implemented as: GMLCOV:GridCoverage | GMLCOV:RectifiedGridCoverage | GMLCOV:ReferenceableGridCoverage | GMLCOV:MultiPointCoverage 1 CF_Variable (s) and sub-types related to a CoordinateSystem CV_CoverageFunction 1 to 0..1 coverageFunction, domainSet, rangeType, rangeSet implemented as, respectively: GML:CoverageFunction GML:Grid | GML:RectifiedGrid | GML:ReferenceableGrid | GML:MultiPoint SWE:DataRecord GML:RangeSet (see Table 2) -- CoordinateSystem CS_CRS 1 to 1 boundedBy implemented as GML:Envelope or the subtype GML:EnvelopeWithTimePeriod (GML:Envelope attributes: srsName and axisLabels must be instantiated) (see Table 3) -- FeatureCollection CV_CoverageFunction 1 to 0..1 coverageFunction, domainSet, rangeType, rangeSet implemented as, respectively: GML:CoverageFunction GML:Grid | GML:RectifiedGrid | GML:ReferenceableGrid | GML:MultiPoint SWE:DataRecord GML:RangeSet (see Table 4) -- Requirement 1: CF-dataset /req/CF-netCDF-1.6-GML-encoding/CF-dataset CF-netCDF datasets, its subtypes and its realizations CF-netCDF RaggedArray and CF-netCDF MultidimensionalArray shall realize one of the following GMLCOV:Coverage subtypes: GMLCOV:GridCoverage, GMLCOV:RectifiedGridCoverage, GMLCOV:ReferenceableGridCoverage, GMLCOV:MultiPointCoverage. Additionally , the GML:DomainSet is implemented as one of the following subtypes: GML:Grid, GML:RectifiedGrid, GML:ReferenceableGrid, GML:MultiPoint (see Figure 5). 6.3 Encoding rules for CF-Variables Table 2. Encoding rules for CF_Variable. CF-netCDF entity ISO Coverage entity Encoding Cardinality GMLCOV entity GML 3.2.1 entity rule # CF_CoordinateVariable a (Valid subtypes are: LatitudeCoordinateLongitudeCoordinate, VerticalCoordinate, TimeCoordinate) or Spatial/ temporal CF_AuxiliaryCoordinateVariable b ISO19123:CV_DiscreteGridPointCoverage.CV_GridValueMatrix.CV_GridPoint.gridCoord 1 to 1 GMLCOV:GridCoverage.domainSet | GMLCOV:RectifiedGridCoverage.domainSet | GMLCOV:ReferenceableGridCoverage.domainSet GML:DomainSet realized as: GML:Grid or its subtypes: GML:RectifiedGrid | GML:ReferenceableGrid 2, 3 ISO19123:CV_DiscretePointCoverage.CV_PointValuePair.geometry.GM_Point 1 to 1 GMLCOV:MultiPointCoverage.domainSet GML:DomainSet realized as: GML:MultiPoint 2, 3 ISO19123:CV_DiscreteGridPointCoverage.CV_GridValueMatrix.sequencingRule 1 to 0..1 GMLCOV:Coverage. coverageFunction GML:CoverageFunction.GridFunction 4, 5 ISO19123:CV_DiscreteGridPointCoverage.CV_GridValueMatrix.startSequence ISO19123:CV_DiscretePointCoverage. CoverageFunction e 1 to 0..1 GMLCOV:Coverage. coverageFunction GML:CoverageFunction.CoverageMappingRule 4, 5 data CF_Variable c or non Spatial/temporal CF_AuxiliaryCoordinateVariable e ISO19123:CV_DiscreteGridPointCoverage.CV_GridValuesMatrix.values 1 to 1 GMLCOV: Coverage.rangeSet GML:RangeSet 6, 8 ISO19123:CV_DiscretePointCoverage. CV_PointValuePair.value f 1 to 1 GMLCOV: Coverage.rangeSet GML:RangeSet 6, 8 data CF_Variable d or non spatial/temporal CF_AuxiliaryCoordinateVariable e ISO19123:CV_DiscreteGridPointCoverage.RangeType.AttributesType entry (i.e. AttributeName, TypeName) 1 to 1 GMLCOV: Coverage.rangeType SWE:DataRecord 7, 9 CV_DiscretePointCoverage.RangeType.AttributesType entry (i.e. AttributeName, TypeName) 1 to 1 GMLCOV: Coverage.rangeType SWE:DataRecord 7, 9 a The set of spatial/temporal coordinate variables (shared by a group of CF_Variables) maps to the coverage domain, whose geometry is represented by a single grid (ISO19123:CV_Grid) or point value pairs (ISO19123:CV_PointValuePair). b The set of spatial/temporal auxiliary coordinate variables (shared by a group of CF_Variables) maps to the coverage domain, whose geometry is represented by a single grid (ISO19123:CV_Grid) or point value pairs (ISO19123:CV_PointValuePair). The CF_Variables must define a coordinates attribute identifying the auxiliary coordinate variables. This is the case implemented by CF_FeatureCollection variables. c The set of CF_Variables comprising the group that shares a common Coordinate System (i.e. set of spatial/temporal CF_CoordinateVariables or CF_AuxiliaryCoordinateVariables). The CF_Variable data values generate the grid value matrix record values: CV_GridValueMatrix.values.record entry (i.e. AttributeName, Any). The range of each CV_DiscreteGridPointCoverage is a list of records with an attribute for every related CF-netCDF variable and for every CF_CoordinateVariable –of the shared CoordinateSystem- that is not allowed in a coverage CRS (i.e. parametric dimension axes). Thus, the CF_Variable properties (i.e. name and type ) realize the CV_DiscreteGridPointCoverage.RangeType.AttributesType entry (i.e. AttributeName, TypeName). d The range of each CV_DiscreteGridPointCoverage is a list of records with an attribute for every related CF-netCDF variable and for every CF_AuxiliaryCoordinateVariable that is not allowed in a coverage domain/CRS (i.e. parametric dimension axes). e Parametric dimensions; examples are: pressure , salinity , density . These coordinate variables do not behave like a discrete coverage domain axis; on the contrary, they behave like a discrete coverage range axis. f In a gml:MultiPointCoverage the mapping from the domain to the range is straightforward. · For gml:DataBlock encodings, the points of the gml:MultiPoint are mapped in document order to the tuples of the data block. · For gml:CompositeValue encodings, the points of the gml:MultiPoint are mapped to the members of the composite value in document order. · For gml:File encodings, the points of the gml:MultiPoint are mapped to the records of the file in sequential order. CF_RaggedArray representations of a CF_Dataset should use such encodings Requirement 2: Dataset.domainSet#1 /req/CF-netCDF-1.6-GML-encoding/Dataset.domainSet#1 The set of spatial/temporal CF_CoordinateVariable (comprised of a common coordinate system) that characterize a CF-netCDF dataset, shall realize a GML:Coverage.domainSet property, implemented as: GML:MultiPoint, GML:Grid object or its subtypes: GML:RectifiedGrid, GML:ReferenceableGrid. Requirement 3: Dataset.domainSet#2 /req/CF-netCDF-1.6-GML-encoding/Dataset.domainSet#2 if the spatial/temporal domain is defined by auxiliary variables, the set of spatial/temporal CF_AuxiliaryCoordinateVariable that characterizes a CF-netCDF Variable, shall realize a GML:Coverage.domainSet property, implemented as: GML:MultiPoint, GML:Grid object or its subtypes: GML:RectifiedGrid, GML:ReferenceableGrid. Requirement 4: Dataset.coverageFunction#1 /req/CF-netCDF-1.6-GML-encoding/Dataset.coverageFunction#1 if the mapping from the domain to the range of the coverage is not characterized by the default values for GML:Coverage (see [7]), the set of spatial/temporal CF_CoordinateVariable (comprised of a common coordinate system) that characterizes a CF-netCDF dataset shall realize a GML:Coverage.coverageFunction property, implemented as either a GML:CoverageFunction.GridFunction or a GML:CoverageFunction.CoverageMappingRule object. Requirement 5: Dataset.coverageFunction#2 /req/CF-netCDF-1.6-GML-encoding/Dataset.coverageFunction#2 if the spatial/temporal domain is defined by auxiliary variables, the set of spatial/temporal CF_AuxiliaryCoordinateVariable that characterizes one or more CF-netCDF Variables shall realize a GML:Coverage.coverageFunction property, implemented as either a GML:CoverageFunction.GridFunction or a GML:CoverageFunction.CoverageMappingRule object. Requirement 6: Dataset.rangeSet /req/CF-netCDF-1.6-GML-encoding/Dataset.rangeSet The set of CF-netCDF CF_Variable that shares a common spatial/temporal coordinate system, shall realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Requirement 7: Dataset.rangeType /req/CF-netCDF-1.6-GML-encoding/Dataset.rangeType The set of CF-netCDF CF_Variable that shares a common spatial/temporal coordinate system, shall realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Requirement 8: Dataset.parametric-rangeSet /req/CF-netCDF-1.6-GML-encoding/Dataset.parametric-rangeSet The set of CF_AuxiliaryCoordinateVariable, which are not space or time dimension, shall contribute to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Requirement 9: Dataset.parametric-rangeType /req/CF-netCDF-1.6-GML-encoding/Dataset.parametric-rangeType the set of CF_AuxiliaryCoordinateVariable, which are not space or time dimension, shall contribute to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. 6.4 Encoding rules for CF-netCDF CoordinateSystem Table 3. Encoding rules for CF-netCDF CoordinateSystem CF-netCDF entity ISO Coverage entity Encoding Cardinality GML 3.2.1 entity Rule # Spatial/temporal Coordinate System a CV_DiscreteGridPointCoverage.SC_CRS.SC_CoordinateSystem | CV_DiscretePointCoverage.SC_CRS.SC_CoordinateSystem 1 to 1 GML:Envelope or the subtype GML:EnvelopeWithTimePeriod 10 CF_CoordinateVariable b or spatial/temporal CF_AuxiliaryCoordinateVariable d CV_DiscreteGridPointCoverage.SC_CRS.SC_CoordinateSystem.SC_CoordinateSystemAxis 1 to 1 GML:Envelope.axisLabels or GML:EnvelopeWithTimePeriod.axisLabels 11, 12 CV_DiscretePointCoverage.SC_CRS.SC_CoordinateSystem.SC_CoordinateSystemAxis 1 to 1 GridMappingVariable CV_DiscreteGridPointCoverage.SC_CRS.SC_CoordinateSystem.type | CV_DiscretePointCoverage.SC_CRS.SC_CoordinateSystem.type 1 to 0..1 the subype of GML_AbstractCRS pointed by the GML:Envelope.srsName attribute c 13 a Parametric coordinate systems are allowed in CF-netCDF but not in CRS [1] . A coordinate system is of type parametric if a physical or material property is used as a dimension [21]; valuable examples are pressure in meteorology and density in oceanography. It is possible that a CoordinateSystem entity does not contain any axes allowed in coverage CRS (i.e. only parametric dimension axes). Only spatial and temporal coordinates in a CF-netCDF CoordinateSystem become part of a coverage CRS, whereas parametric dimension axes are mapped to compound range set components. b A CF-netCDF spatial/temporal CoordinateVariable shared by a group of CF-Variables. Valid subtypes are: LatitudeCoordinate LongitudeCoordinate, VerticalCoordinate, TimeCoordinate, CoordinateSystem.CoordinateAxis ( with axis type attribute equal to: Lat , Lon , Height , GeoX , GeoY , GeoZ , RadialAzimuth , RadialElevation , RadialDistance, time). c Wherever a GML object is associated with a Coordinate Reference System, this is implemented by an attribute (srsName) pointing to a GML:AbstractCRS element [7]. d The set of spatial/temporal auxiliary coordinate variables (shared by a group of CF_Variables) maps to the coverage domain, whose geometry is represented by a single grid (ISO19123:CV_Grid) or point value pairs (ISO19123:CV_PointValuePair). Requirement 10: Dataset.boundedBy /req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy The spatial/temporal CoordinateSystem, which is comprised of either spatial and temporal CF_CoordinateVariable objects or spatial and temporal CF_AuxiliaryCoordinateVariable objects, shall realize a GML:Coverage.boundedBy property, implemented as a GML:Envelope object or its subtype GML:EnvelopeWithTimePeriod. Additionally , the attribute GML:Envelope.srsName shall have a value. Requirement 11: Dataset.boundedBy.axisLabels#1 /req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.axisLabels#1 The set of spatial/temporal CF_CoordinateVariable comprised of a CoordinateSystem object, shall realize a GML:Envelope.axisLabels object or its subtype GML:EnvelopeWithTimePeriod.axisLabels. Requirement 12: Dataset.boundedBy.axisLabels#2 /req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.axisLabels#2 The set of spatial/temporal CF_Auxiliary CoordinateVariable, comprised of a CoordinateSystem object related to CF_Variables, shall realize a GML:Envelope.axisLabels object or its subtype GML:EnvelopeWithTimePeriod.axisLabels. Requirement 13: Dataset.boundedBy.CRS /req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.CRS The CF-netCDF GridMappingVariable, shall determine the subype of GML_AbstractCRS pointed by the GML:Envelope.srsName attribute. 6.5 Encoding rules for CF-netCDF DiscreteSamplingGeometry Table 4 - Encoding rules for CF-netCDF DiscreteSamplingGeometry CF-netCDF entity ISO Coverage entity Encoding. Cardinality GMLCOV entity GML 3.2.1 entity Rule # Spatial/temporal CF_InstanceVariable a CV_DiscreteGridPointCoverage.SC_CRS.SC_CoordinateSystem.SC_CoordinateSystemAxis or CV_DiscretePointCoverage.SC_CRS.SC_CoordinateSystem.SC_CoordinateSystemAxis 1 to 1 -- GML:Envelope.axisLabels or GML:EnvelopeWithTimePeriod.axisLabels 14 (12) ISO19123:CV_DiscreteGridPointCoverage.CV_GridValueMatrix.CV_GridPoint.gridCoord 1 to 1 GMLCOV:GridCoverage.domainSet | GMLCOV:RectifiedGridCoverage.domainSet | GMLCOV:ReferenceableGridCoverage.domainSet GML:DomainSet realized as: GML:Grid or its subtypes: GML:RectifiedGrid | GML:ReferenceableGrid 14 (3) ISO19123:CV_DiscretePointCoverage.CV_PointValuePair.geometry.GM_Point 1 to 1 GMLCOV:MultiPointCoverage.domainSet GML:DomainSet realized as: GML:MultiPoint 14 (3) ISO19123:CV_DiscreteGridPointCoverage.CV_GridValueMatrix.sequencingRule 1 to 0..1 GMLCOV:Coverage.coverageFunction GML:CoverageFunction.GridFunction 14 (5) ISO19123:CV_DiscreteGridPointCoverage.CV_GridValueMatrix.startSequence 1 to 0..1 GML:CoverageFunction.CoverageMappingRule 14 (5) ISO19123:CV_DiscretePointCoverage. CoverageFunction e CF_MultidimensionalArray.InstanceDimension b ISO19123:CV_DiscreteGridPointCoverage.CV_GridValuesMatrix.values 1 to 0..1 GMLCOV: Coverage.rangeSet GML:RangeSet 15 ISO19123:CV_DiscretePointCoverage. CV_PointValuePair.value f 1 to 0..1 ISO19123:CV_DiscreteGridPointCoverage.RangeType.AttributesType entry (i.e. AttributeName, TypeName) 1 to 0..1 GMLCOV: Coverage.rangeType SWE:DataRecord 16 CV_DiscretePointCoverage.RangeType.AttributesType entry (i.e. AttributeName, TypeName) 1 to 0..1 CF_RaggedArray.SampleDimension and CF_IndexVariable c or CF_CountVariable c ISO19123:CV_DiscreteGridPointCoverage.CV_GridValuesMatrix.values 1 to 0..1 GMLCOV: Coverage.rangeSet GML:RangeSet 17 ISO19123:CV_DiscretePointCoverage. CV_PointValuePair.value f 1 to 0..1 ISO19123:CV_DiscreteGridPointCoverage.RangeType.AttributesType entry (i.e. AttributeName, TypeName) 1 to 0..1 GMLCOV: Coverage.rangeType SWE:DataRecord 18 CV_DiscretePointCoverage.RangeType.AttributesType entry (i.e. AttributeName, TypeName) 1 to 0..1 CF_Point FeatureCollection domain d ISO19123:CV_DiscreteCoverage.domainExtent and CV_DiscreteCoverage.SC_CRS.SC_CoordinateSystem.SC_CoordinateSystemAxis 1 to 1 GMLCOV: Coverage.domainSet GML:EnvelopeWithTimePeriod.axisLabels = "x y t" | "lat lon t" | "lon lat t" 19 CF_TimeSerie FeatureCollection domain e ISO19123:CV_DiscreteCoverage.domainExtent 1 to 1 GMLCOV: Coverage.domainSet GML:EnvelopeWithTimePeriod.axisLabels = "x y t" | "lat lon t" | "lon lat t" 20 CF_Trajectory FeatureCollection domain f ISO19123:CV_DiscreteCoverage.domainExtent 1 to 1 GMLCOV: Coverage.domainSet GML:EnvelopeWithTimePeriod.axisLabels = "x y t" | "lat lon t" | "lon lat t" 21 CF_Profile FeatureCollection domain g ISO19123:CV_DiscreteCoverage.domainExtent 1 to 1 GMLCOV: Coverage.domainSet GML:EnvelopeWithTimePeriod.axisLabels = "x y z t" | "lat lon z t" | "lon lat z t" 22 CF_TimeSeriesProfile FeatureCollection domain h ISO19123:CV_DiscreteCoverage.domainExtent 1 to 1 GMLCOV: Coverage.domainSet GML:EnvelopeWithTimePeriod.axisLabels = "x y z t" | "lat lon z t" | "lon lat z t" 23 CF_TrajectoryProfile FeatureCollection domain i ISO19123:CV_DiscreteCoverage.domainExtent 1 to 1 GMLCOV: Coverage.domainSet GML:EnvelopeWithTimePeriod.axisLabels = "x y z t" | "lat lon z t" | "lon lat z t" 24 a spatial/temporal CF_AuxiliaryCooridnateVariable which has as only dimension the "instance" dimension; it is used to differentiate the Feature instances comprised of a Feature Collection -e.g. X(station), lat(profile), etc. This mapping was already formalized by Requirement 3, Requirement 5, Requirement 8and Requirement 12. b CF_MultidimensionalArray instance dimension(s) may be used to generate an instance dimensionality for the coverage range-set. c CF_RaggedArray sample dimension(s) and variables used to index the observation elements (i.e. either CF_IndexVariable or CF_CountVariable) may be used to generate an instance dimensionality for the coverage range-set. d Point Feature Collection has the following mandatory space-time coordinates x(i) y(i) t(i); i=collection instance. e TimeSerie Feature Collection has the following mandatory space-time coordinates x(i) y(i) t(i,o); i=collection instance; o=observation. f Trajectory Feature Collection has the following mandatory space-time coordinates x(i,o) y(i,o) t(i,o); i=collection instance; o=observation. g Profile Feature Collection has the following mandatory space-time coordinates x(i) y(i) z(i,o) t(i); i=collection instance; o=observation. h TimeSerieProfile Feature Collection has the following mandatory space-time coordinates x(i) y(i) z(i,p,o) t(i,p); i=collection instance; p=profile; o=observation. i TrajectoryProfile Feature Collection has the following mandatory space-time coordinates x(i,p) y(i,p) z(i,p,o) t(i,p); i=collection instance; p=profile; o=observation. Requirement 14: InstanceVariable /req/CF-netCDF-1.6-GML-encoding/InstanceVariable each CF_InstanceVariable object shall be encoded as a spatial/temporal CF_AuxiliaryCooridnateVariable which has as only dimension the “instance” dimension. Requirement 15: RangeInstanceDimension#1 /req/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#1 each CF_MultidimensionalArray.InstanceDimension object shall contribute to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Requirement 16: RangeInstanceDimension#2 /req/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#2 each CF_MultidimensionalArray.InstanceDimension object shall contribute to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Requirement 17: RangeInstanceDimension#3 /req/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#3 each CF_RaggedArray.SampleDimension object along with associated CF_IndexVariable or CF_CountVariable shall contribute to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Requirement 18: RangeInstanceDimension#4 /req/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#4 each CF_RaggedArray.SampleDimension object along with associated CF_IndexVariable or CF_CountVariable shall contribute to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Requirement 19: PointFeatureCollection.axisLabels /req/CF-netCDF-1.6-GML-encoding/PointFeatureCollection.axisLabels each CF_Point FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to “x y t” | “lat lon t” | “lon lat t”. Requirement 20: TimeSerieFeatureCollection.axisLabels /req/CF-netCDF-1.6-GML-encoding/TimeSerieFeatureCollection.axisLabels each CF_TimeSerie FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to “x y t” | “lat lon t” | “lon lat t”. Requirement 21: TrajectoryFeatureCollection.axisLabels /req/CF-netCDF-1.6-GML-encoding/TrajectoryFeatureCollection.axisLabels each CF_Trajectory FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to “x y t” | “lat lon t” | “lon lat t”. Requirement 22: ProfileFeatureCollection.axisLabels /req/CF-netCDF-1.6-GML-encoding/ProfileFeatureCollection.axisLabels each CF_Profile FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to “x y z t” | “lat lon z t” | “lon lat z t”. Requirement 23: TimeSeriesProfileFeatureCollection.axisLabels /req/CF-netCDF-1.6-GML-encoding/TimeSeriesProfileFeatureCollection.axisLabels each CF_TimeSeriesProfile FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to “x y z t” | “lat lon z t” | “lon lat z t”. Requirement 24: TrajectoryProfileFeatureCollection.axisLabels /req/CF-netCDF-1.6-GML-encoding/TrajectoryProfileFeatureCollection.axisLabels each CF_TrajectoryProfile FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to “x y z t” | “lat lon z t” | “lon lat z t”. Figure: : CF-netCDF dataset mapping to GMLCOV data model Figure: : CF-netCDF discrete sampling geometries mapping to GMLCOV data model 7 Service operation response returning a CF-netCDF dataset 7.1 Concrete coverage types For WxS, the GML encoding is generally used for the purpose of defining response semantics. A server may deliver a result dataset in some other format –e.g. CF-netCDF. However, it is required that result datasets, regardless of what the encoding chosen is, have a content which is consistent with the GML specification [OGC 09-146r1]. Requirement 25: ServiceOperationResponse /req/CF-netCDF-1.6-Data-format/ServiceOperationResponse any service operation response returning successfully a CF-netCDF dataset, shall return a concrete sub-type of the GMLCOV:Coverage class, as showed in Figure 4. 7.2 Concrete CF-netCDF data format The schema depicted in Figure 8 introduces the concrete CF-netCDF data format used to return requested datasets. Requirement 26: coverageFormat-structure /req/CF-netCDF-1.6-Data-format/coverageFormat-structure The CF-netCDF data format used to return requested GMLCOV:Coverages shall adhere to Figure 8. 7.3 GridCoverageFile class The response to a successful operation requesting a CF-netCDF dataset is a concrete sub-type of GMLCOV:Coverage which is encoded as a GridCoverageFile , an abstract entity which has three valuation subclasses: BinaryFile , XMLDocument , and Web address . NOTE: a CF-netCDF BinaryFile may be accessed directly or can be referenced by: (a) an XMLDocument object (e.g. an ncML dataset); (b) an Web address object. 7.4 BinaryFile class BinaryFile class has two concrete sub-types: CF-netCDF-File and CF-netCDF-64bit-File . They represent a netCDF ver. 3.0 binary file, complying with the CF ver. 1.1 conventions. These binary encodings are based on the “OGC NetCDF Binary Encoding Extension Standard: NetCDF Classic and 64-bit Offset Format” [9]. MIME type string used to refer to CF-netCDF binary encoding is: application/CF-netCDF Note: the only MIME type in use presently is “application/x-netcdf” and it is not officially registered. Thus, the MIME types discussed below are new and application for registration will be made to IANA. Figure: : Supported CF-netCDF Coverage encodings 7.5 XMLDataset class XMLDataset class has three concrete sub-types: NcML-Dataset , GML-3.2.1-Coverage , and NcML-G-Dataset . 7.5.1 NcML-Dataset NcML-Dataset represents a ncML ver. 1.0 document [10]. A ncML document provides the XML encoding of one or more CF-netCDF files. For performances sake, a ncML document generally encodes only the CF-netCDF coverage metadata leaving the data values in the binary format and providing pointers (i.e. references) to those. A ncML document may point to data values: (a) directly –i.e. referencing a CF-netCDF binary file; (b) including an Web address (i.e. HTTP URL)–which in turn reference a CF-netCDF file. MIME type string used to refer to ncML-G dataset encoding is: application/ncML+xml This xml media type is still unregistered. 7.5.2 GML-3.2.1-Coverage GML-3.2.1-Coverage represents the GML-based coverage encoding as specified by [OGC 09-146r1]. Such a document is generated applying the requirements contained in clause 6 and summarized in Table 1, Table 2, and Table 3. MIME type string used to refer to GML coverage encoding is [OGC 09-144r1]: application/gml+xml 7.5.3 NCML-G-Dataset NcML-G-Dataset represents a ncML-G ver. 1.0 document [10]. A ncML-G document extends a ncML-Dataset by including a GML Coverage element generated from the ncML dataset itself. In fact, this language was conceived to explicitly encode the two data models mapping. This may be very useful to fully support both GIS and netCDF applications. MIME type string used to refer to ncML-G dataset encoding is: application/ncML+xml This xml media type is still unregistered. 7.6 Web address class This class realizes a well-adopted online reference to a CF-netCDF file. In fact, Web address is a relatively simple approach (i.e. an HTTP URL) that allows applications to access remote (optionally, time-aggregated collections of) netCDF-CF files (virtual datasets –often terabyte sized) through netCDF API –as if they were local netCDF files. A Web address may also be contained by any concrete XMLDataset object to reference a CF-netCDF binary file. Web address may be encoded using one of the following options: i) a specific MIME type for a well-known address syntax; ii) an HTML document containing a HTTP URL; iii) a simple text –semantically, this is a very dull solution, and is deprecated. NOTE: Result coverages, regardless of what the encoding chosen is, have a contents which is consistent with the GMLCOV:Coverage specification –see clause 6 and Table 1, Table 2, and Table 3. Requirement 27: coverages-format /req/CF-netCDF-1.6-Data-format/coverages-format For a WxS service implementing this extension, the contents of the response to a successful GetCoverage request shall be encoded in one of the following coverage encoding formats: CF-netCDF-File, CF-netCDF-64bit-File, ncML-Dataset, GML-3.2.1-Coverage, ncML-G-Dataset, Web-address. Requirement 28: binaryFile-MIME-type /req/CF-netCDF-1.6-Data-format/binaryFile-MIME-type WxS server implementing this specification shall use the following MIME type string to refer to CF-netCDF binary encoding: “ application/CF-netCDF ”. Requirement 29: ncML-Dataset-MIME-type /req/CF-netCDF-1.6-Data-format/ncML-Dataset-MIME-type WxS server implementing this specification shall use the following MIME type string to refer to ncML-Dataset encoding: “ application/ncML+xml ”. Requirement 30: Web-address-reference /req/CF-netCDF-1.6-Data-format/Web-address-reference WxS server implementing this specification shall use a MIME type string to refer to a well-known Web address syntax ” Requirement 31: Web-address-encoding /req/CF-netCDF-1.6-Data-format/Web-address-encoding In a service operation successful response, a coverage returned as a generic Web address shall be encoded as an HTML document containing the HTTP URL . 7.7 WxS operation response: ncML-Dataset document structure The netCDF community makes use of ncML to encode complex netCDF data structures. In fact, it is possible to use ncML elements to define a virtual netCDF dataset which consists of one or more netCDF data files. In a service operation response returning a ncML document, the discrete coverage values are encoded and returned according to one or more of the following options: (i) XML encoded values conforming to the ncML schema: this ncML section encodes the content of a CF-netCDF binary file. (ii) CF-NetCDF binary files (i.e. BinaryFile objects) attached to an ncML document. (iii) Web address encoded in the ncML schema: actually, this ncML section references the content of a CF-netCDF binary file. In any case, the coverage metadata section is encoded in the ncML document as elements conforming to the ncML schema. For instance, Figure 9 depicts a complex ncML-Dataset (and optionally ncML-G-Dataset ) structure transferred as a successful WxS operation response. Figure: : An example of service operation response returning a complex ncML-Dataset This type of encoding allows to return very complex data packages. As to the considered example, the returned coverage (i.e. dataset) values are encoded as: (a) two ncML DataBlocks elements (encoding values defined in a couple of CF-netCDF binary files); (b) a Web address pointing to the values defined in a third CF-netCDF file; (c) binary attachments –i.e. the data values defined in a fourth and fifth CF-netCDF binary file enclosed as ncML binary attachments. For ncML-Dataset , coverage metadata are encoded as ncML elements. Besides, the ncML-G-Dataset extension adds a related grid coverage description using the GML elements (see Figure 9); thus, the metadata elements mapping is explicitly reported. 8 WxS operation response message: Multipart data encoding Multipart data encoding is a technique for transferring multiple contents inside a single HTTP (or HTTPS) Response. In the context of WxS operation response it can be adopted whenever a binary content must be transferred. Different strategies should be adopted for the different possible protocol bindings and encoding formats. Table 5 shows the two possibilities: Table 5. Multipart possible strategies Case Request Target Possible Responses Specification #1 SOAP ncML-Dataset SOAP with ncML Attachment SOAP Messages with Attachments 1.2 / MTOM-XOP #2 HTTP (GET or POST) ncML-Dataset MIME Multipart with ncML parts MIME multipart/related The WxS operation response can be encoded in a Multipart message. The encoding strategy is different depending on the use of SOAP or HTTP binding. For multipart encoding of ncML-Dataset in SOAP responses, the MTOM-XOP specification is adopted according to the OGC “Web Services Common Standard” (OGC 06-121r9). For multipart encoding of ncML-Dataset in HTTP responses the MIME Multipart/related standard is adopted. Requirement 32: HTTP-multipart-encoding /req/CF-netCDF-1.6-Data-format/HTTP-multipart-encoding In a service operation successful response, a coverage returned in a HTTP (or HTTPS) multipart message shall be encoded as MIME Multipart/Related (RFC 2045, RFC 2046) 8.1 Case #1and #2: SOAP or HTTP Response returning ncML data In case of ncML data the response can refer to a local or remote document. Local resources are always attached to the message, while remote resources can be attached as a copy to avoid multiple access. The HTTP or SOAP response must be encoded along with its attachments in a MIME Multipart/Related message using the rules described in Table 5. At least one multipart section will contain XML data instead of binary data. Requirement 33: SOAP-ncMLdata-multipart-encoding /req/CF-netCDF-1.6-Data-format/SOAP-ncMLdata-multipart-encoding In a service operation successful response, a coverage returned as ncML data in a SOAP multipart message shall be encoded with the SOAP Envelope section in the root part of the multipart message. Requirement 34: HTTP-ncMLdata-multipart-encoding /req/CF-netCDF-1.6-Data-format/HTTP-ncMLdata-multipart-encoding In a service operation successful response, a coverage returned as ncML data in a HTTP (or HTTPS) multipart message shall be encoded with the ncML metadata section in the root part of the multipart message. An ncML dataset include either coverage data values or a pointer to them –i.e. a pointer to one or more netCDF binary files. Therefore, returned ncML documents may directly encode coverage data values or point to one or more netCDF binary files. Example B.3.3 shows a response returning an ncML document which points to a netCDF binary file, which is included in the MIME Multipart/Related message. Both ncML and netCDF binary are remote resources referred by the SOAP document. Examples B.3.1 and B.3.2 describe responses returning ncML documents which encode coverage data values. Example B.3.3: SOAP Response returning an ncML document referring a netCDF binary file included in the message. MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_0000_93251752.3C5526C0" ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/xml; charset="UTF-8" <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"> <soap:Header/> <soap:Body> <Coverages xmlns="http://www.opengis.net/wcs/1.1/ows" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schemaLocation="http://www.opengis.net/wcs/1.1/ows ../owsCoverages.xsd http://www.opengis.net/ows ../../../ows/1.0.0/ows19115subset.xsd"> <Coverage> <ows:Title>Example</ows:Title> <ows:Abstract>Example of coverage</ows:Abstract> <Identifier>Example</Identifier> <Reference href="cid:[email protected]" /> <Reference href="http://example.net/data/CoverageDataValues.nc" /> <Reference href="http://example.net/data/Dataset.ncml" /> </Coverage> </Coverages> </soap:Body> </soap:Envelope> ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/xml Content-ID: <[email protected]> ...(metadata content)... ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/CF-netCDF Content-Transfer-Encoding: base64 Content-ID: <[email protected]> Content-Location: http://example.net/data/CoverageDataValues.nc…… ...(netCDF binary data content, pointed by the ncML dataset)... ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/ncML+xml Content-Transfer-Encoding: base64 Content-ID: <[email protected]> Content-Location: http://example.net/data/Dataset.ncml ….. ...( ncML dataset content)... ------=_NextPart_000_0000_93251752.3C5526C0-- NcML documents may contain coverage data values encoded as binary sections in base64 encoding. They can be left enclosed in the ncML document or, for efficiency purposes, they can be extracted and encoded in a format other than base64. Such improvement can be obtained serializing the ncML values element using nested multipart messages according to the MTOM/XOP specifications. The following two encoding examples report multipart sections for ncML with binary data included and extracted using XOP, respectively. Requirement 35: ncMLdata-binary-multipart-encoding /req/CF-netCDF-1.6-Data-format/ncMLdata-binary-multipart-encoding In a service operation successful response, a coverage returned as ncML data in a multipart message shall encode binary values either as XML MIME inline content or as XOP section. 8.1.1 Binary data included Example 8.1.1: Response excerpt showing a ncML dataset containing coverage data values encoded as a binary section in base64 encoding. multipart section containing a ncML dataset with binary data included (section outlined by a pale blue background) ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/CF-netCDF Content-ID: <[email protected]> Content-Location: http://example.net/data/data2.ncml <?xml version="1.0" encoding="UTF-8"?> <netcdf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"> <dimension name="longitude" length="96"/> <dimension name="bounds_axis" length="2"/> <dimension name="latitude" length="73"/> <dimension name="air_pressure" length="15"/> <dimension name="time" length="140"/> <attribute name="Conventions" type="string" value="CF-1.1"/> <attribute name="source" type="string" value="Data from model run ABC123"/> <variable name="longitude" shape="longitude" type="double"> <attribute name="standard_name" type="string" value="longitude"/> <attribute name="units" type="string" value="degrees_east"/> <attribute name="bounds" type="string" value="bound_longitude"/> <attribute name="axis" type="string" value="X"/> <values increment="3.75" npts="96" start="0.0"/> </variable> <variable name="bound_longitude" shape="longitude bounds_axis" type="double"> </variable> <variable name="latitude" shape="latitude" type="double"> <attribute name="standard_name" type="string" value="latitude"/> <attribute name="units" type="string" value="degrees_north"/> <attribute name="bounds" type="string" value="bound_latitude"/> <attribute name="axis" type="string" value="Y"/> <values increment="-2.5" npts="73" start="90.0"/> </variable> <variable name="bound_latitude" shape="latitude bounds_axis" type="double"> </variable> <variable name="air_pressure" shape="air_pressure" type="float"> <attribute name="standard_name" type="string" value="air_pressure"/> <attribute name="units" type="string" value="hPa"/> <attribute name="axis" type="string" value="Z"/> <attribute name="positive" type="string" value="down"/> <values increment="70.71429" npts="15" start="10.0"/> </variable> <variable name="time" shape="time" type="double"> <attribute name="calendar" type="string" value="360_day"/> <attribute name="standard_name" type="string" value="time"/> <attribute name="units" type="string" value="days since 2289-1-1"/> <attribute name="bounds" type="string" value="bound_time"/> <attribute name="axis" type="string" value="T"/> <values increment="360.0" npts="140" start="510.0"/> </variable> <variable name="bound_time" shape="time bounds_axis" type="double"> </variable> <variable name="air_temperature" shape="time air_pressure latitude longitude" type="float"> <attribute name="standard_name" type="string" value="air_temperature"/> <attribute name="units" type="string" value="Kir_temperature"/> <attribute name="long_name" type="string" value="temperature on pressure level"/> <attribute name="cell_methods" type="string" value="longitude: latitude: mean time: mean (interval: 4 h)"/> <attribute name="_FillValue" type="float" value="-1.073742e+09"/> <values xm:xmlmime="binary/octet-stream">Li4uKGJhc2U2NCBlbmNvZGVkIGRhdGEpLi4u...(base64 encoded data)...BlbmNvZGVkIGRhdGEpLi4u==</values> </variable> </netcdf> ------=_NextPart_000_0000_93251752.3C5526C0-- 8.1.2 Binary extracted using XOP Example 8.1.2: HTTP Multipart/Related response showing a ncML dataset containing coverage data values extracted and encoded in a format other than base64 by serializing the <values> element using nested multipart messages according to the MTOM/XOP specifications. multipart section containing a ncML dataset with binary data extracted using XOP (section outlined by a pale blue background) ------=_NextPart_000_0000_93251752.3C5526C0 MIME-Version: 1.0 Content-Type: Multipart/Related;boundary=MIME_boundary; type="application/xop+xml"; start="<[email protected] >"; startinfo="application/ncML+xml”; --MIME_boundary Content-Type: application/xop+xml; charset=UTF-8; type="application/ncML+xml; action=\"ProcessData\"" Content-ID: <[email protected]> Content-Location: http://example.net/data/data2.ncml <?xml version="1.0" encoding="UTF-8"?> <netcdf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"> <dimension name="longitude" length="96"/> <dimension name="bounds_axis" length="2"/> <dimension name="latitude" length="73"/> <dimension name="air_pressure" length="15"/> <dimension name="time" length="140"/> <attribute name="Conventions" type="string" value="CF-1.1"/> <attribute name="source" type="string" value="Data from model run ABC123"/> <variable name="longitude" shape="longitude" type="double"> <attribute name="standard_name" type="string" value="longitude"/> <attribute name="units" type="string" value="degrees_east"/> <attribute name="bounds" type="string" value="bound_longitude"/> <attribute name="axis" type="string" value="X"/> <values increment="3.75" npts="96" start="0.0"/> </variable> <variable name="bound_longitude" shape="longitude bounds_axis" type="double"> </variable> <variable name="latitude" shape="latitude" type="double"> <attribute name="standard_name" type="string" value="latitude"/> <attribute name="units" type="string" value="degrees_north"/> <attribute name="bounds" type="string" value="bound_latitude"/> <attribute name="axis" type="string" value="Y"/> <values increment="-2.5" npts="73" start="90.0"/> </variable> <variable name="bound_latitude" shape="latitude bounds_axis" type="double"> </variable> <variable name="air_pressure" shape="air_pressure" type="float"> <attribute name="standard_name" type="string" value="air_pressure"/> <attribute name="units" type="string" value="hPa"/> <attribute name="axis" type="string" value="Z"/> <attribute name="positive" type="string" value="down"/> <values increment="70.71429" npts="15" start="10.0"/> </variable> <variable name="time" shape="time" type="double"> <attribute name="calendar" type="string" value="360_day"/> <attribute name="standard_name" type="string" value="time"/> <attribute name="units" type="string" value="days since 2289-1-1"/> <attribute name="bounds" type="string" value="bound_time"/> <attribute name="axis" type="string" value="T"/> <values increment="360.0" npts="140" start="510.0"/> </variable> <variable name="bound_time" shape="time bounds_axis" type="double"> </variable> <variable name="air_temperature" shape="time air_pressure latitude longitude" type="float"> <attribute name="standard_name" type="string" value="air_temperature"/> <attribute name="units" type="string" value="Kir_temperature"/> <attribute name="long_name" type="string" value="temperature on pressure level"/> <attribute name="cell_methods" type="string" value="longitude: latitude: mean time: mean (interval: 4 h)"/> <attribute name="_FillValue" type="float" value="-1.073742e+09"/> <values xm:xmlmime="binary/octet-stream"><xop:Include xmlns:xop='http://www.w3.org/2004/08/xop/include' href='cid:[email protected]'/> </values> </variable> </netcdf> --MIME_boundary Content-Type: application/octet-stream Content-Transfer-Encoding: binary Content-ID: <[email protected]> …. ... (binary encoded data) ... --MIME_boundary-- ------=_NextPart_000_0000_93251752.3C5526C0-- 8.2 Content-ID generation The RFC 2045 and RFC 2046 describe the use of the Content-ID header to identify the different sections of a multipart message. It allows cross-reference of sections, but since it is not required for all the usages, it is specified as optional. In some cases the Content-Location header can be used for the same objective. For netCDF datasets the cross-reference between sections (e.g. between metadata and binary section) is required, therefore the presence of the Content-ID is considered mandatory. Requirement 36: netCDF-multipart-encoding-id /req/CF-netCDF-1.6-Data-format/netCDF-multipart-encoding-id In a service operation successful response, a coverage returned as multipart message shall identify each multipart section with a valid “Content-ID” header. According to [RFC 2045] “Content-ID values must be generated to be world-unique”. In WxS operation responses it is suggested that Content-ID has the following format: Content-ID : = Local “@” Domain where Local is a locally unique identifier and Domain is an Internet domain administered by the coverages provider. The domain names assignment process assures the unicity. The locally unique identifier is opaque, meaning that no semantics is associated to the local name. For example it could be generated with a hashing function from coverages metadata. 8.3 OWS Common Manifest According to the OGC “Web Services Common Standard” (OGC 06-121r9), if the coverage dataset is provided with a Manifest the message can be encoded as Multipart/Related. In such case the manifest is in the root part, while the netCDF coverage is encoded in other sections. Exploiting the recursive structure of multipart messages, the netCDF sections can be structured as explained above in SOAP or HTTP multipart sub-messages. Annex : Conformance Class Abstract Test Suite (Normative) A CF-netCDF 3.0 encoding using GML 3.2.1 Coverage application schema must satisfy the following system characteristics to be conformant with this specification. A.1 Conformance Test Classes: CF-netCDF-1.6 This document establishes three conformance classes CF-netCDF ver 1.6 GML encoding instance , with URIs: 1. http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding 2. http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format 3. http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Multipart-encoding A.2 CF-netCDF-1.6-GML-encoding conformance class This is the GML encoding conformance class for this standard. There is a dependency on: CF-netCDF Data Model extension specification (OGC 11-165r2), Geography Markup Language (GML) Encoding Standard , version 3.2.1 (OGC 07-036), and OGC ® GML Application Schema for Coverages (OGC 09-146r1) The following clauses relate to the conformance class identified with the URI: http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding Conformance Class http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding Requirements http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding Dependency http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-ISOMapping Geography Markup Language (GML) Encoding Standard, version 3.2.1 (OGC 07-036) OGC® GML Application Schema for Coverages (OGC 09-146r1) Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/CF-dataset Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/CF-dataset Test purpose CF-netCDF datasets, its subtypes and its realizations CF-netCDF RaggedArray and CF-netCDF MultidimensionalArray shall realize one of the following GMLCOV:Coverage subtypes: GMLCOV:GridCoverage, GMLCOV:RectifiedGridCoverage, GMLCOV:ReferenceableGridCoverage, GMLCOV:MultiPointCoverage. Test method verify that the CF-netCDF datasets, its subtypes and its realizations (i.e. CF-netCDF RaggedArray and CF-netCDF MultidimensionalArray) realize one of the following GMLCOV:Coverage subtypes: GMLCOV:GridCoverage, GMLCOV:RectifiedGridCoverage, GMLCOV:ReferenceableGridCoverage, GMLCOV:MultiPointCoverage. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.domainSet#1 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.domainSet#1 Test purpose The set of spatial/temporal CF_CoordinateVariable (comprised of a common coordinate system) that characterize a CF-netCDF dataset, shall realize a GML:Coverage.domainSet property, implemented as: GML:MultiPoint, GML:Grid object or its subtypes: GML:RectifiedGrid, GML:ReferenceableGrid. Test method Verify that the set of spatial/temporal CF_CoordinateVariable (comprised of a common coordinate system) that characterize a CF-netCDF dataset, realize a GML:Coverage.domainSet property, implemented as: GML:MultiPoint, GML:Grid object or its subtypes: GML:RectifiedGrid, GML:ReferenceableGrid Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.domainSet#2 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.domainSet#2 Test purpose If the spatial/temporal domain is defined by auxiliary variables, the set of spatial/temporal CF_AuxiliaryCoordinateVariable that characterizes a CF-netCDF Variable, shall realize a GML:Coverage.domainSet property, implemented as: GML:MultiPoint, GML:Grid object or its subtypes: GML:RectifiedGrid, GML:ReferenceableGrid. Test method If the spatial/temporal domain is defined by auxiliary variables, verify that the set of spatial/temporal CF_AuxiliaryCoordinateVariable that characterizes a CF-netCDF Variable, realizes a GML:Coverage.domainSet property, implemented as: GML:MultiPoint, GML:Grid object or its subtypes: GML:RectifiedGrid, GML:ReferenceableGrid. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.coverageFunction#1 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.coverageFunction#1 Test purpose If the mapping from the domain to the range of the coverage is not characterized by the default values for GML:Coverage (see [7]), the set of spatial/temporal CF_CoordinateVariable (comprised of a common coordinate system) that characterizes a CF-netCDF dataset shall realize a GML:Coverage.coverageFunction property, implemented as either a GML:CoverageFunction.GridFunction or a GML:CoverageFunction.CoverageMappingRule object. Test method If the mapping from the domain to the range of the coverage is not characterized by the default values for GML:Coverage (see [7]), verify that the set of spatial/temporal CF_CoordinateVariable (comprised of a common coordinate system) that characterizes a CF-netCDF dataset realizes a GML:Coverage.coverageFunction property, implemented as either a GML:CoverageFunction.GridFunction or a GML:CoverageFunction.CoverageMappingRule object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.coverageFunction#2 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.coverageFunction#2 Test purpose If the spatial/temporal domain is defined by auxiliary variables, the set of spatial/temporal CF_AuxiliaryCoordinateVariable that characterizes one or more CF-netCDF Variables shall realize a GML:Coverage.coverageFunction property, implemented as either a GML:CoverageFunction.GridFunction or a GML:CoverageFunction.CoverageMappingRule object. Test method If the spatial/temporal domain is defined by auxiliary variables, verify that the set of spatial/temporal CF_AuxiliaryCoordinateVariable that characterizes one or more CF-netCDF Variables realizes a GML:Coverage.coverageFunction property, implemented as either a GML:CoverageFunction.GridFunction or a GML:CoverageFunction.CoverageMappingRule object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.rangeSet Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.rangeSet Test purpose The set of CF-netCDF CF_Variable that share a common spatial/temporal coordinate system, shall realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test method Verify that the set of CF-netCDF CF_Variable that shares a common spatial/temporal coordinate system, realizes a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.rangeType Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.rangeType Test purpose The set of CF-netCDF CF_Variable that share a common spatial/temporal coordinate system, shall realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test method Verify that the set of CF-netCDF CF_Variable that shares a common spatial/temporal coordinate system, realizes a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.parametric-rangeSet Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.parametric-rangeSet Test purpose The set of CF_AuxiliaryCoordinateVariable, which are not space or time dimension, shall contribute to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test method Verify that the set of CF_AuxiliaryCoordinateVariable, which are not space or time dimension, contribute to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.parametric-rangeType Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.parametric-rangeType Test purpose The set of CF_AuxiliaryCoordinateVariable, which are not space or time dimension, shall contribute to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test method Verify that the set of CF_AuxiliaryCoordinateVariable, which are not space or time dimension, contribute to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy Test purpose The spatial/temporal CoordinateSystem, which is comprised of either spatial and temporal CF_CoordinateVariable objects or spatial and temporal CF_AuxiliaryCoordinateVariable objects, shall realize a GML:Coverage.boundedBy property, implemented as a GML:Envelope object or its subtype GML:EnvelopeWithTimePeriod. Additionally, the attribute GML:Envelope.srsName shall have a value. Test method Verify that the spatial/temporal CoordinateSystem, which is comprised of either spatial and temporal CF_CoordinateVariable objects or spatial and temporal CF_AuxiliaryCoordinateVariable objects, realizes a GML:Coverage.boundedBy property, implemented as a GML:Envelope object or its subtype GML:EnvelopeWithTimePeriod. Additionally, verify that the attribute GML:Envelope.srsName has a value. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.axisLabels#1 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.axisLabels#1 Test purpose The set of spatial/temporal CF_CoordinateVariable comprised of a CoordinateSystem object, shall realize a GML:Envelope.axisLabels object or its subtype GML:EnvelopeWithTimePeriod.axisLabels. Test method Verify that the set of spatial/temporal CF_CoordinateVariable comprised of a CoordinateSystem object, realizes a GML:Envelope.axisLabels object or its subtype GML:EnvelopeWithTimePeriod.axisLabels. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.axisLabels#2 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.axisLabels#2 Test purpose The set of spatial/temporal CF_Auxiliary CoordinateVariable, comprised of a CoordinateSystem object related to CF_Variables, shall realize a GML:Envelope.axisLabels object or its subtype GML:EnvelopeWithTimePeriod.axisLabels. Test method Verify that the set of spatial/temporal CF_Auxiliary CoordinateVariable, comprised of a CoordinateSystem object related to CF_Variables, realizes a GML:Envelope.axisLabels object or its subtype GML:EnvelopeWithTimePeriod.axisLabels. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.CRS Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/Dataset.boundedBy.CRS Test purpose The CF-netCDF GridMappingVariable shall determine the subype of GML_AbstractCRS pointed by the GML:Envelope.srsName attribute. Test method Verify that the CF-netCDF GridMappingVariable determines the subype of GML_AbstractCRS pointed by the GML:Envelope.srsName attribute. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/InstanceVariable Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/InstanceVariable Test purpose Each CF_InstanceVariable object shall be encoded as a spatial/temporal CF_AuxiliaryCooridnateVariable which has as only dimension the "instance" dimension. Test method Verify that each CF_InstanceVariable object is encoded as a spatial/temporal CF_AuxiliaryCooridnateVariable which has as only dimension the "instance" dimension. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#1 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#1 Test purpose Each CF_MultidimensionalArray.InstanceDimension object shall contribute to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test method Verify that each CF_MultidimensionalArray.InstanceDimension object contributes to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#2 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#2 Test purpose Each CF_MultidimensionalArray.InstanceDimension object shall contribute to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test method Verify that each CF_MultidimensionalArray.InstanceDimension object contributes to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/ RangeInstanceDimension#3 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/ RangeInstanceDimension#3 Test purpose Each CF_RaggedArray.SampleDimension object along with associated CF_IndexVariable or CF_CountVariable shall contribute to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test method Verify that each CF_RaggedArray.SampleDimension object along with associated CF_IndexVariable or CF_CountVariable contributes to realize a GML:Coverage.rangeSet property, implemented as a GML:RangeSet object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#4 Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/RangeInstanceDimension#4 Test purpose Each CF_RaggedArray.SampleDimension object along with associated CF_IndexVariable or CF_CountVariable shall contribute to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test method Verify that each CF_RaggedArray.SampleDimension object along with associated CF_IndexVariable or CF_CountVariable contributes to realize a GML:Coverage.rangeType property, implemented as a SWE:DataRecord object. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/PointFeatureCollection.axisLabels Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/PointFeatureCollection.axisLabels Test purpose Each CF_Point FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y t" | "lat lon t" | "lon lat t". Test method Verify that each CF_Point FeatureCollection realizes a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y t" | "lat lon t" | "lon lat t". Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/TimeSerieFeatureCollection.axisLabels Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/TimeSerieFeatureCollection.axisLabels Test purpose Each CF_TimeSerie FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y t" | "lat lon t" | "lon lat t". Test method Verify that each CF_TimeSerie FeatureCollection realizes a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y t" | "lat lon t" | "lon lat t". Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/TrajectoryFeatureCollection.axisLabels Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/TrajectoryFeatureCollection.axisLabels Test purpose Each CF_Trajectory FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y t" | "lat lon t" | "lon lat t". Test method Verify that each CF_Trajectory FeatureCollection realizes a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y t" | "lat lon t" | "lon lat t". Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/ProfileFeatureCollection.axisLabels Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/ProfileFeatureCollection.axisLabels Test purpose Each CF_Profile FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y z t" | "lat lon z t" | "lon lat z t". Test method Verify that each CF_Profile FeatureCollection realizes a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y z t" | "lat lon z t" | "lon lat z t". Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/TimeSeriesProfileFeatureCollection.axisLabels Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/TimeSeriesProfileFeatureCollection.axisLabels Test purpose Each CF_TimeSeriesProfile FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y z t" | "lat lon z t" | "lon lat z t". Test method Verify that each CF_TimeSeriesProfile FeatureCollection realizes a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y z t" | "lat lon z t" | "lon lat z t". Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding/TrajectoryProfileFeatureCollection.axisLabels Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-GML-encoding/TrajectoryProfileFeatureCollection.axisLabels Test purpose Each CF_TrajectoryProfile FeatureCollection shall realize a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y z t" | "lat lon z t" | "lon lat z t". Test method Verify that each CF_TrajectoryProfile FeatureCollection realizes a GML:EnvelopeWithTimePeriod.axisLabels with value equal to "x y z t" | "lat lon z t" | "lon lat z t". A.3 CF-netCDF-1.6-Data-format conformance class This is the data format conformance class for this standard. There is a dependency on the GML encoding conformance class of this standard (see A.2). The following clauses relate to the conformance class identified with the URI: http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF - 1.6-Data-format Conformance Class http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format Requirements http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format Dependency http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-GML-encoding Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/ServiceOperationResponse Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/ServiceOperationResponse Test purpose Any service operation response returning successfully a CF-netCDF dataset, shall return a concrete sub-type of the GMLCOV:Coverage class, as showed in Figure 4. Test method Verify that any service operation response returning successfully a CF-netCDF dataset, returns a concrete sub-type of the GMLCOV:Coverage class, as showed in Figure 4. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/coverageFormat-structure Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/coverageFormat-structure Test purpose The CF-netCDF data format used to return requested GMLCOV:Coverages shall adhere to Figure 8. Test method Verify that the CF-netCDF data format used to return requested GMLCOV:Coverages adheres to Figure 8. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/coverages-format Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/coverages-format Test purpose For a WxS service implementing this extension, the contents of the response to a successful GetCoverage request shall be encoded in one of the following coverage encoding formats: CF-netCDF-File, CF-netCDF-64bit-File, ncML-Dataset, GML-3.2.1-Coverage, ncML-G-Dataset, Web-address. Test method Verify that for any WxS service implementing this extension, the content of the response to a successful GetCoverage request is encoded in one of the following coverage encoding formats: CF-netCDF-File, CF-netCDF-64bit-File, ncML-Dataset, GML-3.2.1-Coverage, ncML-G-Dataset, Web-address. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/binaryFile-MIME-type Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/binaryFile-MIME-type Test purpose WxS server implementing this specification shall use the following MIME type string to refer to CF-netCDF binary encoding: “application/CF-netCDF”. Test method Verify that any WxS server implementing this specification uses the following MIME type string to refer to CF-netCDF binary encoding: “application/CF-netCDF”. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/ncML-Dataset-MIME-type Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/ncML-Dataset-MIME-type Test purpose WxS server implementing this specification shall use the following MIME type string to refer to ncML-Dataset encoding: “application/ncML+xml”. Test method Verify that any WxS server implementing this specification uses the following MIME type string to refer to ncML-Dataset encoding: “application/ncML+xml”. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/Web-address-reference Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/Web-address-reference Test purpose WxS server implementing this specification shall use a MIME type string to refer to a well-known Web address syntax”. Test method Verify that any WxS server implementing this specification uses a MIME type string to refer to a well-known Web address syntax”. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/Web-address-encoding Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/Web-address-encoding Test purpose In a service operation successful response, a coverage returned as a generic Web address shall be encoded as an HTML document containing the HTTP URL. Test method Verify that in a service operation successful response, a coverage returned as a generic Web address is encoded as an HTML document containing the HTTP URL. A.4 CF-netCDF-1.6-Multipart-encoding conformance class This is the multipart data encoding conformance class for this standard. There is a dependency on the data format conformance class of this standard (see A.3). The following clauses relate to the conformance class identified with the URI: http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Multipart-encoding Conformance Class http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Multipart-encoding Requirements http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Multipart-encoding Dependency http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/HTTP-multipart-encoding Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/HTTP-multipart-encoding Test purpose In a service operation successful response, a coverage returned in a HTTP (or HTTPS) multipart message shall be encoded as MIME Multipart/Related (RFC 2045, RFC 2046). Test method Verify that in a service operation successful response, a coverage returned in a HTTP (or HTTPS) multipart message is encoded as MIME Multipart/Related (RFC 2045, RFC 2046). Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/SOAP-ncMLdata-multipart-encoding Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/SOAP-ncMLdata-multipart-encoding Test purpose In a service operation successful response, a coverage returned as ncML data in a SOAP multipart message shall be encoded with the SOAP Envelope section in the root part of the multipart message. Test method Verify that in a service operation successful response, a coverage returned as ncML data in a SOAP multipart message is encoded with the SOAP Envelope section in the root part of the multipart message. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/HTTP-ncMLdata-multipart-encoding Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/HTTP-ncMLdata-multipart-encoding Test purpose In a service operation successful response, a coverage returned as ncML data in a HTTP multipart message shall be encoded with the ncML metadata section in the root part of the multipart message. Test method Verify that in a service operation successful response, a coverage returned as ncML data in a HTTP (or HTTPS) multipart message is encoded with the ncML metadata section in the root part of the multipart message. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/ncMLdata-binary-multipart-encoding Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/ncMLdata-binary-multipart-encoding Test purpose In a service operation successful response, a coverage returned as ncML data in a multipart message shall encode binary values either as XML MIME inline content or as XOP section. Test method Verify that in a service operation successful response, a coverage returned as ncML data in a multipart message encodes binary values either as XML MIME inline content or as XOP section. Test http://www.opengis.net/spec/netCDF_data-model/conf/CF-netCDF-1.6-Data-format/netCDF-multipart-encoding-id Requirement http://www.opengis.net/spec/netCDF_data-model/req/CF-netCDF-1.6-Data-format/netCDF-multipart-encoding-id Test purpose In a service operation successful response, a coverage returned as multipart message shall identify each multipart section with a valid “Content-ID” header. Test method Verify that in a service operation successful response, a coverage returned as multipart message identifies each multipart section with a valid “Content-ID” header. Annex : Examples (informative) The following paragraphs collect the examples used and explained throughout the document. B.1. Example: netCDF ver. 3 with CF1.1 convention dataset netcdf air_temperature { dimensions: longitude = 96 ; bounds_axis = 2 ; latitude = 73 ; air_pressure = 15 ; time = 140 ; variables: double longitude(longitude) ; longitude:standard_name = “longitude” ; longitude:units = “degrees_east” ; longitude:bounds = “bound_longitude” ; longitude:axis = “X” ; double bound_longitude(longitude, bounds_axis) ; double latitude(latitude) ; latitude:standard_name = “latitude” ; latitude:units = “degrees_north” ; latitude:bounds = “bound_latitude” ; latitude:axis = “Y” ; double bound_latitude(latitude, bounds_axis) ; float air_pressure(air_pressure) ; air_pressure:standard_name = “air_pressure” ; air_pressure:units = “hPa” ; air_pressure:axis = “Z” ; air_pressure:positive = “down” ; double time(time) ; time:calendar = “360_day” ; time:standard_name = “time” ; time:units = “days since 2289-1-1” ; time:bounds = “bound_time” ; time:axis = “T” ; double bound_time(time, bounds_axis) ; float air_temperature(time, air_pressure, latitude, longitude) ; air_temperature:standard_name = “air_temperature” ; air_temperature:units = “K” ; air_temperature:long_name = “temperature on pressure levels” ; air_temperature:cell_methods = “longitude: latitude: mean time: mean (interval: 4 h)” ; air_temperature:_FillValue = -1.073742e+09f ; // global attributes: :Conventions = “CF-1.1” ; :source = “Data from model run ABC123” ; data: longitude = 0, 3.75, 7.5, 11.25, 15, 18.75, 22.5, 26.25, 30, 33.75, 37.5, 41.25, 45, 48.75, 52.5, 56.25, 60, 63.75, 67.5, 71.25, 75, 78.75, 82.5, 86.25, 90, 93.75, 97.5, 101.25, 105, 108.75, 112.5, 116.25, 120, 123.75, 127.5, 131.25, 135, 138.75, 142.5, 146.25, 150, 153.75, 157.5, 161.25, 165, 168.75, 172.5, 176.25, 180, 183.75, 187.5, 191.25, 195, 198.75, 202.5, 206.25, 210, 213.75, 217.5, 221.25, 225, 228.75, 232.5, 236.25, 240, 243.75, 247.5, 251.25, 255, 258.75, 262.5, 266.25, 270, 273.75, 277.5, 281.25, 285, 288.75, 292.5, 296.25, 300, 303.75, 307.5, 311.25, 315, 318.75, 322.5, 326.25, 330, 333.75, 337.5, 341.25, 345, 348.75, 352.5, 356.25 ; B.2. Example for an ncML dataset <?xml version=“1.0” encoding=“UTF-8”?> <netcdf xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance " xmlns=" http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2 "> <dimension name=“longitude” length=“96”/> <dimension name=“bounds_axis” length=“2”/> <dimension name=“latitude” length=“73”/> <dimension name=“air_pressure” length=“15”/> <dimension name=“time” length=“140”/> <attribute name=“Conventions” type=“string” value=“CF-1.1”/> <attribute name=“source” type=“string” value=“Data from model run ABC123”/> <variable name=“longitude” shape=“longitude” type=“double”> <attribute name=“standard_name” type=“string” value=“longitude”/> <attribute name=“units” type=“string” value=“degrees_east”/> <attribute name=“bounds” type=“string” value=“bound_longitude”/> <attribute name=“axis” type=“string” value=“X”/> <values increment=“3.75” npts=“96” start=“0.0”/> </variable> <variable name=“bound_longitude” shape=“longitude bounds_axis” type=“double”> </variable> <variable name=“latitude” shape=“latitude” type=“double”> <attribute name=“standard_name” type=“string” value=“latitude”/> <attribute name=“units” type=“string” value=“degrees_north”/> <attribute name=“bounds” type=“string” value=“bound_latitude”/> <attribute name=“axis” type=“string” value=“Y”/> <values increment=“-2.5” npts=“73” start=“90.0”/> </variable> <variable name=“bound_latitude” shape=“latitude bounds_axis” type=“double”> </variable> <variable name=“air_pressure” shape=“air_pressure” type=“float”> <attribute name=“standard_name” type=“string” value=“air_pressure”/> <attribute name=“units” type=“string” value=“hPa”/> <attribute name=“axis” type=“string” value=“Z”/> <attribute name=“positive” type=“string” value=“down”/> <values increment=“70.71429” npts=“15” start=“10.0”/> </variable> <variable name=“time” shape=“time” type=“double”> <attribute name=“calendar” type=“string” value=“360_day”/> <attribute name=“standard_name” type=“string” value=“time”/> <attribute name=“units” type=“string” value=“days since 2289-1-1”/> <attribute name=“bounds” type=“string” value=“bound_time”/> <attribute name=“axis” type=“string” value=“T”/> <values increment=“360.0” npts=“140” start=“510.0”/> </variable> <variable name=“bound_time” shape=“time bounds_axis” type=“double”> </variable> <variable name=“air_temperature” shape=“time air_pressure latitude longitude” type=“float”> <attribute name=“standard_name” type=“string” value=“air_temperature”/> <attribute name=“units” type=“string” value=“Kir_temperature”/> <attribute name=“long_name” type=“string” value=“temperature on pressure level”/> <attribute name=“cell_methods” type=“string” value=“longitude: latitude: mean time: mean (interval: 4 h)”/> <attribute name=“_FillValue” type=“float” value=“-1.073742e+09”/> </variable> </netcdf> B.3. GetCoverage response encoding examples This section details examples of GetCoverage response encodings based on SOAP and Multipart-related technology. - B.3.1. SOAP Response returning an ncML document referring a netCDF binary file included in the message MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_0000_93251752.3C5526C0" ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/xml; charset="UTF-8" <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"> <soap:Header/> <soap:Body> <Coverages xmlns="http://www.opengis.net/wcs/1.1/ows" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schemaLocation="http://www.opengis.net/wcs/1.1/ows ../owsCoverages.xsd http://www.opengis.net/ows ../../../ows/1.0.0/ows19115subset.xsd"> <Coverage> <ows:Title>Example</ows:Title> <ows:Abstract>Example of coverage</ows:Abstract> <Identifier>Example</Identifier> <Reference href="cid:[email protected]" /> <Reference href="http://example.net/data/CoverageDataValues.nc" /> <Reference href="http://example.net/data/Dataset.ncml" /> </Coverage> </Coverages> </soap:Body> </soap:Envelope> ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/xml Content-ID: <[email protected]> ...(metadata content)... ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/CF-netCDF Content-Transfer-Encoding: base64 Content-ID: <[email protected]> Content-Location: http://example.net/data/CoverageDataValues.nc…… ...(netCDF binary data content, pointed by the ncML dataset)... ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/ ncML+xml Content-Transfer-Encoding: base64 Content-ID: <[email protected]> Content-Location: http://example.net/data/Dataset.ncml ….. ...( ncML dataset content)... ------=_NextPart_000_0000_93251752.3C5526C0-- B.3.2. C.3.4 Multipart section containing ncML with binary data included ------=_NextPart_000_0000_93251752.3C5526C0 Content-Type: application/CF-netCDF Content-Transfer-Encoding: base64 Content-ID: <[email protected]> Content-Location: http://example.net/data/data2.ncml <?xml version="1.0" encoding="UTF-8"?> <netcdf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"> <dimension name="longitude" length="96"/> <dimension name="bounds_axis" length="2"/> <dimension name="latitude" length="73"/> <dimension name="air_pressure" length="15"/> <dimension name="time" length="140"/> <attribute name="Conventions" type="string" value="CF-1.1"/> <attribute name="source" type="string" value="Data from model run ABC123"/> <variable name="longitude" shape="longitude" type="double"> <attribute name="standard_name" type="string" value="longitude"/> <attribute name="units" type="string" value="degrees_east"/> <attribute name="bounds" type="string" value="bound_longitude"/> <attribute name="axis" type="string" value="X"/> <values increment="3.75" npts="96" start="0.0"/> </variable> <variable name="bound_longitude" shape="longitude bounds_axis" type="double"> </variable> <variable name="latitude" shape="latitude" type="double"> <attribute name="standard_name" type="string" value="latitude"/> <attribute name="units" type="string" value="degrees_north"/> <attribute name="bounds" type="string" value="bound_latitude"/> <attribute name="axis" type="string" value="Y"/> <values increment="-2.5" npts="73" start="90.0"/> </variable> <variable name="bound_latitude" shape="latitude bounds_axis" type="double"> </variable> <variable name="air_pressure" shape="air_pressure" type="float"> <attribute name="standard_name" type="string" value="air_pressure"/> <attribute name="units" type="string" value="hPa"/> <attribute name="axis" type="string" value="Z"/> <attribute name="positive" type="string" value="down"/> <values increment="70.71429" npts="15" start="10.0"/> </variable> <variable name="time" shape="time" type="double"> <attribute name="calendar" type="string" value="360_day"/> <attribute name="standard_name" type="string" value="time"/> <attribute name="units" type="string" value="days since 2289-1-1"/> <attribute name="bounds" type="string" value="bound_time"/> <attribute name="axis" type="string" value="T"/> <values increment="360.0" npts="140" start="510.0"/> </variable> <variable name="bound_time" shape="time bounds_axis" type="double"> </variable> <variable name="air_temperature" shape="time air_pressure latitude longitude" type="float"> <attribute name="standard_name" type="string" value="air_temperature"/> <attribute name="units" type="string" value="Kir_temperature"/> <attribute name="long_name" type="string" value="temperature on pressure level"/> <attribute name="cell_methods" type="string" value="longitude: latitude: mean time: mean (interval: 4 h)"/> <attribute name="_FillValue" type="float" value="-1.073742e+09"/> <values xm:xmlmime="binary/octet-stream">Li4uKGJhc2U2NCBlbmNvZGVkIGRhdGEpLi4u...(base64 encoded data)...BlbmNvZGVkIGRhdGEpLi4u==</values> </variable> </netcdf> ------=_NextPart_000_0000_93251752.3C5526C0-- B.3.3. C.3.5 Multipart section containing ncML with binary data extracted using XOP ------=_NextPart_000_0000_93251752.3C5526C0 MIME-Version: 1.0 Content-Type: Multipart/Related;boundary=MIME_boundary; type="application/xop+xml"; start="<[email protected] >"; startinfo="application/ncML+xml”; --MIME_boundary Content-Type: application/xop+xml; charset=UTF-8; type="application/ncML+xml; action=\"ProcessData\"" Content-ID: <[email protected]> Content-Location: http://example.net/data/data2.ncml <?xml version="1.0" encoding="UTF-8"?> <netcdf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"> <dimension name="longitude" length="96"/> <dimension name="bounds_axis" length="2"/> <dimension name="latitude" length="73"/> <dimension name="air_pressure" length="15"/> <dimension name="time" length="140"/> <attribute name="Conventions" type="string" value="CF-1.1"/> <attribute name="source" type="string" value="Data from model run ABC123"/> <variable name="longitude" shape="longitude" type="double"> <attribute name="standard_name" type="string" value="longitude"/> <attribute name="units" type="string" value="degrees_east"/> <attribute name="bounds" type="string" value="bound_longitude"/> <attribute name="axis" type="string" value="X"/> <values increment="3.75" npts="96" start="0.0"/> </variable> <variable name="bound_longitude" shape="longitude bounds_axis" type="double"> </variable> <variable name="latitude" shape="latitude" type="double"> <attribute name="standard_name" type="string" value="latitude"/> <attribute name="units" type="string" value="degrees_north"/> <attribute name="bounds" type="string" value="bound_latitude"/> <attribute name="axis" type="string" value="Y"/> <values increment="-2.5" npts="73" start="90.0"/> </variable> <variable name="bound_latitude" shape="latitude bounds_axis" type="double"> </variable> <variable name="air_pressure" shape="air_pressure" type="float"> <attribute name="standard_name" type="string" value="air_pressure"/> <attribute name="units" type="string" value="hPa"/> <attribute name="axis" type="string" value="Z"/> <attribute name="positive" type="string" value="down"/> <values increment="70.71429" npts="15" start="10.0"/> </variable> <variable name="time" shape="time" type="double"> <attribute name="calendar" type="string" value="360_day"/> <attribute name="standard_name" type="string" value="time"/> <attribute name="units" type="string" value="days since 2289-1-1"/> <attribute name="bounds" type="string" value="bound_time"/> <attribute name="axis" type="string" value="T"/> <values increment="360.0" npts="140" start="510.0"/> </variable> <variable name="bound_time" shape="time bounds_axis" type="double"> </variable> <variable name="air_temperature" shape="time air_pressure latitude longitude" type="float"> <attribute name="standard_name" type="string" value="air_temperature"/> <attribute name="units" type="string" value="Kir_temperature"/> <attribute name="long_name" type="string" value="temperature on pressure level"/> <attribute name="cell_methods" type="string" value="longitude: latitude: mean time: mean (interval: 4 h)"/> <attribute name="_FillValue" type="float" value="-1.073742e+09"/> <values xm:xmlmime="binary/octet-stream"><xop:Include xmlns:xop='http://www.w3.org/2004/08/xop/include' href='cid:[email protected]'/> </values> </variable> </netcdf> --MIME_boundary Content-Type: application/octet-stream Content-Transfer-Encoding: binary Content-ID: <[email protected]> ... (binary encoded data) ... --MIME_boundary-- ------=_NextPart_000_0000_93251752.3C5526C0-- Annex : Revision history Date Release Author Paragraph modified Description 2010-08-09 0.1.0 Stefano Nativi All Created 2010-09-12 0.1.1 Ben Domenico Comments Updated 2011-02-19 1.0.0 Stefano Nativi All –added Multi-pointCoverage data Updated 2011-08-27 1.0.0 Stefano Nativi CF ver. 1.6 Updated 2013-02-06 1.1.0 Stefano Nativi Recommendations from WCS 2.0 SWG Document split up into three parts 2013-21-27 0.3 Stefano Nativi New specification document extending CF-netCDF1.6 data model Created 2014-01-03 0.3.1 Paolo Mazzetti Requirements on Multipart Updated 2014-10-19 1.0 Stefano Nativi Removal of OPeNDAP and introduction of Web address. From discussion paper to International Standard Created the IS draft 2015-04-13 2.0 Stefano Nativi Addressed recommendations from OAB Creation of the Abstract test suite Updated 2015-14-15 2.0 Scott Simmons Updated format to latest Standards template and minor corrections throughout document. Updated Annex : Bibliography [1] OGC 11-165r2, CF-netCDF3 Data Model Extension standard, version 3.1, March 2013. [2] ISO/TC 211, IS 19123:2005 Geographic information — Schema for coverage geometry and functions , ISO/IS 19123:2005 [3] OGC 07-036, OGC® Geography Markup Language (GML) Encoding Standard , version 3.2.1. [4] OGC 08-094, OGC® SWE Common Data Model Encoding Standard , version 2.0.0. [5] OGC 10-092, NetCDF Binary Encoding Extension Standard: NetCDF Classic and 64-bit Offset Format , version 1.0. [6] S. Nativi, J. Caron, E. Davis and B. Domenico, “Design and implementation of netCDF Markup Language (NcML) and Its GML-based extension (NcML-GML)”, Computers & Geosciences Journal, Volume 31, Issue 9, November 2005, Pages 1104-1118, Elsevier Publication. http://linkinghub.elsevier.com/retrieve/pii/S0098300405001019 http://www.unidata.ucar.edu/software/netcdf/ncml/v2.2/AnnotatedSchema.html [7] S Nativi, J Caron, B Domenico, L Bigagli, 2008, Unidata’s common data model mapping to the ISO 19123 data model, Earth Science Informatics, vol.1 n. 2, pp. 59-78 [8] Domenico, B.; Caron, J.; Davis, E.; Nativi, S.; Bigagli, L., “GALEON: Standards-based Web Services for Interoperability among Earth Sciences Data Systems,” Geoscience and Remote Sensing Symposium, 2006. IGARSS 2006. IEEE International Conference on , vol., no., pp.313,316, July 31 2006-Aug. 4 2006. doi: 10.1109/IGARSS.2006.85 [9] NASA Community Standard, ESDS-RFC-004: The Data Access Protocol – DAP 2.0 available at: http://www.esdswg.org/spg/rfc/ese-rfc-004 [10] NASA ESDS–RFC-021 Technical Working Group Final Report. [11] NASA ESDS-RFC-021v0.02, CF Metadata Conventions, April 2010. [12] IETF RFC 2045, Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies [13] IETF RFC 2046, Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types [14] OGC 06-121r9, OGC Web Services Common Standard [15] IETF RFC 2387, The MIME Multipart/Related Content-type [16] W3C, SOAP Message Transmission Optimization Mechanism [17] W3C, XML-binary Optimized Packaging [1] Future extension to ISO 19111 (see ISO/CD19111-2) may permit parametric CRS, that would accommodate the pressure axis.