World Meteorological Organization

Date: 2024-03-27

Version: 2.0.0

Document location: TBD

Document status: DRAFT

Task Team on WIS Metadata (TT-WISMD)[1]

Expert Team on Metadata Standards (ET-Metadata)[2]

Standing Committee on Information Management and Technology (SC-IMT)[3]

Commission for Observation, Infrastructure and Information Systems (INFCOM)[4]

Copyright © 2024 World Meteorological Organization (WMO)

Table of Contents

i. Abstract

Discovery and search are key components of WIS2. Quality discovery metadata that leverages industry standards, best practices, and architecture helps lower the barrier to and extend the reach of weather/climate/water data.

This document defines the content, structure, and encoding for the WMO Core Metadata Profile (WCMP). This standard is a profile and extension of the OGC API - Records standard [5].

WCMP documents provide descriptive information for discovery of WMO resources. WMO resources include, but are not limited to, data (NWP models, observations, forecasts and warnings, etc.), services/APIs, and processes.

WCMP documents shall be encoded in GeoJSON (RFC 7946 [6]) as defined in this specification and shall be made available as HTTP crawlable files or via API provisioning as defined by OGC API - Records.

Weather/climate/water data is by nature geospatial and temporal. The W3C Data on the Web Best Practices [7] and Spatial Data on the Web Best Practices [8] publications provide guidelines on how to best enable spatiotemporal data to lower the barrier for users, search engine optimization, and linked data. This also aligns with the FAIR data principles (Findable, Accessible, Interoperable, Reusable) [9].

ii. Keywords

The following are keywords to be used by search engines and document catalogues.

wmo, wis, wis2, weather, climate, water, metadata, discovery, search

iii. Security Considerations

Based on the WMO Unified Data Policy for the International Exchange of Earth System Data (Resolution 1 (Cg-Ext(2021) [10], exchanged data are classified as core or recommended. Core data is considered fully open and unrestricted with no security considerations. Recommended data may have access control defined.

No additional security considerations have been made for this standard.

1. Scope

This document defines the content, structure, and encoding of discovery metadata published as part of the WIS2 Global Discovery Catalogue (GDC).

The WMO Core Metadata Profile (WCMP) standard defined herein is an extension of the International Standard OGC API - Records - Part 1: Core.

WCMP discovery metadata records shall be encoded as GeoJSON as defined in OGC API - Records - Part 1: Core.

The primary purpose of WCMP is to describe datasets. While WCMP can describe any resource (datasets, APIs and data reduction services, processes, analytics, etc.), the key component for international data exchange is data. Services and APIs operating on resources may be represented as part of their own metadata or associated through WCMP links.

WCMP discovery metadata record provides descriptions at the granularity level of a dataset. Station, instrument and observation metadata are supported by the WIGOS Metadata Standard (WMO-No. 1192) [11].

This specification defines the conformance requirements for the WMO Core Metadata Profile. Annex A defines the abstract test suite. Annex B provides normative information on schemas. Annex C provides informative examples. Annex D provides informative codelists.

2. Conformance

Conformance with this standard shall be checked using the tests specified in Annex A (normative) of this document.

OGC API - Records (OARec) provides a record metadata model in support of resource discovery. This standard is an extension of OGC API - Records - Part 1: Core. Conformance to this standard requires demonstrated conformance to the applicable Conformance Classes of OGC API - Records - Part 1: Core.

Authors of discovery metadata records published within the WIS2 Global Discovery Catalogue (GDC) are required to comply with the WMO Core Metadata Profile (WCMP). WCMP discovery metadata shall therefore be compliant with OGC API - Records - Part 1: Core: Requirements Class: Record Core.

WMO shall publish guidance material to assist authors of WCMP discovery metadata for maintaining consistency across multiple metadata records and perform quality assessment and reporting.

This standard identifies one Requirements Class which defines the functional requirements.

The mandatory Requirements Class for WCMP is:

  • "WMO Core Metadata Profile Core": This Requirements Class inherits from OGC API — Records — Part 1: Core: Requirements Class: Record Core which defines the requirements for a catalogue record. The requirements specified in the Requirements Class “Record Core" are mandatory for all implementations of WMCP. The requirements are specified in Chapter 7 and in Annex A in more detail.

3. References

  • OGC: OGC 20-004, OGC API - Records - Part 1: Core 1.0 (2023) [12]

  • OGC: OGC 17-069r, OGC API - Features - Part 1: Core 1.0 (2022) [13]

  • IETF: RFC-7946 The GeoJSON Format (2016) [14]

  • IETF: RFC-8259 The JavaScript Object Notation (JSON) Data Interchange Formathe GeoJSON Format (2016) [15]

  • W3C/OGC: Spatial Data on the Web Best Practices, W3C Working Group Note (2017) [16]

  • W3C: Data on the Web Best Practices, W3C Recommendation (2017) [17]

  • W3C: Data Catalog Vocabulary, W3C Recommendation (2014) [18]

  • IANA: Link Relation Types (2020) [19]

  • IANA: Media Types (2023) [20]

  • Linux Foundation: SPDX License List (2021) [21]

  • IETF: JSON Schema (2022) [22]

  • WMO: WIS2 Topic Hierarchy (2022) [23]

  • OpenAPI Specification 3.1.0 (2022) [24]

  • Draft guidance on technical specifications of WIS2 (2023) [25]

4. Terms and definitions

This document uses the terms defined in OGC Policy Directive 49, 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 and OGC documents do not use the equivalent phrases in the ISO/IEC Directives, Part 2.

This document also uses terms defined in the OGC Standard for Modular specifications (OGC 08-131r3), also known as the 'ModSpec'. The definitions of terms such as standard, specification, requirement, and conformance test are provided in the ModSpec.

The following additional terms and definitions also apply.

4.1. Abbreviated terms

Table 1. Symbols and abbreviated terms
Abbreviation Term

API

Application Programming Interface

ARK

Archival Resource Key

DCAT

Data Catalog Vocabulary

DCPC

Data Collection and Production Centres

DOI

Digital Object Identifier

GDC

Global Discovery Catalogue

GIS

Geographic Information System

GISC

Global Information System Centre

HTML

Hypertext Markup Language

HTTP

Hypertext Transfer Protocol

HTTPS

Hypertext Transfer Protocol Secure

IANA

Internet Assigned Numbers Authority

IETF

Internet Engineering Task Force

ISO

International Organization for Standardization

JSON

JavaScript Object Notation

MIME

Multipurpose Internet Mail Extensions

MQTT

Message Queuing Telemetry Transport

NC

National Centre

NWP

Numerical Weather Prediction

OARec

OGC API - Records

OGC

Open Geospatial Consortium

REST

Representational State Transfer

ROA

Resource-oriented architecture

S3

Simple Storage Service

SEO

Search engine optimization

SOA

Service-oriented architecture

URI

Uniform Resource Identifier

URL

Uniform Resource Locator

W3C

World Wide Web Consortium

WCMP

WMO Core Metadata Profile

WIS

WMO Information System

WMO

World Meteorological Organization

XML

eXtensible Markup Language

5. Conventions

This section provides details and examples for any conventions used in the document. Examples of conventions are symbols, abbreviations, use of JSON schema, or special notes regarding how to read the document.

5.1. Identifiers

The normative provisions in this Standard are denoted by the URI:

All requirements and conformance tests that appear in this document are denoted by partial URIs which are relative to this base.

5.2. Examples

Examples provided in this specification are encoded as GeoJSON.

Complete examples can be found at https://schemas.wmo.int/wcmp/2.0/examples

5.3. Schemas

The WCMP schema can be found at https://schemas.wmo.int/wcmp/2.0/wcmp2-bundled.json

5.4. Schema representation

JSON Schema [26] objects are used throughout this standard to define the structure of metadata records. These schema objects are also typically represented using YAML [27]. YAML is a superset of JSON, and in this standard are regarded as equivalent.

Metadata record instances are always represented as JSON.

5.4.1. Properties

A JSON property represents a key-value pair, where the key is the name of the property and the value is a standard JSON data type.

"myPropertyName": "test123"

5.5. Use of HTTPS

For simplicity, this document only refers to the HTTP protocol. This is not meant to exclude the use of HTTPS and simply is a shorthand notation for "HTTP or HTTPS." In fact, most servers are expected to use HTTPS, not HTTP.

6. Introduction

6.1. Overview

The initial WIS technical specifications were developed using service-oriented architecture (SOA) principles. It featured complex ISO 19115/19139-based XML for metadata. Since then, international standards development organizations such as W3C and OGC have moved to adopt a more resource-oriented architecture (ROA), leveraging RESTful design patterns, and mass market encodings such as JSON and HTML.

Aligning with the WIS2 Principles, in order to support the WIS2 Technical Specifications for discovery and search, discovery metadata will be published to a global discovery catalogue, which will provide an OGC API - Records searchable functionality. Users will be able to search from a web browser, whereas machines will interact with an API.

6.1.1. WIS2

WIS2 puts forth the following principles (those focused on discovery metadata are in bold):

  • (1) WIS 2.0 adopts Web technology and leverages industry best practices and open standards.

  • (2) WIS 2.0 uses Uniform Resource Locators (URL) to identify resources (i.e., Web pages, data, metadata, APIs) use.

  • (3) WIS 2.0 prioritizes the use of public telecommunications networks (i.e. Internet) when publishing digital resources.

  • (4) WIS 2.0 requires provision of Web service(s) to access or interact with digital resources (e.g. data, information, products) published using WIS.

  • (5) WIS 2.0 encourages NCs and DCPCs to provide 'data reduction' services via WIS that process 'big data' to create results or products that are small enough to be conveniently downloaded and used by those with minimal technical infrastructure.

  • (6) WIS 2.0 adds open standard messaging protocols that use the publish-subscribe message pattern to the list of data exchange mechanisms approved for use within WIS and GTS.

  • (7) WIS 2.0 requires all services that provide real-time distribution of messages (containing data or notifications about data availability) to cache/store the messages for a minimum of 24 hours and allow users to request cached messages for download.

  • (8) WIS 2.0 adopts direct data-exchange between provider and consumer and phases out the use of routing tables and bulletin headers.

  • (9) WIS 2.0 provides a catalogue containing metadata that describes both data and the service(s) provided to access that data.

  • (10) WIS 2.0 encourages data providers to publish metadata describing their data and Web services in a way that can be indexed by commercial search engines.

6.1.2. Discovery metadata design considerations

The following describes envisioned workflows of WIS2 in the context of metadata search and harvesting.

  • Flexible metadata publishing mechanisms so providers can publish discovery metadata in the easiest and most efficient way possible.

  • Basic, HTTP crawlable metadata files (filesystem, object storage). For example, publishing discovery metadata as JSON files to an S3 bucket, and then making that bucket available for harvesting and traversal to search engines and metadata harvesters.

  • The browser as the catalogue. Browsers utilize mass market search engines as the gateway to low barrier discovery. This pattern may work by way of the Global Discovery Catalogue and the Global Cache, with the idea that search engines can index from the authoritative source.

6.1.3. Granularity

In order to provide discovery metadata of value, it is important to clarify the granularity levels of which providers are to provide describing their data and associated services. Articulating the level of granularity will reduce catalogue "pollution" and bring the user closer to the data via their search criteria.

For data, A WCMP record provides a description at the primary granularity of a dataset, which facilitates clear cataloguing and discovery workflow, in combination with data services or APIs, which provide access, queries, and filters at a lower level of granularity (parameter, variable, spatiotemporal extents).

The Discovery metadata workflow figure below illustrates example metadata publication and discovery workflows against common meteorological data types:

Discovery metadata workflow
Figure 1. Discovery metadata workflow

Common meteorological data types include:

  • collection (model): NWP model (discovery metadata record). Example: Canadian Global Deterministic Prediction System

    • variables are described as themes/concepts (e.g. air temperature)

    • access options:

      • data service or API endpoint to interrogate data/variable/spatiotemporal dimensions

      • x/y/z/t (granule) (STAC Item with link to actual data asset)

  • collection (observations): surface weather observations (discovery metadata record)

    • station metadata as WIGOS metadata via WMO OSCAR/Surface

    • access options:

      • data service or API endpoint to interrogate data/variable/spatiotemporal dimensions

      • x/y/z/t (granule) (STAC Item, with link to actual data asset)

  • collection (climate archive): climate daily station data (discovery metadata record)

    • access options:

      • API endpoint to interrogate data/variable/spatiotemporal dimensions

      • single observation (granule) (STAC Item with link to actual data asset)

Section "Why are datasets so important?" in the WIS2 Guide [wis2-guide] provides further explanation and rationale for datasets as part of WIS2.

6.2. User stories

As part of requirements gathering [28], the following user stories provide a description of features that are relevant to WIS2 metadata and search, and are cast from a user perspective:

6.2.1. Domain specialist

  • As an NWP centre operator, I want to quickly and easily publish information about the data that my centre provides and update it as needed in a (semi)automated way using the information that I already have in my databases, so that I can concentrate on my core business.

  • As the leader of a forecasting team of a national meteorological institution, I would like to be able to find more sources of data that might be relevant or useful for the work of my team, notably NWP and satellite imagery so that we could further improve our predictions.

  • As a GIS professional, I would like to search for weather, climate and water data from my GIS desktop support tool so that I can integrate forecast data into my workflow.

6.2.2. Mass market

  • As an entrepreneur (start-up) that provides (wants to provide) tailored weather information, I want to find services (free or commercial) that provide meteorological data in the cloud, or even better, a service that provides customizable processing of such data to build my own service on top of it. I also want to be able to find out if a new service becomes available or if an existing one changes its abilities so that my company can keep on advancing.

  • As a user, I would like to search for real-time observations for a given time and geographical area of interest, so that I can have up-to-date information on weather for my city.

6.2.3. Developers

  • As a software developer (working for a national meteorological centre or a private company), I would like to find a relevant technical description of the service (API) that my boss wants me to integrate with, so that the declared interoperability becomes a reality.

  • As a web developer, I would like to access a search API that provides easy-to-read documentation, examples, and a simple, intuitive RESTful API with JSON so that I can integrate into my web application quickly.

The following WIS2 marketing video [29] adds the following user stories:

  • As an everyday user, I would like to find easy-to-understand and precise weather data so that I can plan to have people over for an outdoor BBQ on a nice day.

  • As a smart home owner, I would like access to frequently updated data so that I can keep my smart home monitoring up to date.

  • As a weather specialist, I would like to access weather data in native data formats and subscribe to data updates, so that I can provide tailor-made weather services to my users.

Given the above, we see a variety of users/actors to which WIS2, driving the need for a low barrier, ubiquitous and efficient discovery, visualization, and access of weather, climate, water (real-time, near real-time, archive, etc.) data.

6.3. OGC API - Records - Part 1: Core

The OGC Records - API - Part 1: Core specification:

  • lowers the discovery barrier to finding the existence of geospatial resources on the Web

  • provides the ability for discovery metadata to be published via API machinery (searchable catalogue) or static records (crawlable catalogue)

  • provides a core record model for information communities to extend

  • provides a subset of core queryables (e.g. by resource type, by external identifier) which enables federation and cross catalogue discovery functionality

6.4. The WIS2 Global Discovery Catalogue

The GDC will provide a central search endpoint, enabling users to traverse, browse and search data holdings in WIS2. Key search predicate capabilities include:

  • geospatial (bbox=)

  • temporal (time instant or time period) (datetime=)

  • equality predicates (i.e. property=value) for any defined discovery metadata property

  • full-text (q=)

Given the WIS2 principles, use cases, OGC API - Records - Part 1: Core, and the WIS2 Global Discovery Catalogue, WCMP provides a standards-based, clear and well-defined information model to facilitate the management and discovery of data within WIS2.

6.5. Mass market considerations

Given WIS2 principle 10 (publishing metadata in a way that commercial search engines can index), WCMP discovery metadata enables annotations that can facilitate Search Engine Optimization (SEO) and structured data discovery, search, and relevant results.

7. The WMO Core Metadata Profile Record

A WCMP record provides descriptive information about a dataset made available through WIS2.

7.1. Requirements Class "Core"

7.1.1. Overview

The WCMP Core Requirements Class provides requirements for a WCMP discovery metadata record.

Requirements Class

http://wis.wmo.int/spec/wcmp/2/req/core

Target type

Discovery Metadata

Dependency

IETF RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format

Dependency

JSON Schema

Dependency

GeoJSON

Dependency

OGC API - Records - Core: Part 1

Dependency

OpenAPI Specification, Version 3.1.0

Pre-conditions

The record conforms to OGC API - Records - Core: Part 1: Requirements Class: Record Core

The table below provides an overview of the set of properties that may be included in a WCMP record.

Table 2. WCMP record core properties
Property Requirement Description

id

required

A unique identifier of the dataset (see Identifier)

type

required

A fixed value denoting the WCMP record as a GeoJSON Feature (see Validation)

conformsTo

required

The version of WCMP associated that the record conforms to (see Conformance)

properties.type

required

The resource type described by the WCMP record (see Properties / Type)

properties.title

required

A human-readable name of the dataset (see Properties / Title)

properties.description

required

A free-text summary description of the dataset (see Properties / Description)

properties.keywords

optional

Keywords, tags or key phrases (see Properties / Keywords)

properties.themes

required

Classifiers, categories and controlled vocabularies (see Properties / Themes)

geometry

required

Geospatial location associated with the dataset, in a geographic coordinate reference system (see Geospatial extent)

time

required

Temporal extent associated with the dataset (see Temporal extent)

additionalExtents.spatial

optional

Additional geospatial extents in other coordinate reference systems (see Additional geospatial extents)

additionalExtents.temporal

optional

Additional time instants or periods (see Additional temporal extents)

properties.contacts

required

Contact information for the dataset (see Properties / Contacts)

properties.version

optional

Version or edition of the dataset (see Properties / Version)

properties.externalIds

optional

Persistent identifiers or handles for the dataset (see Properties / Persistent identifiers)

properties.created

required

The date that the WCMP record was created (see Properties / Record creation date)

properties.updated

optional

The date that the WCMP record was updated (see Properties / Record update date)

properties.status

optional

The operational status of the dataset (see Properties / Status)

properties.wmo:dataPolicy

conditional

Classification code of core or recommended based on the WMO Unified Data Policy[30]. Required for datasets (see Properties / WMO data policy)

properties.rights

optional

A statement that concerns all rights not addressed by the license such as a copyright statement. (see Properties / WMO data policy)

links

required

Online linkages to data retrieval or additional resources associated with the dataset (see Links and distribution information)

linkTemplates

optional

Online link templates for dynamic / API access (see Templated links)

properties.*

optional

Additional properties as needed (see Additional properties)

7.1.2. WCMP record representation

WCMP record can be represented in various ways internally, in WIS systems and software tools, but its external representation is GeoJSON.

Recommendation 1

/rec/core/media_type

A

The media type assigned to a WCMP record, when transported through a protocol that supports it, SHOULD be application/geo+json.

7.1.3. Validation

The WCMP record schema is based on OGC API - Records - Part 1: Core: Requirements Class: Record Core schema and the associated information model. WCMP records compliant with WCMP schema are therefore compliant with the OGC API - Records record schema.

Requirement 1

/req/core/validation

A

Each WCMP record SHALL validate without error against the WCMP schema.

B

Each WCMP record SHALL provide id, type, geometry and properties properties for GeoJSON compliance.

C

The type property SHALL be set to a fixed value of Feature for GeoJSON compliance.

7.1.4. Identifier

The id property is a unique identifier of the dataset. A record identifier is essential for querying and identifying records within the GDC.

Example
"id": "urn:wmo:md:ca-eccc-msc:observations.swob"

Requirement 2

/req/core/identifier

A

A WCMP record SHALL provide an identifier via the id property.

B

The id property SHALL have the following notation: urn:wmo:md:{centre_id}:{local_identifier}.

C

The centre_id SHALL be based on the associated vocabulary specified in the WIS topic hierarchy.

D

The id property SHALL include a local identifier as defined by the data publisher. The local identifier SHALL NOT have spaces or special or accented characters.

Permission 1

/rec/core/identifier

A

The local identifier MAY also have colons (:) as required by the data publisher.

7.1.5. Conformance

The conformsTo property to identifies the version of the WCMP standard that the metadata record conforms to. Conformance identification is valuable for version detection and handling of content.

Example
"conformsTo": [
  "http://wis.wmo.int/spec/wcmp/2/conf/core"
]

Requirement 3

/req/core/conformance

A

A WCMP record SHALL provide information on conformance via the OARec record conformsTo property.

B

The conformsTo property SHALL advertise conformance to WCMP.

7.1.6. Properties / Type

The type property identifies the type of resource that the metadata record describes using values from the resource type codelist. While most metadata records will be set to dataset, WCMP can also describe additional resources, such as services and processes.

A dataset is the primary granularity of a WCMP record describing a collection of data granules.

A service is an API or Web service providing a discovery, visualization, or access mechanism that operates on data.

A process is a workflow or execution to provide custom functionality to calculate a given output or product.

Example:
"properties": {
  ...
  "type": "dataset"
  ...
}

Requirement 4

/req/core/type

A

A WCMP record SHALL provide a properties.type property.

B

The properties.type property SHALL be a valid code from the WCMP resource type codelist[31].

7.1.7. Properties / Title

The title property is a human-readable name of the dataset.

Example
"properties": {
  ...
  "title": "Surface weather observations"
  ...
}

Requirement 5

/req/core/title

A

A WCMP record SHALL provide a properties.title property.

7.1.8. Properties / Description

The description property is a free-text summary of the dataset.

Example
"properties": {
  ...
  "description": "Surface observations measured at the automatic and manual stations of the Environment and Climate Change Canada and partners networks, either for a single station or for the stations of specific provinces and territories (last 30 days)."
  ...
}

Requirement 6

/req/core/description

A

A WCMP record SHALL provide a properties.description property.

7.1.9. Properties / Keywords

The keywords property is a list of keywords, tags or specific phrases associated with the resource, but are not referenced to a particular vocabulary or knowledge organization system.

Example
"properties": {
  ...
  "keywords": [
    "surface",
    "observations",
    "weather",
    "real-time"
  ]
  ...
}

Recommendation 2

/rec/core/keywords

A

A WCMP record SHOULD provide a properties.keywords property, as a list of freeform text or tags that are not based on a controlled vocabulary.

7.1.10. Properties / Themes

The themes property is a list of concepts that are referenced to a vocabulary or knowledge organization system used to classify the resource.

A theme’s scheme property provides a remote reference to a controlled vocabulary, codelist or knowledge organization system.

A concept’s id provides an identifier for the given concept, as well as optional title, description and url properties to further describe the concept as desired.

A concept’s optional url property can provide a remote reference to a given concept (for example, to an online ontology or code registry).

A WCMP metadata record can have one or more themes.

Examples
"properties": {
  ...
  "themes": [
    {
      "concepts": [
        {
          "id": "0-0-0",
          "title": "Temperature",
          "url": "http://codes.wmo.int/grib2/codeflag/4.2/0-0-0"
        },
        {
          "id": "0-1-1",
          "title": "Relative humidity",
          "url": "http://codes.wmo.int/grib2/codeflag/4.2/0-1-1"
        },
        {
          "id": "0-2-2",
          "title": "u-component of Wind",
          "url": "http://codes.wmo.int/grib2/codeflag/4.2/0-2-2"
        },
        {
          "id": "0-2-3",
          "title": "v-component of Wind",
          "url": "http://codes.wmo.int/grib2/codeflag/4.2/0-2-3"
        }
      ],
      "scheme": "http://codes.wmo.int/grib2/codeflag/4.2"
    }
  ]
  ...
}
"properties": {
  ...
  "themes": [
    {
      "concepts": [
        {
          "id": "001",
          "title": "Temperature/air temperature",
          "url": "http://codes.wmo.int/bufr4/b/12/001"
        },
        {
          "id": "003",
          "title": "Dewpoint temperature",
          "url": "http://codes.wmo.int/bufr4/b/12/003"
        }
      ],
      "scheme": "http://codes.wmo.int/bufr4/b"
    }
  ]
  ...
}
"properties": {
  ...
  "themes": [
    {
      "concepts": [{
        "id": "weather",
        "title": "Weather",
        "url": "http://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/weather"
      }],
      "scheme": "http://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline"
    }
  ]
  ...
}

Requirement 7

/req/core/themes

B

A WCMP record SHALL provide at least one themes property.

C

Each themes property SHALL provide at least one concept property.

D

Each themes property SHALL provide a scheme property that refers to a controlled vocabulary or thesaurus.

E

A WCMP record describing a dataset SHALL provide a themes property identifying all applicable Earth system disciplines as defined in the WIS2 Topic Hierarchy.

Requirement 8

/req/core/themes_wis2_global_service

A

A WCMP record describing a WIS2 global service SHALL provide a themes property identifying all Earth system disciplines as defined in WCMP codelists.

B

A WCMP record describing a WIS2 global service SHALL provide a themes property identifying the service type provided.

Recommendation 3

/rec/core/granularity

A

A WCMP record SHOULD describe dataset parameters and variables as themes/concepts with an associated controlled vocabulary.

Permission 2

/per/core/themes

A

A WCMP record MAY provide as many themes/concepts as applicable to describe the themes of a given dataset.

7.1.11. Geospatial and temporal extents

7.1.11.1. Geospatial extent

The geometry property is the general bounding spatial extent of the dataset in the geographic coordinate system. Geospatial bounding extents provide a useful indicator of the location of the dataset to facilitate search and map displays in the GDC.

Examples
"geometry": {
  "type": "Polygon",
  "coordinates": [[
    [-142.23, 28.03],
    [-142.23, 82.56],
    [-52.16, 82.56],
    [-52.16, 28.03],
    [-142.23, 28.03]
  ]]
}
"geometry": {
  "type": "Point",
  "coordinates": [-79.38, 43.65]
}
"geometry": null

Requirement 9

/req/core/extent_geospatial

A

A WCMP record SHALL provide ONE geometry property to convey the geospatial properties of a dataset using a geographic coordinate reference system (World Geodetic System 1984 [WGS 84]) and longitude and latitude decimal degree units.

B

The geometry values SHALL be integer or float data types.

C

The geometry property SHALL provide the value of null when geometry cannot be derived.

Recommendation 4

/rec/core/extent_geospatial_point

A

For datasets based on a geometry without a calculated area (for example, single station point), a WCMP record SHOULD provide the GeoJSON geometry as a Point type.

Recommendation 5

/rec/core/extent_geospatial_precision

A

Geometry coordinates SHOULD have a level of precision of 2 or more decimal places.

Recommendation 6

/rec/core/extent_geospatial_wis_2_global_service

A

For a WIS2 Global Service, a WCMP record SHOULD provide the GeoJSON geometry as a Polygon type with a WGS84 bounding geometry of -180 (west longitude), -90 (south latitude), 180 (east longitude), 90 (north latitude).

7.1.11.2. Additional geospatial extents

The additionalExtents.spatial property is for other geospatial extents associated with the dataset. For example, it may be useful for non-geographic data or for describing multiple sub-areas of a dataset. The additionalExtents.spatial.bbox property provides the ability to list one to many minimum bounding geometries for a given dataset, where:

  • The minimum longitude is the westernmost coordinate of the limit of the dataset extent, expressed in longitude decimal degrees as a signed number between -180 and 180, less than or equal to the maximum longitude.

  • The minimum latitude is the southernmost coordinate of the limit of the dataset extent, expressed in latitude decimal degrees as a signed number between -90 and 90, less than or equal to the maximum latitude.

  • The maximum longitude is the easternmost coordinate of the limit of the dataset extent, expressed in longitude decimal degrees as a signed number between -180 and 180, greater than or equal to the minimum longitude.

  • The maximum latitude is the northernmost coordinate of the limit of the dataset extent, expressed in latitude decimal degrees as a signed number between -90 and 90, greater than or equal to the minimum latitude.

This property also facilitates catalogue searches with geospatial predicate (within extent, etc.).

Example
"additionalExtents": {
  "spatial": {
    "bbox": [
      [-142, 42, -52, 84]
    ],
    "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84"
  }
}

Permission 3

/per/core/extent_geospatial

A

A WCMP record MAY provide multiple additionalExtents.spatial.bbox item properties to express additional geospatial extents in other coordinate reference systems.

B

The geometry property MAY provide a third element (height) as per clause 4 of the GeoJSON specification.

7.1.11.3. Temporal extent

The time property describes the general bounding extent of the dataset and the temporal resolution.

Temporal extents provide a useful indicator of the date and time period of the dataset and facilitates temporal searching in the GDC.

In addition the temporal resolution provides a useful indicator of the data update frequency (for example, for real-time datasets). If only times are given for the interval, it is implicitly assumed that those are recurring every day.

In cases where no time indication can be derived, it is applicable to state the value of null.

Examples
"time": {
  "date": "2021-10-30"
}
"time": {
  "timestamp": "2021-10-30T11:11:11Z"
}
"time": {
  "interval" : ["2020-10-30", "2021-10-30"],
  "resolution": "P1D"
}
"time": {
  "interval" : ["T00Z", "T23Z"],
  "resolution": "PT1H"
}
"time": {
  "interval": ["2018-04-22", ".."],
}
"time": null

To ensure clarity, an additional human-readable explanation is given in the properties.description. Further time-related characteristics (e.g. frequency of modifications, available data, etc.) should be added in properties.themes.

Some cases might be more complex due to the product’s characteristics. If necessary, further granularity can be indicated by the additionalExtents.temporal property (see Additional temporal extents).

Example: Complex time indication
"time": {
  "interval" : ["2018-04-22", ".."]
},
"additionalExtents": {
  "temporal": {
    "interval": [
      [
        "T00Z",
        "PT180H"
      ],
      [
        "T12Z",
        "PT180H"
      ]
    ],
    "resolution": "PT6H",
    "trs": "http://www.opengis.net/def/trs/ISO-8601"
  }
}
...
"properties": {
  ...
  "description": "ICON-EPS 0.5 deg x 0.5 deg regular lat/lon grid, up to +180h every 6h, runs 00/12 UTC, various parameter, various level, various threshold",
  "themes": [
    {
      "concepts": [
        {"id": "continual"}
      ],
      "scheme": "https://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_FrequencyCode"
    }
  ]
}

Requirement 10

/req/core/extent_temporal

A

A WCMP record SHALL provide ONE time property using the Gregorian calendar.

B

The time property SHALL provide either ONE date, timestamp, interval or the value of null when a conformant time cannot be derived.

C

All non-null time values SHALL be valid ISO8601 representations or .. for an open-ended extent.

Recommendation 7

/rec/core/extent_temporal

A

For datasets with known or discrete intervals, a WCMP record SHOULD provide the temporal resolution (time.resolution) as a valid ISO 8601 duration (for example, P1D).

B

For complex temporal extents, a WCMP record SHOULD also provide a human-readable explanation in properties.description to promote clarification and unambiguity.

C

To distinguish maintenance or update frequency, those SHOULD be included in properties.themes.

Recommendation 8

/rec/core/extent_service

A

For WCMP records describing a service or API, a time value of null MAY be provided.

7.1.11.4. Additional temporal extents

The additionalExtents.temporal property is for describing other temporal extents associated with the dataset. For example, it may be useful to represent multiple time instances or to identify other temporal reference systems. Temporal extents can be fully bound or open in either direction. An additionalExtents.temporal.resolution property is able express the temporal granularity at which a given dataset’s data is measured, generated, or reported.

Example
"additionalExtents": {
  "temporal": {
    "interval": [
      [
        "T00Z",
        "PT180H"
      ],
      [
        "T12Z",
        "PT180H"
      ]
    ],
    "resolution": "PT6H",
    "trs": "http://www.opengis.net/def/trs/ISO-8601"
  }
}

Permission 4

/per/core/extent_temporal

A

A WCMP record MAY provide multiple additionalExtents.temporal item properties to express additional temporal extents in other temporal reference systems.

7.1.12. Properties / Contacts

The contacts property is the information associated with one or more responsible parties of the resource.

Examples
"properties": {
  ...
  "contacts": [{
    "identifier": "ECCC",
    "organization": "Government of Canada; Environment and Climate Change Canada; Meteorological Service of Canada",
    "name": "National Inquiry Response Team",
    "phones": [{
      "value": "+18199972800"
    }],
    "emails": [{
      "value":"enviroinfo@ec.gc.ca"
    }],
    "addresses": [{
      "deliveryPoint": [ "77 Westmorland Street, suite 260" ],
      "city": "Fredericton",
      "administrativeArea": "NB",
      "postalCode": "E3B 6Z4",
      "country": "Canada"
    }],
    "links": [{
      "href": "https://example.org/about",
      "rel": "about",
      "type": "text/html"
    }],
    "contactInstructions": "email",
    "roles": ["producer", "host"]
  }]
  ...
}

A contact can also be specified by using a URL.

"properties": {
  ...
  "contacts": [{
    "organization": "Government of Canada; Environment and Climate Change Canada; Meteorological Service of Canada",
    "links": [{
      "href": "https://example.org/about",
      "rel": "about",
      "type": "text/html"
    }],
    "roles": ["producer"]
  }]
}

Requirement 11

/req/core/contacts

A

A WCMP record SHALL provide at least one contact via the properties.contacts property.

B

The properties.contacts SHALL provide an organization property.

C

The roles property, when specified, SHALL provide a role type from the WCMP role type codelist.

Permission 5

/per/core/contacts

A

The properties.contacts property MAY provide more than one contact via multiple objects or a single contact object with multiple roles.

7.1.13. Properties / Version

The version property is the version or edition of the dataset. Datasets may be versioned by an organization, for example, the version of an NWP model or a processing chain/workflow, and data providers can make this information available when there are multiple versions of a dataset over time.

Example
"properties": {
  ...
  "version": "0.1.0"
  ...
}

Permission 6

/per/core/version

A

A WCMP record MAY provide a properties.version property to describe the version of a given dataset.

7.1.14. Properties / Persistent identifiers

The externalIds property is a persistent (or handle) identifier used to provide a long lasting reference to a digital resource. Persistent identifiers are commonly used for scientific publications and datasets.

Examples of persistent identifiers include, but are not limited to:

  • Digital Object Identifiers (DOI)[32]

  • Archival Resource Key (ARK)[33]

  • Handle[34]

Example
"properties": {
  ...
  "externalIds": [{
    "scheme": "https://doi.org",
    "value": "10.14287/10000001"
  }, {
    "scheme": "https://handle.net",
    "value": "2381/12775"
  }, {
    "scheme": "https://arks.org",
    "value": "ark:/13030/tf5p30086k"
  }]
  ...
}
Example: Online citation
"links": [
  {
    "rel": "cite-as",
    "title": "Cite as: WMO/GAW Ozone Monitoring Community, World Meteorological Organization-Global Atmosphere Watch Program (WMO-GAW)/World Ozone and Ultraviolet Radiation Data Centre (WOUDC) [Data]. Retrieved [YYYY-MM-DD], from https://woudc.org. A list of all contributors is available on the website. doi:10.14287/10000004",
    "type": "text/html",
    "href": "https://dx.doi.org/10.14287/10000004"
  }
]

Recommendation 9

/rec/core/pids

A

A WCMP record SHOULD provide persistent identifier references via items in the properties.externalIds array property, where the value of scheme is based on an established persistent identifier scheme (such as https://doi.org, https://arks.org, https://handle.net, etc.), and the value property is the persistent identifier (for example, https://dx.doi.org/10.14287/10000001).

Permission 7

/per/core/pids

A

A WCMP record MAY provide a persistent identifier as a means to cite research or resource identification using a persistent identifier scheme/framework.

B

A WCMP record MAY provide a persistent identifier as a link object with rel=cite-as if there is an online citation or reference.

7.1.15. Properties / Record creation date

The created property is a single date that the WCMP metadata record was created. Note, that this date is not the start or end time of a given dataset. See Temporal extent for more information on defining dataset temporal extents.

Example
"properties": {
  ...
  "created": "2021-06-12T23:45:24Z"
  ...
}

Requirement 12

/req/core/record_creation_date

A

A WCMP record SHALL provide a single properties.created property.

B

The properties.created property SHALL NOT be repeated or used to document change history.

7.1.16. Properties / Record update date

The updated property is the date that the WCMP metadata record was last updated. Note, that this date is not the start or end time of a given dataset. See Temporal extent for more information on defining dataset temporal extents.

Example
"properties": {
  ...
  "updated": "2022-06-12T18:52:39Z"
  ...
}

Recommendation 10

/rec/core/record_update_date

A

A WCMP record SHOULD provide a properties.updated property when a record has been updated since its initial creation.

7.1.17. Properties / Status

The status property identifies the lifecycle of a given dataset. See Annex D for possible codelists to use when encoding this property.

"properties": {
  "status": {
    "id": "operational",
    "title": "dataset is in 24/7 operation",
    "url": "https://example.org/my-vocab"
  }
}

Recommendation 11

/rec/core/status

A

A WCMP record SHOULD provide a properties.status property to identify the operational status of a given dataset.

B

A WCMP record SHOULD provide a properties.status.id property to identify the concept of the status (see Annex D for possible codelists to use).

C

A WCMP record SHOULD provide a properties.status.title property to provide a human readable title for the concept.

D

A WCMP record SHOULD provide a properties.status.description property to provide a human readable description for the concept.

E

A WCMP record SHOULD provide a properties.status.url property to provide further description of the concept via the given URI.

7.1.18. Properties / WMO data policy

The wmo:dataPolicy property is a codelist that identifies the classification of the dataset exchange as described by WMO Unified Data Policy[35] for the international exchange of Earth system data. The codelist values are core or recommended. The wmo:dataPolicy property is required if the metadata record describes a dataset.

Licensing and copyright are expressed via the links property (see distribution section), providing access, license and attribution details as required. Conditions on use of the data should be indicated for transparency and clarification.

Example: Core data
"properties": {
  ...
  "wmo:dataPolicy": "core"
  ...
}
Example: Recommended data
"properties": {
  ...
  "wmo:dataPolicy": "recommended"
  ...
}

It is useful to add provider-specific details to have the most detailed information about data policy and additional conditions.

Example: Recommended data with additional conditions and provider-specific details:
"properties": {
  ...
  "wmo:dataPolicy": "recommended"
  ...
},
"links": [{
  "rel": "license",
  "href": "https://example.org/license",
  "type": "text/html",
  "title": "EUMETSAT DATA LICENSING"
}]
Example: License for recommended data in the public domain
"properties": {
  ...
  "wmo:dataPolicy": "recommended"
  ...
},
"links": [{
  "rel": "license",
  "href": "https://creativecommons.org/publicdomain/zero/1.0/",
  "type": "text/html",
  "title": "CC0 1.0 Deed | CC0 1.0 Universal | Creative Commons"
}]

To express rights not address by a license, the rights property can be used as follows:

Example: Rights
"properties": {
 ...
 "rights": "Users are granted free and unrestricted access to this data, without charge and with no conditions on use. Users are requested to attribute the producer of this data. WMO Unified Data Policy (Resolution 1 (Cg-Ext 2021))"
 ...
}

Requirement 13

/req/core/data_policy

A

When the properties.type property is dataset, the record SHALL provide exactly one properties.wmo:dataPolicy property.

B

The properties.wmo:dataPolicy property SHALL be core or recommended.

C

When the properties.wmo:dataPolicy property is recommended, data licensing SHALL be provided by at least one links item with link relations (rel) of license.

Recommendation 12

/rec/core/data_policy_conditions

A

Additional conditions represented by a links item SHOULD also provide a title property to include human-readable information about the link.

B

To express any conditions on use of a given dataset, the properties.rights property SHOULD be used.

C

For core data or recommended data compatible with free and unrestricted principles, properties.rights SHOULD be declared with exactly the following statement:

Users are granted free and unrestricted access to this data, without charge and with no conditions on use. Users are requested to attribute the producer of this data. WMO Unified Data Policy (Resolution 1 (Cg-Ext 2021))

D

For core or recommended data not in the public domain, a copyright statement SHOULD be expressed as either a properties.rights statement or a link object with rel=copyright.

Permission 8

/per/core/data_policy

A

For core data (when properties.wmo:dataPolicy property is core), attribution licensing MAY be provided as needed.

B

For core data (when properties.wmo:dataPolicy is core) or recommended data (when properties.wmo:dataPolicy is recommended, and the data is compatible with free and unrestricted principles), a license or public domain statement that is compatible with free and unrestricted principles (e.g., Creative Commons CC0[36]) MAY be expressed as a link object with the license link relation.

C

For core data (when properties.wmo:dataPolicy is core) or recommended data (when properties.wmo:dataPolicy is recommended, a copyright statement MAY be expressed in properties.rights

D

For core data (when properties.wmo:dataPolicy is core) or recommended data (when properties.wmo:dataPolicy is recommended, a link object MAY be expressed with rel=copyright.

7.1.19.1. Overview

The links property describes URLs and APIs for accessing the dataset or for subscribing to dataset notifications. Links are the primary mechanism for interacting with the data, and provide an "actionable" workflow to enhance and improve the user experience with "less clicks" for subscriptions and downloads.

The links property may also describe URLs for related documentation, related data, or visual images of the dataset.

The table below provides an overview of the properties of a link object.

Table 3. Link properties
Property Requirement Description

href

required

The link destination or target, or URL

rel

optional

The relationship that the link bears in the context of the WCMP record. This is a controlled vocabulary defined by IANA link relations[37] or WCMP defined extensions[38] (see Link relation selection)

type

optional

The media (or MIME) type of the format of the link

hreflang

optional

The language of the content in the link

title

optional

A human-readable name for the link (can be used for display on search / discovery web portals)

channel

conditional

For data made available via MQTT, the topic to which a user may subscribe to for notifications and access

security

optional

For access controlled data, a description of the access control mechanism applied (see Access control)

distribution

optional

Value added information about the link to further assist the user (additional document, typical file size, etc.) (see Distribution information)

For recommended data, the links property may also provide links to services that implement access control in support of authentication and authorization. In secure data use cases, a user needs to be able to detect access-controlled data as part of data discovery and evaluation.

Example Access controlled link
"links": [{
  "rel": "data",
  "type": "application/json",
  "title": "link to WAF endpoint",
  "href": "https://example.org/data/secure-data",
  "security": {
    "default": {
      "type": "http",
      "scheme": "basic",
      "description": "Please contact the data provider for accessing this secured resource."
    }
  }
}]
Example: two link objects providing both search and MQTT subscription information
"links": [
  {
    "rel": "search",
    "type": "text/html",
    "title": "WOUDC - Data - Station List",
    "href": "https://example.org/data/stations"
  },
  {
    "rel"  : "items",
    "type" : "application/geo+json",
    "title": "WIS2 notification service",
    "href" : "mqtts://example.org",
    "channel": "cache/a/wis2/ca-eccc-msc/data/core/weather/surface-based-observations"
  }
]
Example: a link object providing an API capability
"links": [
  {
    "rel": "service",
    "type": "application/json",
    "title": "OGC API - Features service",
    "href": "https://example.org/api"
  }
]
Example: a link object providing a browse graphic
"links": [
  {
    "rel": "preview",
    "type": "image/png",
    "title": "Browse graphic",
    "href": "https://example.org/path/to/browse.png"
  }
]

Templated links allow for specifying a pattern of a link in support API interaction (where parameter values are variable).

Example: a templated link object of a WMS service providing API access to images:
"linkTemplates": [{
  "rel": "item",
  "type": "image/png",
  "title": "Eumetview",
  "uriTemplate": "https://example.org/geoserver/ows?service=WMS&request=GetMap&version=1.3.0&layers=msg_fes:ir108&styles=&format={format}&crs={crs}&bbox={bbox}&width={width}&height={height}",
  "variables": {
    "crs": {
      "description": "...",
      "type": "string",
      "enum": [
        "EPSG:4326",
        "EPSG:3857"
      ]
    },
    "bbox": {
      "description": "...",
      "type": "array",
      "items": {
        "type": "number",
        "format": "double"
      },
      "minItems": 4,
      "maxItems": 4
    },
    "width": {
      "description": "...",
      "type": "number",
      "format": "integer",
      "minimum": 600,
      "maximum": 5000
    },
    "height": {
      "description": "...",
      "type": "number",
      "format": "integer",
      "minimum": 600,
      "maximum": 5000
    },
    "format": {
      "description": "...",
      "type": "string",
      "enum": [
        "image/geotiff",
        "image/geotiff8",
        "image/gif",
        "image/jpeg",
        "image/png; mode=8bit"
      ]
    },
    "sampleRequest": "https://example.org/geoserver/ows?service=WMS&request=GetMap&version=1.3.0&layers=msg_fes:ir108&styles=&format=image/jpeg&crs=EPSG:4326&bbox=-77,-77,77,77&width=800&height=800"
  }
}]

Requirement 14

/req/core/links

A

A WCMP record SHALL provide a links property.

B

The links property SHALL contain at least one link to the data access service allowing users to download the data.

C

The links property SHALL contain a Web Accessible Folder (WAF) OR an API link for non-real-time data (such as climate records or hydrometric data archives).

D

The links property SHALL contain access control information for data, products, and services that require authentication or authorization.

E

For representing MQTT links, the URI scheme SHALL be mqtt (default port 1883) or mqtts (default port 8883) for secure TLS encrypted connections.

F

The links property SHALL provide the channel property of the MQTT topic for real-time data under which the data publication notifications will be accessible from the WIS2 Global Broker, following the WIS2 topic hierarchy.

G

The links property SHALL include a valid link relation from IANA [39] or the WCMP link type codelist [40].

7.1.19.3. Distribution information

The distribution property provides information about the format of the dataset, associated documentation and representative examples of the dataset.

Additional distribution information is added to allow more comprehensive discovery services. Below is an example of such distribution information.

Example with the complete distribution information
"links": [{
  "rel": "search",
  "type": "text/html",
  "title": "EUMETSAT Datastore",
  "href": "https://example.org/data/map/EO:EUM:DAT:MSG:MSG15-RSS",
  "distribution": {
    "availableFormats": [{
      "name": "native",
      "description": "This is sent in a compressed Submission Information Package (SIP) by default.",
      "numberOfFiles": "288 per day",
      "typicalFilesize": "60 MB",
      "typicalFilename": "MSG3-SEVI-MSG15-0100-NA-20130208102743.243000000Z-1051616.zip",
      "samples": {
        "href": "https://example.org/data/access/MSG3-SEVI-MSG15-0100-NA-20130208102743.243000000Z-1051616.zip"
      },
      "documentation": [{
        "rel": "alternate",
        "type": "text/html",
        "title": "SIP documentation and tools",
        "href": "https://www.eumetsat.int/formats#SIP"
      }]
    }]
  }
}]

Recommendation 14

/rec/core/distribution

A

A WCMP record SHOULD describe additional distribution information with the links.distribution property to qualify a given service link. This information SHOULD be used to build the discovery information and allow the user to find and choose the appropriate service for accessing the data.

B

The links.distribution.availableFormats property SHOULD describe the different formats that can be retrieved using the service link.

C

The links.distribution.availableFormats.name property SHOULD describe the available format short name.

D

The links.distribution.availableFormats.description SHOULD describe the associated format.

E

The links.distribution.availableFormats.typicalFilename SHOULD describe the filenames that are available from the service link.

F

The links.distribution.availableFormats.typicalFilesize SHOULD describe the typical filesize available from the service link.

G

The links.distribution.availableFormats.numberOfFiles SHOULD describe the typical number of files received during a given period (day, month, …​) when using the service link. It SHOULD follow the pattern X per day, X per month.

H

The links.distribution.availableFormats.documentation SHOULD be a link for accessing the documentation associated with the format.

I

The links.distribution.availableFormats.samples SHOULD be an array of direct links to representative samples of the data.

7.1.19.4. Access control

WCMP record links may also provide links to services that implement access control in support of authentication and authorization. In secure data use cases, a user needs to be able to detect access controlled data as part of data discovery and evaluation. The example demonstrates how to express access control using HTTP Basic Authentication for a given data access service.

Example
"links": [{
  "rel": "data",
  "type": "application/json",
  "title": "link to WAF endpoint",
  "href": "https://example.org/data/secure-data",
  "security": {
    "default": {
      "type": "http",
      "scheme": "basic",
      "description": "Please contact the data provider for accessing this secured resource."
    }
  }
}]

Link relations are very important and provide valuable context to help clarify the semantics of a given link or URL.

The table below provides guidance on which link relation to use to identify common types of links to data and services.

Table 4. Link relation selection
Link type Link relation (rel=)

Online data archive

archives

Online documentation

about

OpenAPI endpoint (e.g. JSON or YAML)

service-desc

OpenAPI endpoint in HTML (e.g. Swagger, ReDoc)

service-doc

OGC WMS, WFS, WCS, CSW, WPS Capabilities

service-desc

A single link providing numerous data granules

items

A link providing a single data granule

item

A link to numerous stations that the dataset is based on

stations

A link to a single station that the dataset is based on

station

citation

cite-as

A search portal or web application

search

A zipfile of data, or bulk download

enclosure

A browse graphic of a dataset

preview

An OGC API endpoint providing a collection description

collection

7.1.20. Additional properties

A WCMP record can be extended as required for organizational purposes by adding properties (of any type) in the record. Additional properties do not break compliance to WCMP.

Example
"properties": {
  ...
  "approvalStatus": "approved"
  "_comment": {
    "validationErrors": [
      "error 1",
      "error 2"
    ]
  }
  ...
}

Permission 10

/per/core/additional_properties

A

A WCMP record MAY provide additional properties of any type in any part of the document as needed.

8. Cataloguing considerations

In addition to documenting and describing WIS2 data holdings, WCMP discovery metadata will be searchable via the The WIS2 Global Discovery Catalogue (GDC). As part of discovery and search workflow, a GDC may choose to apply filters to help narrow search results. This is realized by the API of the GDC, as well as applying facets in the catalogue.

8.1. Faceting

The API of the GDC, in addition to allowing for spatial/temporal/attribute queries and filters, may choose to apply facets to WCMP records. Facets are effective when applied against controlled vocabularies and classifications. The following WCMP required properties would be subject to faceting by a GDC:

Annex A: Conformance Class Abstract Test Suite (Normative)

A.1. Conformance Class: Core

label

http://wis.wmo.int/spec/wcmp/2/conf/core

subject

Requirements Class "core"

classification

Target Type:Discovery Metadata

A.1.1. Validation

label

/conf/core/validation

subject

/req/core/validation

test-purpose

Validate that a WCMP record is valid to the authoritative WCMP schema.

Run JSON Schema validation on the WCMP record against the WCMP authoritative schema.

A.1.2. Identifier

label

/conf/core/identifier

subject

/req/core/identifier

test-purpose

Validate that a WCMP record has a valid identifier.

Check for the existence of an id property in the WCMP record.

In the WCMP record’s id property, check that there are at least five tokens, delimited by :.

In the WCMP record’s id property, delimiting the value on :, check that the first three tokens are equal to ['urn', 'wmo', 'md'].

In the WCMP record’s id property, delimiting the value on :, check that the fourth token is a centre id based on the WIS2 Topic Hierarchy and controlled vocabulary.

In the WCMP record’s id property, delimiting the value on :, check that the fifth token (the local identifier) has no spaces or accented characters.

A.1.3. Conformance

label

/conf/core/conformance

subject

/req/core/conformance

test-purpose

Validate that a WCMP record provides valid conformance information.

Check for the existence of a conformsTo property in the WCMP record.

In the WCMP record’s conformsTo array property, check that ONE of the values is equal to http://wis.wmo.int/spec/wcmp/2/conf/core.

A.1.4. Type

label

/conf/core/type

subject

/req/core/type

test-purpose

Validate that a WCMP record provides valid resource type information.

Check for the existence of a properties.type property in the WCMP record.

Check that the value of properties.type is part of the WCMP resource type codelist.

A.1.5. Geospatial Extent

label

/conf/core/extent_geospatial

subject

/req/core/extent_geospatial

test-purpose

Validate that a WCMP record provides a valid geometry property.

Check for the existence of one geometry property in the WCMP record.

Check that all geometry coordinate value data types are integers or floats.

Check that geometry coordinate longitudinal values are between -180 and 180.

Check that geometry coordinate latitudinal values are between -90 and 90.

Check that geometry property is a valid GeoJSON geometry.

A.1.6. Temporal Extent

label

/conf/core/extent_temporal

subject

/req/core/extent_temporal

test-purpose

Validate that a WCMP record provides a valid temporal extent property.

Check for the existence of one time item property in the WCMP record.

Check that the time object is one of date string, timestamp string, interval array, or null.

Check that all non-null time values are valid ISO8601 representations, intervals or durations, or .. for an open-ended extent.

A.1.7. Title

label

/conf/core/title

subject

/req/core/title

test-purpose

Validate that a WCMP record provides a title property.

Check for the existence of a properties.title property in the WCMP record.

A.1.8. Description

label

/conf/core/description

subject

/req/core/description

test-purpose

Validate that a WCMP record provides a description property.

Check for the existence of a properties.description property in the WCMP record.

A.1.9. Themes

label

/conf/core/themes

subject

/req/core/themes

test-purpose

Validate that a WCMP record provides a themes property.

Check for the existence of a single properties.themes array property in the WCMP record.

Check that the properties.themes property provides a minimum of one theme object.

Check that each theme object provides a minimum of one concepts property.

Check that each theme object provides one scheme property.

Check that each concept object provides a minimum of one id property.

Check that the properties.themes property provides a theme object with the scheme of https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline.

Check that all concepts identified are part of the scheme provided.

label

/conf/core/themes_wis2_global_service

subject

/req/core/themes_wis2_global_service

test-purpose

Validate that a WCMP record provides a themes property from a WIS2 global service.

Check for the existence of a properties.type element with a value of service.

Check that the properties.themes property provides a theme object with the scheme of https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline.

Check that each value from the scheme is provided as a concept.

Check that the properties.themes property provides a theme object with the scheme of https://codes.wmo.int/wis/global-service-type.

Check that one concept from the scheme is provided.

A.1.10. Contacts

label

/conf/core/contacts

subject

/req/core/contacts

test-purpose

Validate that a WCMP record provides contact information for the metadata point of contact and originator of the data.

Check for the existence of a properties.contacts property in the WCMP record.

Check that the contact property provides a minimum of one contact object.

Check for the existence of a roles property in the contact object.

Check for the existence of an organization property in the contact object.

If roles exists, check that the value is part of the WCMP contact role codelist.

A.1.11. Record Creation Date

label

/conf/core/record_creation_date

subject

/req/core/record_creation_date

test-purpose

Validate that a WCMP record provides a record creation date.

Check for the existence of one and only one properties.created property in the WCMP record.

A.1.12. WMO Data Policy

label

/conf/core/data_policy

subject

/req/core/data_policy

test-purpose

Validate that a WCMP record provides information about data policy and, if applicable additional information about licensing and/or copyright.

Check for the type of WCMP record (properties.type).

If properties.type is found, and properties.type is equal to dataset check that properties.wmo:dataPolicy exists.

Check for the existence of a properties.wmo:dataPolicy property in the WCMP record.

If properties.wmo:dataPolicy is found, check that properties.wmo:dataPolicy has a value equal to core or recommended.

If properties.wmo:dataPolicy is equal to recommended, check for the existence of at least one links item containing a license link relation (rel).

Annex B: Schemas (Normative)

Note
The schema document will be published on http://schemas.wmo.int/wcmp/2.0 once the standard has been approved.

B.1. WMO Core Metadata Profile Schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.wmo.int/wcmp/2.0/schemas/wcmp2-bundled.json",
  "title": "WCMP discovery metadata record definition",
  "description": "WCMP discovery metadata record definition",
  "required": [
    "id",
    "conformsTo",
    "type",
    "time",
    "geometry",
    "properties",
    "links"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A unique identifier of the catalog record.",
      "format": "uri"
    },
    "conformsTo": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "type": {
      "type": "string",
      "enum": [
        "Feature"
      ]
    },
    "time": {
      "oneOf": [
        {
          "enum": [
            null
          ]
        },
        {
          "type": "object",
          "properties": {
            "date": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            },
            "timestamp": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$"
            },
            "interval": {
              "type": "array",
              "minItems": 2,
              "maxItems": 2,
              "items": {
                "oneOf": [
                  {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}$"
                  },
                  {
                    "type": "string",
                    "pattern": "^\\d{4}$"
                  },
                  {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$"
                  },
                  {
                    "type": "string",
                    "pattern": "^T\\d{2}(:\\d{2})?(:\\d{2})?(?:\\.\\d+)?Z$"
                  },
                  {
                    "type": "string",
                    "enum": [
                      ".."
                    ]
                  }
                ]
              }
            },
            "resolution": {
              "type": "string",
              "description": "Minimum time period resolvable in the dataset, as an ISO 8601 duration",
              "example": [
                "P1D"
              ]
            }
          }
        }
      ]
    },
    "geometry": {
      "oneOf": [
        {
          "enum": [
            null
          ]
        },
        {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "type",
                "coordinates"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "Point"
                  ]
                },
                "coordinates": {
                  "type": "array",
                  "minItems": 2,
                  "items": {
                    "type": "number"
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "type",
                "coordinates"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "MultiPoint"
                  ]
                },
                "coordinates": {
                  "type": "array",
                  "items": {
                    "type": "array",
                    "minItems": 2,
                    "items": {
                      "type": "number"
                    }
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "type",
                "coordinates"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "LineString"
                  ]
                },
                "coordinates": {
                  "type": "array",
                  "minItems": 2,
                  "items": {
                    "type": "array",
                    "minItems": 2,
                    "items": {
                      "type": "number"
                    }
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "type",
                "coordinates"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "MultiLineString"
                  ]
                },
                "coordinates": {
                  "type": "array",
                  "items": {
                    "type": "array",
                    "minItems": 2,
                    "items": {
                      "type": "array",
                      "minItems": 2,
                      "items": {
                        "type": "number"
                      }
                    }
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "type",
                "coordinates"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "Polygon"
                  ]
                },
                "coordinates": {
                  "type": "array",
                  "items": {
                    "type": "array",
                    "minItems": 4,
                    "items": {
                      "type": "array",
                      "minItems": 2,
                      "items": {
                        "type": "number"
                      }
                    }
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "type",
                "coordinates"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "MultiPolygon"
                  ]
                },
                "coordinates": {
                  "type": "array",
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "array",
                      "minItems": 4,
                      "items": {
                        "type": "array",
                        "minItems": 2,
                        "items": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "type",
                "geometries"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "GeometryCollection"
                  ]
                },
                "geometries": {
                  "type": "array",
                  "items": {
                    "$ref": "#/properties/geometry/oneOf/1"
                  }
                }
              }
            }
          ]
        }
      ]
    },
    "additionalExtents": {
      "description": "The extent of the information in the collection. In the Core only spatial and temporal\nextents are specified. Extensions may add additional members to represent other\nextents, for example, thermal or pressure ranges.",
      "type": "object",
      "properties": {
        "spatial": {
          "description": "The spatial extent of the information in the collection.",
          "type": "object",
          "required": [
            "bbox",
            "crs"
          ],
          "properties": {
            "bbox": {
              "description": "One or more bounding boxes that describe the spatial extent of the dataset.\nIn the Core only a single bounding box is supported. Extensions may support\nadditional areas. If multiple areas are provided, the union of the bounding\nboxes describes the spatial extent.",
              "type": "array",
              "minItems": 1,
              "items": {
                "description": "Each bounding box is provided as four or six numbers, depending on\nwhether the coordinate reference system includes a vertical axis\n(height or depth):\n\n* Lower left corner, coordinate axis 1\n* Lower left corner, coordinate axis 2\n* Minimum value, coordinate axis 3 (optional)\n* Upper right corner, coordinate axis 1\n* Upper right corner, coordinate axis 2\n* Maximum value, coordinate axis 3 (optional)\n\nThe coordinate reference system of the values is WGS 84 longitude/latitude\n(http://www.opengis.net/def/crs/OGC/1.3/CRS84) unless a different coordinate\nreference system is specified in `crs`.\n\nFor WGS 84 longitude/latitude the values are in most cases the sequence of\nminimum longitude, minimum latitude, maximum longitude and maximum latitude.\nHowever, in cases where the box spans the antimeridian the first value\n(west-most box edge) is larger than the third value (east-most box edge).\n\nIf the vertical axis is included, the third and the sixth number are\nthe bottom and the top of the 3-dimensional bounding box.\n\nIf a feature has multiple spatial geometry properties, it is the decision of the\nserver whether only a single spatial geometry property is used to determine\nthe extent or all relevant geometries.",
                "oneOf": [
                  {
                    "items": {
                      "type": "number"
                    },
                    "minItems": 4,
                    "maxItems": 4,
                    "type": "array"
                  },
                  {
                    "items": {
                      "type": "number"
                    },
                    "minItems": 6,
                    "maxItems": 6,
                    "type": "array"
                  }
                ]
              },
              "example": [
                -180,
                -90,
                180,
                90
              ]
            },
            "crs": {
              "description": "Coordinate reference system of the coordinates in the spatial extent\n(property `bbox`). The default reference system is WGS 84 longitude/latitude.\nIn the Core this is the only supported coordinate reference system.\nExtensions may support additional coordinate reference systems ",
              "type": "string",
              "default": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]"
            },
            "name": {
              "description": "Name of the vertical coordinate reference system",
              "type": "string"
            }
          }
        },
        "temporal": {
          "description": "The temporal extent of the information in the collection.",
          "type": "object",
          "required": [
            "interval",
            "trs"
          ],
          "properties": {
            "interval": {
              "description": "RFC3339 compliant Date and Time",
              "type": "array",
              "minItems": 1,
              "items": {
                "description": "Begin and end times of the time interval. The timestamps are in the\ntemporal coordinate reference system specified in `trs`. By default\nthis is the Gregorian calendar.",
                "type": "array",
                "minItems": 2,
                "maxItems": 2,
                "items": {
                  "type": "string",
                  "nullable": true
                },
                "example": [
                  [
                    "2020-11-12T12:15Z",
                    "2020-11-12T12:15Z"
                  ],
                  [
                    "2020-11-12T12:15Z",
                    "2020-11-12T12:45Z"
                  ],
                  [
                    "2022-01-14T09:00Z",
                    "2022-01-15T09:00Z"
                  ],
                  [
                    "2022-01-14T09:00Z",
                    "2022-01-14T21:00Z"
                  ],
                  [
                    "2022-01-14T09:00Z",
                    "2022-01-16T09:00Z"
                  ]
                ]
              }
            },
            "values": {
              "description": "Provides information about the time intervals available in the collection \nas ISO8601 compliant dates, either as a time range specified \nas start time / end time  (e.g. 2017-11-14T09:00Z/2017-11-14T21:00Z)  or\nas number of repetitions / start time / interval (e.g. R4/2017-11-14T21:00Z/PT3H) \nor a list of time values (e.g.\n2017-11-14T09:00Z,2017-11-14T12:00Z,2017-11-14T15:00Z,2017-11-14T18:00Z,2017-11-14T21:00Z)",
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string",
                "minItems": 1,
                "nullable": true,
                "example": [
                  [
                    "2020-11-12T12:15Z"
                  ],
                  [
                    "2020-11-12T12:15Z",
                    "2020-11-12T12:30Z",
                    "2020-11-12T12:45Z"
                  ],
                  [
                    "R12/2022-01-14T09:00Z/2022-01-15T09:00Z"
                  ],
                  [
                    "R12/2022-01-14T09:00Z/PT1H"
                  ],
                  [
                    "R12/2022-01-14T09:00Z/PT1H",
                    "R4/2022-01-14T21:00Z/PT3H",
                    "R4/2022-01-15T09:00Z/PT6H"
                  ]
                ]
              }
            },
            "trs": {
              "description": "Coordinate reference system of the coordinates in the temporal extent\n(property `interval`). The default reference system is the Gregorian calendar.\nIn the Core this is the only supported temporal coordinate reference system.\nExtensions may support additional temporal coordinate reference systems ",
              "type": "string",
              "example": "TIMECRS[\"DateTime\",TDATUM[\"Gregorian Calendar\"],CS[TemporalDateTime,1],AXIS[\"Time (T)\",future]]",
              "default": "http://www.opengis.net/def/uom/ISO-8601/0/Gregorian"
            },
            "name": {
              "description": "Name of the temporal coordinate reference system",
              "type": "string"
            }
          }
        },
        "vertical": {
          "description": "The vertical extent of the information in the collection.",
          "type": "object",
          "required": [
            "interval",
            "vrs"
          ],
          "properties": {
            "interval": {
              "description": "In the Core only a single time interval is supported. Extensions may support\nmultiple intervals. If multiple intervals are provided, the union of the\nintervals describes the vertical extent.",
              "type": "array",
              "minItems": 1,
              "items": {
                "description": "minimum and maximum heights of the vertical interval. The values are in the\nvertical coordinate reference system specified in `vrs`. By default\nthis is the vertical coordinate reference system of the source information.",
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "string",
                  "nullable": true
                },
                "example": [
                  [
                    "2",
                    "100"
                  ]
                ]
              }
            },
            "values": {
              "description": "Vertical level intervals that data in the collection is available at \nthese can be defined as follows:\nmin level / max level (e.g. \"2/100\") or \nas number of repetitions / start level / interval (e.g.\"R5/100/50\") \nor a list of vertical levels (e.g. \"2\",10,\"80\",\"100\"}\nThe value `null` is supported and indicates an open vertical interval.",
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string",
                "nullable": true,
                "example": [
                  [
                    "2/100"
                  ],
                  [
                    "R20/1000/-50"
                  ],
                  [
                    "2",
                    "10",
                    "80",
                    "100"
                  ]
                ]
              }
            },
            "vrs": {
              "description": "Coordinate reference system of the coordinates in the vertical extent\n(property `interval`). ",
              "type": "string",
              "example": "VERTCS[\"WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PARAMETER[\"Vertical_Shift\",0.0],PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0]],AXIS[\"Up\",UP]",
              "default": "VERTCS[\"WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PARAMETER[\"Vertical_Shift\",0.0],PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0]],AXIS[\"Up\",UP]"
            },
            "name": {
              "description": "Name of the vertical coordinate reference system",
              "type": "string"
            }
          }
        }
      }
    },
    "properties": {
      "type": "object",
      "required": [
        "type",
        "title",
        "description",
        "contacts",
        "created"
      ],
      "properties": {
        "type": {
          "type": "string",
          "description": "The nature or genre of the resource. The value should be a code, convenient for filtering records. Where available, a link to the canonical URI of the record type resource will be added to the 'links' property.",
          "maxLength": 64
        },
        "title": {
          "type": "string",
          "description": "A human-readable name given to the resource."
        },
        "description": {
          "type": "string",
          "description": "A free-text account of the resource."
        },
        "keywords": {
          "type": "array",
          "description": "The topic or topics of the resource. Typically represented using free-form keywords, tags, key phrases, or classification codes.",
          "items": {
            "type": "string"
          }
        },
        "themes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "concepts",
              "scheme"
            ],
            "properties": {
              "concepts": {
                "type": "array",
                "description": "One or more entity/concept identifiers from this knowledge system. it is recommended that a resolvable URI be used for each entity/concept identifier.",
                "minItems": 1,
                "items": {
                  "type": "object",
                  "required": [
                    "id"
                  ],
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "An identifier for the concept."
                    },
                    "title": {
                      "type": "string",
                      "description": "A human readable title for the concept."
                    },
                    "description": {
                      "type": "string",
                      "description": "A human readable description for the concept."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URI providing further description of the concept."
                    }
                  }
                }
              },
              "scheme": {
                "type": "string",
                "description": "An identifier for the knowledge organization system used to classify the resource.  It is recommended that the identifier be a resolvable URI.  The list of schemes used in a searchable catalog can be determined by inspecting the server's OpenAPI document or, if the server implements CQL2, by exposing a queryable (e.g. named `scheme`) and enumerating the list of schemes in the queryable's schema definition."
              }
            }
          }
        },
        "contacts": {
          "type": "array",
          "minItems": 1,
          "items": {
            "allOf": [
              {
                "required": [
                  "organization"
                ],
                "additionalProperties": false,
                "type": "object",
                "description": "Identification of, and means of communication with, person responsible\nfor the resource.",
                "anyOf": [
                  {
                    "required": [
                      "name"
                    ]
                  },
                  {
                    "required": [
                      "organization"
                    ]
                  }
                ],
                "properties": {
                  "identifier": {
                    "type": "string",
                    "description": "A value uniquely identifying a contact."
                  },
                  "name": {
                    "type": "string",
                    "description": "The name of the responsible person."
                  },
                  "position": {
                    "type": "string",
                    "description": "The name of the role or position of the responsible person taken from the organization's formal organizational hierarchy or chart."
                  },
                  "organization": {
                    "type": "string",
                    "description": "Organization/affiliation of the contact."
                  },
                  "logo": {
                    "description": "Graphic identifying a contact. The link relation should be `icon` and the media type should be an image media type.",
                    "allOf": [
                      {
                        "type": "object",
                        "required": [
                          "href",
                          "rel"
                        ],
                        "properties": {
                          "href": {
                            "type": "string",
                            "example": "http://data.example.com/buildings/123"
                          },
                          "rel": {
                            "type": "string",
                            "example": "alternate"
                          },
                          "type": {
                            "type": "string",
                            "example": "application/geo+json"
                          },
                          "hreflang": {
                            "type": "string",
                            "example": "en"
                          },
                          "title": {
                            "type": "string",
                            "example": "Trierer Strasse 70, 53115 Bonn"
                          },
                          "length": {
                            "type": "integer"
                          }
                        }
                      },
                      {
                        "type": "object",
                        "required": [
                          "rel",
                          "type"
                        ],
                        "properties": {
                          "rel": {
                            "enum": [
                              "icon"
                            ]
                          }
                        }
                      }
                    ]
                  },
                  "phones": {
                    "type": "array",
                    "description": "Telephone numbers at which contact can be made.",
                    "items": {
                      "type": "object",
                      "required": [
                        "value"
                      ],
                      "properties": {
                        "value": {
                          "type": "string",
                          "description": "The value is the phone number itself.",
                          "pattern": "^\\+[1-9]{1}[0-9]{3,14}$",
                          "example": "+14165550142"
                        },
                        "roles": {
                          "description": "The type of phone number (e.g. home, work, fax, etc.).",
                          "$ref": "#/properties/properties/properties/contacts/items/allOf/0/properties/roles"
                        }
                      }
                    }
                  },
                  "emails": {
                    "type": "array",
                    "description": "Email addresses at which contact can be made.",
                    "items": {
                      "type": "object",
                      "required": [
                        "value"
                      ],
                      "properties": {
                        "value": {
                          "type": "string",
                          "description": "The value is the email number itself.",
                          "format": "email"
                        },
                        "roles": {
                          "description": "The type of email (e.g. home, work, etc.).",
                          "$ref": "#/properties/properties/properties/contacts/items/allOf/0/properties/roles"
                        }
                      }
                    }
                  },
                  "addresses": {
                    "type": "array",
                    "description": "Physical location at which contact can be made.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "deliveryPoint": {
                          "type": "array",
                          "description": "Address lines for the location.",
                          "items": {
                            "type": "string"
                          }
                        },
                        "city": {
                          "type": "string",
                          "description": "City for the location."
                        },
                        "administrativeArea": {
                          "type": "string",
                          "description": "State or province of the location."
                        },
                        "postalCode": {
                          "type": "string",
                          "description": "ZIP or other postal code."
                        },
                        "country": {
                          "type": "string",
                          "description": "Country of the physical address.  ISO 3166-1 is recommended."
                        },
                        "roles": {
                          "description": "The type of address (e.g. office, home, etc.).",
                          "$ref": "#/properties/properties/properties/contacts/items/allOf/0/properties/roles"
                        }
                      }
                    }
                  },
                  "links": {
                    "type": "array",
                    "description": "On-line information about the contact.",
                    "items": {
                      "allOf": [
                        {
                          "$ref": "#/properties/properties/properties/contacts/items/allOf/0/properties/logo/allOf/0"
                        },
                        {
                          "type": "object",
                          "required": [
                            "type"
                          ]
                        }
                      ]
                    }
                  },
                  "hoursOfService": {
                    "type": "string",
                    "description": "Time period when the contact can be contacted.",
                    "example": "Hours: Mo-Fr 10am-7pm Sa 10am-22pm Su 10am-21pm"
                  },
                  "contactInstructions": {
                    "type": "string",
                    "description": "Supplemental instructions on how or when to contact the\nresponsible party."
                  },
                  "roles": {
                    "description": "The set of named duties, job functions and/or permissions associated with this contact. (e.g. developer, administrator, etc.).",
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "string"
                    }
                  }
                }
              }
            ]
          }
        },
        "version": {
          "type": "string",
          "description": "The version or edition of a given dataset."
        },
        "externalIds": {
          "type": "array",
          "description": "An identifier for the resource assigned by an external (to the catalog) entity.",
          "items": {
            "type": "object",
            "properties": {
              "scheme": {
                "type": "string",
                "description": "A reference to an authority or identifier for a knowledge organization system from which the external identifier was obtained.  It is recommended that the identifier be a resolvable URI."
              },
              "value": {
                "type": "string",
                "description": "The value of the identifier."
              }
            },
            "required": [
              "value"
            ]
          }
        },
        "created": {
          "type": "string",
          "description": "Date of creation of this record.",
          "format": "date-time"
        },
        "updated": {
          "type": "string",
          "description": "The most recent date on which the record was changed.",
          "format": "date-time"
        },
        "wmo:dataPolicy": {
          "type": "string",
          "description": "The data policy definition as per the WMO Unified Data Policy Resolution (Res.1) [23].",
          "enum": [
            "core",
            "recommended"
          ]
        },
        "rights": {
          "type": "string",
          "description": "A statement that concerns all rights not addressed by the license such as a copyright statement."
        },
        "wmo:status": {
          "description": "The operational status of a given dataset.",
          "$ref": "#/properties/properties/properties/themes/items/properties/concepts/items"
        }
      }
    },
    "links": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/definitions/Link"
      }
    },
    "linkTemplates": {
      "type": "array",
      "items": {
        "allOf": [
          {
            "type": "object",
            "properties": {
              "rel": {
                "type": "string",
                "description": "The type or semantics of the relation.",
                "example": "alternate"
              },
              "type": {
                "type": "string",
                "description": "A hint indicating what the media type of the result of dereferencing the link should be.",
                "example": "application/geo+json"
              },
              "hreflang": {
                "type": "string",
                "description": "A hint indicating what the language of the result of dereferencing the link should be.",
                "example": "en"
              },
              "title": {
                "type": "string",
                "description": "Used to label the destination of a link such that it can be used as a human-readable identifier.",
                "example": "Trierer Strasse 70, 53115 Bonn"
              },
              "length": {
                "type": "integer"
              },
              "created": {
                "type": "string",
                "description": "Date of creation of the resource pointed to by the link.",
                "format": "date-time"
              },
              "updated": {
                "type": "string",
                "description": "Most recent date on which the resource pointed to by the link was changed.",
                "format": "date-time"
              }
            }
          },
          {
            "type": "object",
            "required": [
              "uriTemplate"
            ],
            "properties": {
              "uriTemplate": {
                "type": "string",
                "description": "Supplies a resolvable URI to a remote resource (or resource fragment).",
                "example": "http://data.example.com/buildings/(building-id}"
              },
              "varBase": {
                "type": "string",
                "description": "The base URI to which the variable name can be appended to retrieve the definition of the variable as a JSON Schema fragment.",
                "format": "url"
              },
              "variables": {
                "type": "object",
                "description": "This object contains one key per substitution variable in the templated URL.  Each key defines the schema of one substitution variable using a JSON Schema fragment and can thus include things like the data type of the variable, enumerations, minimum values, maximum values, etc."
              }
            }
          }
        ]
      }
    }
  },
  "definitions": {
    "Link": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "https://raw.githubusercontent.com/wmo-im/wcmp2/main/schema/link.yaml",
      "title": "WCMP link object definition",
      "description": "WCMP link object definition",
      "type": "object",
      "required": [
        "href",
        "rel"
      ],
      "properties": {
        "rel": {
          "type": "string",
          "description": "The type or semantics of the relation.",
          "example": "alternate"
        },
        "type": {
          "type": "string",
          "description": "A hint indicating what the media type of the result of dereferencing the link should be.",
          "example": "application/geo+json"
        },
        "hreflang": {
          "type": "string",
          "description": "A hint indicating what the language of the result of dereferencing the link should be.",
          "example": "en"
        },
        "title": {
          "type": "string",
          "description": "Used to label the destination of a link such that it can be used as a human-readable identifier.",
          "example": "Trierer Strasse 70, 53115 Bonn"
        },
        "length": {
          "type": "integer"
        },
        "channel": {
          "type": "string",
          "description": "topic to subscribe to for broker workflow"
        },
        "security": {
          "type": "object",
          "patternProperties": {
            "^[a-zA-Z0-9\\.\\-_]+$": {
              "oneOf": [
                {
                  "$ref": "#/definitions/Schema_Reference"
                },
                {
                  "$ref": "#/definitions/Schema_SecurityScheme"
                }
              ]
            }
          }
        },
        "distribution": {
          "type": "object",
          "description": "the additional information qualifying the service and allowing to build and display the \"access\" information in a portal",
          "properties": {
            "availableFormats": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "available format short name."
                  },
                  "description": {
                    "type": "string",
                    "description": "the individual format description to allow building the portal information"
                  },
                  "numberOFiles": {
                    "type": "string",
                    "description": "typical number of files disseminated by the distribution mechanism over a period of time"
                  },
                  "typicalFilesize": {
                    "type": "string",
                    "description": "size of a typical individual file (e.g. KB, MB, GB)"
                  },
                  "typicalFilename": {
                    "type": "string",
                    "description": "example filename"
                  },
                  "samples": {
                    "description": "links of samples that can be openly accessed by users to provide a better understanding of the data",
                    "items": {
                      "type": "object",
                      "$ref": "#/properties/links/items/properties/distribution/properties/availableFormats/items/properties/documentation/items"
                    }
                  },
                  "documentation": {
                    "type": "array",
                    "description": "links to the associated documentation available for this format when applicable",
                    "items": {
                      "allOf": [
                        {
                          "type": "object",
                          "required": [
                            "rel"
                          ],
                          "properties": {
                            "rel": {
                              "type": "string",
                              "description": "The type or semantics of the relation.",
                              "example": "alternate"
                            },
                            "type": {
                              "type": "string",
                              "description": "A hint indicating what the media type of the result of dereferencing the link should be.",
                              "example": "application/geo+json"
                            },
                            "hreflang": {
                              "type": "string",
                              "description": "A hint indicating what the language of the result of dereferencing the link should be.",
                              "example": "en"
                            },
                            "title": {
                              "type": "string",
                              "description": "Used to label the destination of a link such that it can be used as a human-readable identifier.",
                              "example": "Trierer Strasse 70, 53115 Bonn"
                            },
                            "length": {
                              "type": "integer"
                            }
                          }
                        },
                        {
                          "type": "object",
                          "required": [
                            "href"
                          ],
                          "properties": {
                            "href": {
                              "type": "string",
                              "description": "The URI of the link target.",
                              "example": "http://data.example.com/buildings/123"
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "Schema_APIKeySecurityScheme": {
      "type": "object",
      "required": [
        "type",
        "name",
        "in"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "apiKey"
          ]
        },
        "name": {
          "type": "string"
        },
        "in": {
          "type": "string",
          "enum": [
            "header",
            "query",
            "cookie"
          ]
        },
        "description": {
          "type": "string"
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_AuthorizationCodeOAuthFlow": {
      "type": "object",
      "required": [
        "authorizationUrl",
        "tokenUrl"
      ],
      "properties": {
        "authorizationUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "tokenUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "refreshUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "scopes": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_ClientCredentialsFlow": {
      "type": "object",
      "required": [
        "tokenUrl"
      ],
      "properties": {
        "tokenUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "refreshUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "scopes": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_HTTPSecurityScheme": {
      "type": "object",
      "required": [
        "scheme",
        "type"
      ],
      "properties": {
        "scheme": {
          "type": "string"
        },
        "bearerFormat": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "enum": [
            "http"
          ]
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false,
      "oneOf": [
        {
          "description": "Bearer",
          "properties": {
            "scheme": {
              "enum": [
                "bearer"
              ]
            }
          }
        },
        {
          "description": "Non Bearer",
          "not": {
            "required": [
              "bearerFormat"
            ]
          },
          "properties": {
            "scheme": {
              "not": {
                "enum": [
                  "bearer"
                ]
              }
            }
          }
        }
      ]
    },
    "Schema_ImplicitOAuthFlow": {
      "type": "object",
      "required": [
        "authorizationUrl",
        "scopes"
      ],
      "properties": {
        "authorizationUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "refreshUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "scopes": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_OAuth2SecurityScheme": {
      "type": "object",
      "required": [
        "type",
        "flows"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "oauth2"
          ]
        },
        "flows": {
          "$ref": "#/definitions/Schema_OAuthFlows"
        },
        "description": {
          "type": "string"
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_OAuthFlows": {
      "type": "object",
      "properties": {
        "implicit": {
          "$ref": "#/definitions/Schema_ImplicitOAuthFlow"
        },
        "password": {
          "$ref": "#/definitions/Schema_PasswordOAuthFlow"
        },
        "clientCredentials": {
          "$ref": "#/definitions/Schema_ClientCredentialsFlow"
        },
        "authorizationCode": {
          "$ref": "#/definitions/Schema_AuthorizationCodeOAuthFlow"
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_OpenIdConnectSecurityScheme": {
      "type": "object",
      "required": [
        "type",
        "openIdConnectUrl"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "openIdConnect"
          ]
        },
        "openIdConnectUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "description": {
          "type": "string"
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_PasswordOAuthFlow": {
      "type": "object",
      "required": [
        "tokenUrl"
      ],
      "properties": {
        "tokenUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "refreshUrl": {
          "type": "string",
          "format": "uri-reference"
        },
        "scopes": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "patternProperties": {
        "^x-": {}
      },
      "additionalProperties": false
    },
    "Schema_Reference": {
      "type": "object",
      "required": [
        "$ref"
      ],
      "patternProperties": {
        "^\\$ref$": {
          "type": "string",
          "format": "uri-reference"
        }
      }
    },
    "Schema_SecurityScheme": {
      "oneOf": [
        {
          "$ref": "#/definitions/Schema_APIKeySecurityScheme"
        },
        {
          "$ref": "#/definitions/Schema_HTTPSecurityScheme"
        },
        {
          "$ref": "#/definitions/Schema_OAuth2SecurityScheme"
        },
        {
          "$ref": "#/definitions/Schema_OpenIdConnectSecurityScheme"
        }
      ]
    }
  }
}

Annex C: Examples (Informative)

C.1. WMO Core Metadata Profile Examples

Example: Canadian Hourly Surface Weather Observations (dataset)
{
    "id": "urn:wmo:md:ca-eccc-msc:weather.observations.swob-realtime",
    "conformsTo": [
        "http://wis.wmo.int/spec/wcmp/2/conf/core"
    ],
    "time": {
        "interval": [
            "2010-11-11T11:11:11Z",
            ".."
        ]
    },
    "type": "Feature",
    "geometry": {
        "type": "Polygon",
        "coordinates": [
            [
                [
                    -142,
                    28
                ],
                [
                    -142,
                    82
                ],
                [
                    -52,
                    82
                ],
                [
                    -52,
                    28
                ],
                [
                    -142,
                    28
                ]
            ]
        ]
    },
    "properties": {
        "title": "Surface Weather Observations",
        "description": "Surface Observations measured at the automatic and manual stations of the Environment and Climate Change Canada and partners networks, either for a single station, or for the stations of specific provinces and territories (last 30 days)",
        "themes": [
            {
                "concepts": [
                    {
                        "id": "Weather"
                    },
                    {
                        "id": "Archives"
                    },
                    {
                        "id": "Precipitation"
                    },
                    {
                        "id": "Air temperature"
                    },
                    {
                        "id": "Humidity"
                    },
                    {
                        "id": "Snow"
                    },
                    {
                        "id": "Wind"
                    },
                    {
                        "id": "Meteorological data"
                    }
                ],
                "scheme": "https://canada.multites.net/cst"
            },
            {
                "concepts": [
                    {
                        "id": "weather",
                        "title": "Weather",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/weather"
                    }
                ],
                "scheme": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline"
            }
        ],
        "contacts": [
            {
                "name": "National Inquiry Response Team",
                "organization": "Government of Canada; Environment and Climate Change Canada; Meteorological Service of Canada",
                "phones": [
                    {
                        "value": "+18199972800"
                    }
                ],
                "emails": [
                    {
                        "value": "enviroinfo@ec.gc.ca"
                    }
                ],
                "addresses": [
                    {
                        "deliveryPoint": [
                            "77 Westmorland Street, suite 260"
                        ],
                        "city": "Fredericton",
                        "administrativeArea": "NB",
                        "postalCode": "E3B 6Z4",
                        "country": "Canada"
                    }
                ],
                "links": [
                    {
                        "rel": "about",
                        "type": "text/html",
                        "href": "https://www.canada.ca/en/environment-climate-change.html"
                    }
                ],
                "roles": [
                    "host",
                    "producer"
                ]
            }
        ],
        "type": "dataset",
        "created": "2018-01-01T00:11:32Z",
        "updated": "2022-06-22T08:23:42Z",
        "wmo:dataPolicy": "core"
    },
    "links": [
        {
            "rel": "stations",
            "href": "https://dd.weather.gc.ca/observations/doc/swob-xml_station_list.csv",
            "type": "text/csv",
            "title": "Stations associated with this dataset"
        },
        {
            "rel": "data",
            "href": "https://dd.weather.gc.ca/observations/swob-ml",
            "type": "text/html",
            "hreflang": "en",
            "title": "Raw data download (XML files)",
            "distribution": {
                "availableFormats": [
                    {
                        "name": "XML"
                    }
                ]
            }
        },
        {
            "rel": "items",
            "href": "https://api.weather.gc.ca/collections/swob-realtime/items",
            "type": "application/geo+json",
            "title": "Data access API interface"
        },
        {
            "rel": "about",
            "href": "https://eccc-msc.github.io/open-data/msc-data/obs_station/readme_obs_insitu_swobdatamart_en",
            "type": "text/html",
            "title": "Documentation"
        },
        {
            "rel": "items",
            "href": "mqtts://everyone:everyone@globalbroker.meteo.fr:8883",
            "channel": "origin/a/wis2/ca-eccc-msc/data/core/weather/surface-based-observations/synop",
            "type": "application/geo+json",
            "title": "Data notifications"
        }
    ]
}
Example: ICON-EPS GRIB data (dataset)
{
    "id": "urn:wmo:md:de-dwd:icon-eps.ALL",
    "type": "Feature",
    "conformsTo": [
        "http://wis.wmo.int/spec/wcmp/2/conf/core"
    ],
    "time": {
        "interval": [
            "2018-04-22",
            ".."
        ]
    },
    "geometry": {
        "type": "Polygon",
        "coordinates": [
            [
                [
                    -180,
                    -90
                ],
                [
                    -180,
                    90
                ],
                [
                    180,
                    90
                ],
                [
                    180,
                    -90
                ],
                [
                    -180,
                    -90
                ]
            ]
        ]
    },
    "additionalExtents": {
        "spatial": {
            "bbox": [
                [
                    -180,
                    -90,
                    180,
                    90
                ]
            ],
            "resolution": "0.5*0.5",
            "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84"
        },
        "temporal": {
            "interval": [
                [
                    "T00Z",
                    "PT180H"
                ],
                [
                    "T12Z",
                    "PT180H"
                ]
            ],
            "resolution": "PT6H",
            "trs": "http://www.opengis.net/def/trs/ISO-8601"
        }
    },
    "properties": {
        "type": "dataset",
        "title": "Global Ensemble Prediction Model",
        "description": "ICON-EPS 0.5 deg x 0.5 deg regular lat/lon grid, up to +180h every 6h, runs 00/12 UTC, various parameter, various level, various threshold",
        "themes": [
            {
                "concepts": [
                    {
                        "id": "meteorology"
                    }
                ],
                "scheme": "http://wis.wmo.int/2012/codelists/WMOCodeLists#WMO_CategoryCode"
            },
            {
                "concepts": [
                    {
                        "id": "Meteorological geographical features"
                    }
                ],
                "scheme": "https://inspire.ec.europa.eu/theme/mf"
            },
            {
                "concepts": [
                    {
                        "id": "FM 92 GRIB edition 2"
                    }
                ],
                "scheme": "https://codes.wmo.int/grib2"
            },
            {
                "concepts": [
                    {
                        "id": "continual"
                    }
                ],
                "scheme": "https://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_FrequencyCode"
            },
            {
                "concepts": [
                    {
                        "id": "weather",
                        "title": "Weather",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/weather"
                    }
                ],
                "scheme": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline"
            }
        ],
        "contacts": [
            {
                "identifier": "DWD",
                "organization": "Deutscher Wetterdienst",
                "name": "Michael Denhard",
                "emails": [
                    {
                        "value": "wis@dwd.de"
                    }
                ],
                "addresses": [
                    {
                        "deliveryPoint": [
                            "Frankfurter Strasse 135"
                        ],
                        "city": "Offenbach",
                        "postalCode": "63067",
                        "country": "Germany"
                    }
                ],
                "links": [
                    {
                        "rel": "about",
                        "type": "text/html",
                        "href": "https://www.dwd.de/wmc"
                    },
                    {
                        "rel": "about",
                        "type": "text/html",
                        "href": "https://gisc.dwd.de"
                    }
                ],
                "contactInstructions": "email",
                "roles": [
                    "host",
                    "producer"
                ]
            }
        ],
        "created": "2018-08-19T08:10:00Z",
        "updated": "2023-12-01T00:00:00Z",
        "wmo:dataPolicy": "core",
        "keywords": [
            "CLCH",
            "CLCL",
            "CLCM",
            "CLCT",
            "cloud",
            "MSLP",
            "Probability of temperature anomalies",
            "cape",
            "dew point",
            "geopotential height",
            "maximum temperature 2m",
            "minimum temperature 2m",
            "precipitation",
            "snow",
            "snowfall",
            "soil temperature",
            "temperature",
            "wind gusts 10m",
            "wind speed",
            "wind speed 10m"
        ],
        "externalIds": [
            {
                "scheme": "DWD",
                "value": "de.dwd.icon-eps.ALL"
            }
        ],
        "language": "eng",
        "formats": [
            "GRIB2"
        ]
    },
    "links": [
        {
            "rel": "data",
            "type": "text/html",
            "title": "Open Data Server DWD",
            "href": "https://opendata.dwd.de/weather/wmc/icon-eps/data/grib"
        },
        {
            "rel": "items",
            "channel": "origin/a/wis2/de-dwd/data/core/weather/prediction/forecast/medium-range",
            "href": "mqtts://everyone:everyone@example.org:8883",
            "type": "application/geo+json",
            "title": "Data notifications"
        }
    ]
}
Example: WIS2 Global Broker (service)
{
    "id": "urn:wmo:md:fr-meteo-france:global-broker",
    "type": "Feature",
    "conformsTo": [
        "http://wis.wmo.int/spec/wcmp/2/conf/core"
    ],
    "time": null,
    "geometry": {
        "type": "Polygon",
        "coordinates": [
            [
                [
                    -180,
                    -90
                ],
                [
                    -180,
                    90
                ],
                [
                    180,
                    90
                ],
                [
                    180,
                    -90
                ],
                [
                    -180,
                    -90
                ]
            ]
        ]
    },
    "properties": {
        "type": "service",
        "title": "WIS2 Broker - M\u00e9t\u00e9o-France",
        "description": "TODO",
        "themes": [
            {
                "concepts": [
                    {
                        "id": "weather",
                        "title": "Weather",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/weather"
                    },
                    {
                        "id": "climate",
                        "title": "Climate",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/climate"
                    },
                    {
                        "id": "hydrology",
                        "title": "Hydrology",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/hydrology"
                    },
                    {
                        "id": "atmospheric-composition",
                        "title": "Atmospheric Composition",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/atmospheric-composition"
                    },
                    {
                        "id": "cryosphere",
                        "title": "Cryosphere",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/cryosphere"
                    },
                    {
                        "id": "ocean",
                        "title": "Ocean",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/ocean"
                    },
                    {
                        "id": "space-weather",
                        "title": "Space Weather",
                        "url": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline/space-weather"
                    }
                ],
                "scheme": "https://codes.wmo.int/wis/topic-hierarchy/earth-system-discipline"
            },
            {
                "concepts": [
                    {
                        "id": "global-broker",
                        "title": "Global Broker",
                        "url": "https://codes.wmo.int/wis/service-types/global-broker"
                    }
                ],
                "scheme": "https://codes.wmo.int/wis/service-types"
            }
        ],
        "contacts": [
            {
                "identifier": "meteo-france",
                "organization": "M\u00e9t\u00e9o-France",
                "name": "David Podeur",
                "emails": [
                    {
                        "value": "gisc_support@meteo.fr"
                    }
                ],
                "addresses": [
                    {
                        "deliveryPoint": [
                            "42 Avenue Coriolis"
                        ],
                        "city": "Toulouse",
                        "postalCode": "31057",
                        "country": "France"
                    }
                ],
                "links": [
                    {
                        "rel": "about",
                        "type": "text/html",
                        "href": "https://donneespubliques.meteofrance.fr"
                    }
                ],
                "contactInstructions": "email",
                "roles": [
                    "host"
                ]
            }
        ],
        "created": "2022-11-11T11:00:00Z",
        "keywords": [
            "wis2",
            "global discovery catalogue",
            "metadata"
        ]
    },
    "links": [
        {
            "rel": "items",
            "type": "application/geo+json",
            "title": "WMO WIS2 Global Broker - M\u00e9t\u00e9o-France",
            "href": "mqtts://everyone:everyone@example.org:8883",
            "channel": "cache/a/wis2/#",
            "distribution": {
                "maxMSGsize": 4096,
                "unit": "bytes"
            }
        },
        {
            "rel": "related",
            "type": "application/json",
            "title": "WMO WIS Global Broker - China Meteorological Administration",
            "href": "mqtts://everyone:everyone@example.org:8883",
            "channel": "cache/a/wis2/#",
            "distribution": {
                "maxMSGsize": 4096,
                "unit": "bytes"
            }
        }
    ]
}

Annex D: Codelists (Informative)

D.1. Dataset status

The links below provide some controlled vocabularies in support of dataset status, and may be of use when encoding the properties.status property..

Annex E: Bibliography

Annex F: Revision History

Date Release Editor Primary clauses modified Description

2021-11-06

Template

Tom Kralidis

all

initial template


1. https://community.wmo.int/governance/commission-membership/commission-observation-infrastructures-and-information-systems-infcom/commission-infrastructure-officers/infcom-management-group/standing-committee-information-management-and-technology-sc-imt/expert-team-metadata-0
2. https://community.wmo.int/governance/commission-membership/commission-observation-infrastructures-and-information-systems-infcom/commission-infrastructure-national-representatives/infcom-management-group/standing-committee-information-management-and-technology-sc-imt/et-metadata
3. https://community.wmo.int/governance/commission-membership/commission-observation-infrastructures-and-information-systems-infcom/commission-infrastructure-officers/infcom-management-group/standing-committee-information-management-and-technology-sc-imt
4. https://community.wmo.int/governance/commission-membership/infcom
5. https://ogcapi.ogc.org/records
6. https://datatracker.ietf.org/doc/html/rfc7946
7. https://www.w3.org/TR/dwbp
8. https://www.w3.org/TR/sdw-bp
9. https://en.wikipedia.org/wiki/FAIR_data
10. https://library.wmo.int/doc_num.php?explnum_id=11113#page=9
11. https://library.wmo.int/doc_num.php?explnum_id=10109
12. https://docs.ogc.org/DRAFTS/20-004.html
13. https://docs.opengeospatial.org/is/17-069r4/17-069r4.html
14. https://datatracker.ietf.org/doc/html/rfc7946
15. https://datatracker.ietf.org/doc/html/rfc8259
16. https://www.w3.org/TR/sdw-bp
17. https://www.w3.org/TR/dwbp
18. https://www.w3.org/TR/vocab-dcat
19. https://www.iana.org/assignments/link-relations/link-relations.xml
20. https://www.iana.org/assignments/media-types/media-types.xhtml
21. https://spdx.org/licenses
22. https://json-schema.org
23. https://github.com/wmo-im/wis2-topic-hierarchy
24. https://github.com/OAI/OpenAPI-Specification/blob/3.1.0/versions/3.1.0.md
25. https://wmo-im.github.io/wis2-guide/guide/wis2-guide-DRAFT.html
26. https://json-schema.org
27. https://en.wikipedia.org/wiki/YAML
28. https://github.com/wmo-im/wcmp/issues/107
29. https://gisc.dwd.de/wis2.0/WIS_2.0_final.mp4
30. https://library.wmo.int/idurl/4/58009
32. https://doi.org
33. https://arks.org
34. https://handle.net
35. https://library.wmo.int/idurl/4/58009
37. https://www.iana.org/assignments/link-relations/link-relations.xhtml
38. https://codes.wmo.int/wis/link-type