World Meteorological Organization |
Date: 2025-11-14 |
Version: 2.0.dev0 |
Document status: DRAFT |
Document location: https://wmo-im.github.io/wmdr2/standard/wmdr2-DRAFT.html |
WMO publication location: TODO |
Task Team on WIGOS Metadata (TT-WIGOSMD)[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 © 2025 World Meteorological Organization (WMO) |
- 1. Scope
- 2. Conformance
- 3. References
- 4. Terms and definitions
- 5. Conventions
- 6. Introduction
- 7. WIGOS Metadata Representation (Version 2)
- 7.1. Requirements Class "Core"
- 7.1.1. Overview
- 7.1.2. WIGOS Metadata Representation representation
- 7.1.3. Validation
- 7.1.4. Identifier
- 7.1.5. Conformance
- 7.1.6. Geospatial extent
- 7.1.7. Properties / Contacts
- 7.1.8. Properties / Persistent identifiers
- 7.1.9. Properties / Record creation date
- 7.1.10. Properties / Record update date
- 7.1.11. Properties / WMO data policy
- 7.1.12. Links and distribution information
- 7.1.13. Additional properties
- 7.2. WMO Core Metadata Profile resources
- 7.1. Requirements Class "Core"
- 8. Cataloguing considerations
- Annex A: Conformance Class Abstract Test Suite (Normative)
- Annex B: Schemas (Normative)
- Annex C: Examples (Informative)
- Annex D: Codelists (Informative)
- Annex E: Bibliography
- Annex F: Revision History
i. Abstract
TODO opening overview.
This document defines the content, structure, and encoding for the WIGOS Metadata Representation (WMDR). This standard is a profile and extension of the OGC API - Records standard [5].
TODO high level scope, 1 sentence.
WMDR 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, wigos, station, instrument, 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 WIGOS Global Station Catalogue (GSC).
The WIGOS Metadata Representation (WMDR) standard defined herein is an extension of the International Standard OGC API - Records - Part 1: Core.
WMDR station metadata records shall be encoded as GeoJSON as defined in OGC API - Records - Part 1: Core.
The primary purpose of WMDR is to describe stations, or observing facilities. Services and APIs operating on resources may be represented as part of their own metadata or associated through WCMP links.
WMDR station metadata record provides descriptions at the granularity level of a station, or observing facilty. Dataset discovery metadata are supported by the Manual on the WMO Information System, Volume II - WMO Information System 2.0 [11].
This specification defines the conformance requirements for the WIGOS Metadata Representation. 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 station metadata records published within the WIGOS Global Station Catalogue (GSC) are required to comply with the WIGOS Metadata Representation (WMDR). WMDR station 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 WMDR station 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 WMDR is:
-
"WIGOS Metadata Representation 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 WMDR. 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 Format (2017) [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]
-
Manual on the WMO Information System, Volume II - WMO Information System 2.0 (2025) [23]
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
| 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 |
GSC |
Global Station Catalogue |
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 |
OSCAR |
Observing Systems Capability Analysis and Review Tool |
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 |
WIGOS |
WMO Integrated Global Observing System |
WIS |
WMO Information System |
WMDR |
WIGOS Metadata Representation |
WMO |
World Meteorological Organization |
WSI |
WIGOS Station Identifier |
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/wmdr/2.0.0/examples
5.3. Schemas
The WMDR schema can be found at https://schemas.wmo.int/wmdr/2.0.0/schemas/wmdr2-bundled.json
5.4. Schema representation
JSON Schema [24] objects are used throughout this standard to define the structure of metadata records. These schema objects are also typically represented using YAML [25]. YAML is a superset of JSON, and in this standard are regarded as equivalent.
Metadata record instances are always represented as JSON.
6. Introduction
6.1. Overview
TODO
6.1.2. Station metadata design considerations
The following describes envisioned workflows of WMDR in the context of station metadata publication and search.
-
Flexible metadata publishing mechanisms so providers can publish station metadata in the easiest and most efficient way possible.
-
Basic, HTTP crawlable metadata files (filesystem, object storage). For example, publishing station 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 WIGOS Global Station Catalogue, with the idea that search engines can index from the authoritative source.
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 WIGOS Global Station Catalogue (GSC)
The GSC will provide a central search endpoint, enabling users to traverse, browse and search station metadata holdings in OSCAR. 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 WIGOS Global Station Catalogue, WMDR provides a standards-based, clear and well-defined information model to facilitate the management and discovery of data within WIGOS.
7. WIGOS Metadata Representation (Version 2)
WIGOS Metadata Representation (WMDR) is an extension of the OGC API – Records standard and shall be encoded in GeoJSON. The normative provisions in WMDR (version 2) are denoted by the base URI (http://wis.wmo.int/spec/wmdr/2) and requirements are denoted by partial URIs relative to this base. Property names, values and examples are represented with shaded text in this document.
7.1. Requirements Class "Core"
URI |
|
Target type |
Station metadata |
Dependency |
The JavaScript Object Notation (JSON) Data Interchange Format (IETF RFC8259 (2017)) |
Dependency |
JSON Schema (2022) |
Dependency |
The GeoJSON Format (IETF: RFC-7946 (2016)) |
Dependency |
OGC API - Features - Part 1: Core corrigendum (OGC: OGC 17-069r) |
Preconditions |
The record conforms to the Requirements Class “Record Core” of OGC API - Records - Part 1: Core |
7.1.1. Overview
The table below provides an overview of the set of properties that may be included in a WMDR.
| Property | Requirement | Description |
|---|---|---|
|
Required |
A unique identifier of the station/platform (see TODO) |
|
Required |
A fixed value denoting the WMDR as a GeoJSON |
|
Required |
The version of WMDR associated to which the record conforms (see TODO) |
|
Required |
Geospatial location associated with the dataset, in a geographic coordinate reference system (see TODO) |
|
Optional |
Persistent identifiers or handles for the dataset (see TODO) |
|
Required |
The date that the WMDR was created (see TODO) |
|
Optional |
The date that the WMDR was updated (see TODO) |
|
Required |
Contact information for the dataset (see TODO) |
7.1.2. WIGOS Metadata Representation representation
A WMDR can be represented in various ways internally, in WIGOS systems and software tools, but its external representation is GeoJSON.
Recommendation 1 |
/rec/core/media_type |
A |
The media type assigned to a WMDR, when transported through a protocol that supports it, SHOULD be |
7.1.3. Validation
The WMDR schema is based on the Requirements Class "Record Core" of OGC API – Records – Part 1: Core schema and the associated information model. WMDRs compliant with the WMDR schema are therefore compliant with the OGC API – Records record schema.
Requirement 1 |
/req/core/validation |
A |
Each WMDR SHALL validate without error against the WMDR schema. |
B |
Each WMDR SHALL provide id (see TODO), type (see TODO), geometry (see TODO) and properties (see, for example, TODO) for GeoJSON compliance. |
C |
The |
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 Global Discovery Catalogue (GDC).
"id": "urn:wmo:md:ca-eccc-msc:observations.swob"
Requirement 2 |
/req/core/identifier |
A |
A WMDR SHALL provide an identifier via the |
B |
The |
7.1.5. Conformance
The conformsTo property identifies the version of the WMDR standard to which the metadata record conforms. Conformance identification is valuable for version
detection and handling of content.
"conformsTo": [
"http://wis.wmo.int/spec/wmdr/2/conf/core"
]
Requirement 3 |
/req/core/conformance |
A |
A WMDR SHALL provide information on conformance via the OGC API – Records (OARec) record |
B |
The |
7.1.6. Geospatial extent
The geometry property is the location of the station/platform in the geographic coordinate system. , and provides a useful indicator of the location of the station/platform to facilitate search and map displays in the GSC.
"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 4 |
/req/core/extent_geospatial |
A |
A WMDR SHALL provide one |
B |
The |
C |
The |
Recommendation 2 |
/rec/core/extent_geospatial_point |
A |
For datasets based on a geometry without a calculated area (for example, a single station point), a WMDR SHOULD provide the GeoJSON geometry as a |
Recommendation 3 |
/rec/core/extent_geospatial_precision |
A |
Geometry coordinates SHOULD have a level of precision of at least two or more decimal places. |
Permission 1 |
/per/core/extent_geospatial |
A |
The |
7.1.7. Properties / Contacts
The contacts property is the information associated with one or more parties responsible for the resource.
"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"]
}]
...
}
"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 5 |
/req/core/contacts |
A |
A WMDR SHALL provide at least one contact via the |
B |
The |
C |
The |
Permission 2 |
/per/core/contacts |
A |
The |
7.1.8. 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:
"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"
}]
...
}
"links": [
{
"rel": "cite-as",
"title": "Cite as: WMO/GAW Ozone Monitoring Community, World Meteorological Organization-Global Atmosphere Watch Programme (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 4 |
/rec/core/pids |
A |
A WMDR SHOULD provide persistent identifier references via items in the |
Permission 3 |
/per/core/pids |
A |
A WMDR MAY provide a persistent identifier to cite research or for resource identification, using a persistent identifier scheme/framework. |
B |
A WMDR MAY provide a persistent identifier as a link object with |
7.1.9. Properties / Record creation date
The created property is a single date, being the date that the WMDR was created. Note that this date is not related to any aspect of the station/platform.
"properties": {
...
"created": "2021-06-12T23:45:24Z"
...
}
Requirement 6 |
/req/core/record_creation_date |
A |
A WMDR SHALL provide a single |
B |
The |
7.1.10. Properties / Record update date
The created property is a single date, being the date that the WMDR was created. Note that this date not related to any aspect of the station/platform.
"properties": {
...
"updated": "2022-06-12T18:52:39Z"
...
}
Recommendation 5 |
/rec/core/record_update_date |
A |
A WMDR SHOULD provide a |
7.1.11. Properties / WMO data policy
The wmo:dataPolicy property is a codelist that identifies the classification of the dataset exchange as described by the WMO Unified Data Policy (Resolution 1 (Cg-Ext(2021)))[26] for the international exchange of Earth system data. The code list 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 TODO), providing access, license and attribution details as required. Conditions on use of the data should be indicated for transparency and clarification.
"properties": {
...
"wmo:dataPolicy": "core"
...
}
"properties": {
...
"wmo:dataPolicy": "recommended"
...
}
It is useful to add provider-specific details to have the most detailed information about data policy and additional conditions.
"properties": {
...
"wmo:dataPolicy": "recommended"
...
},
"links": [{
"rel": "license",
"href": "https://example.org/license",
"type": "text/html",
"title": "EUMETSAT DATA LICENSING"
}]
"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 addressed by a license, the rights property can be used as follows:
"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 7 |
/req/core/data_policy |
A |
The |
B |
When the |
Recommendation 6 |
/rec/core/data_policy_conditions |
A |
Additional conditions represented by a |
B |
To express any conditions on use of a given dataset, the |
C |
For core data or recommended data compatible with free and unrestricted principles, 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 |
Permission 4 |
/per/core/data_policy |
A |
For core data (when |
B |
For core data (when |
C |
For core data (when |
D |
For core data (when |
7.1.13. Additional properties
A WMDR can be extended as required for organizational purposes by adding properties (of any type) in the record. Additional properties do not render a record non-compliant with WMDR.
"properties": {
...
"approvalStatus": "approved"
"_comment": {
"validationErrors": [
"error 1",
"error 2"
]
}
...
}
Permission 5 |
/per/core/additional_properties |
A |
A WMDR MAY provide additional properties of any type in any part of the document as needed. |
7.2. WMO Core Metadata Profile resources
7.2.2. WMO schemas server
Validation schemas, examples and other resources are published at https://schemas.wmo.int/wmdr.
8. Cataloguing considerations
In addition to documenting and describing WIGOS metadata holdings, WMDR station metadata will be searchable via the WIGOS Global Station Catalogue (GSC). As part of discovery and search workflow, a GSC may choose to apply filters to help narrow search results. This is realized by the API of the GSC, as well as applying facets in the catalogue.
Annex A: Conformance Class Abstract Test Suite (Normative)
A.1. Conformance Class: Core
- label
- subject
-
Requirements Class "core"
- classification
-
Target Type:Station Metadata
A.1.1. Validation
- label
-
/conf/core/validation
- subject
-
/req/core/validation
- test-purpose
-
Validate that a WMDR is valid to the authoritative WMDR schema.
Run JSON Schema validation on the WMDR against the WMDR authoritative schema.
A.1.2. Identifier
- label
-
/conf/core/identifier
- subject
-
/req/core/identifier
- test-purpose
-
Validate that a WMDR has a valid identifier.
Check for the existence of an id property in the WMDR.
In the WMDR’s id property, check that there are at least five tokens, delimited by :.
In the WMDR’s id property, delimiting the value on :, check that the first three tokens are equal to ['urn', 'wmo', 'md'].
In the WMDR’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 WMDR’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 WMDR provides valid conformance information.
Check for the existence of a conformsTo property in the WMDR.
In the WMDR’s conformsTo array property, check that ONE of the values is equal to http://wis.wmo.int/spec/wmdr/2/conf/core.
A.1.4. Geospatial Extent
- label
-
/conf/core/extent_geospatial
- subject
-
/req/core/extent_geospatial
- test-purpose
-
Validate that a WMDR provides a valid geometry property.
Check for the existence of one geometry property in the WMDR.
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.5. Contacts
- label
-
/conf/core/contacts
- subject
-
/req/core/contacts
- test-purpose
-
Validate that a WMDR 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 WMDR.
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 WMDR contact role codelist.
A.1.6. Record Creation Date
- label
-
/conf/core/record_creation_date
- subject
-
/req/core/record_creation_date
- test-purpose
-
Validate that a WMDR provides a record creation date.
Check for the existence of one and only one properties.created property in the WMDR.
A.1.7. WMO Data Policy
- label
-
/conf/core/data_policy
- subject
-
/req/core/data_policy
- test-purpose
-
Validate that a WMDR provides information about data policy and, if applicable additional information about licensing and/or copyright.
Check for the type of WMDR (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 WMDR.
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 https://schemas.wmo.int/wmdr/2.0.0 once the standard has been approved. |
B.1. WIGOS Metadata Representation Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/wmo-im/wmdr2/main/schemas/wmdrRecordGeoJSON.yaml",
"title": "WMDR station metadata record definition",
"description": "WMDR station metadata record definition",
"required": [
"id",
"conformsTo",
"type",
"geometry",
"properties",
"links"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "A unique identifier of the catalog record."
},
"conformsTo": {
"type": "array",
"contains": {
"const": "http://wis.wmo.int/spec/wmdr/2/conf/core"
}
},
"type": {
"type": "string",
"enum": [
"Feature"
]
},
"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"
}
}
}
}
]
}
]
},
"properties": {
"type": "object",
"required": [
"contacts",
"created"
],
"properties": {
"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\nfrom 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`\nand the media type should be an image media type.",
"allOf": [
{
"type": "object",
"allOf": [
{
"$ref": "#/properties/linkTemplates/items/allOf/0"
},
{
"type": "object",
"required": [
"href"
],
"properties": {
"href": {
"type": "string",
"format": "uri"
}
}
}
]
},
{
"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}$"
},
"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."
},
"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\nassociated with this contact.\n(e.g. developer, administrator, etc.).",
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
}
]
}
},
"externalIds": {
"type": "array",
"description": "An identifier for the resource assigned by an\nexternal (to the catalog) entity.",
"items": {
"type": "object",
"properties": {
"scheme": {
"type": "string",
"description": "A reference to an authority or identifier\nfor a knowledge organization system from\nwhich the external identifier was obtained.\nIt is recommended that the identifier be a\nresolvable URI."
},
"value": {
"type": "string",
"description": "The value of the identifier."
}
},
"required": [
"value"
]
}
},
"created": {
"type": "string",
"description": "The date this record was created in the server.",
"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"
]
}
}
},
"links": {
"type": "array",
"minItems": 1,
"items": {
"$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"
],
"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": "https://data.example.com/buildings/123"
}
}
}
]
}
}
}
}
}
}
}
}
}
},
"linkTemplates": {
"type": "array",
"items": {
"allOf": [
{
"type": "object",
"properties": {
"rel": {
"type": "string",
"description": "The type or semantics of the relation."
},
"type": {
"type": "string",
"description": "A hint indicating what the media type of the\nresult of dereferencing the link should be."
},
"hreflang": {
"type": "string",
"description": "A hint indicating what the language of the\nresult of dereferencing the link should be."
},
"title": {
"type": "string",
"description": "Used to label the destination of a link\nsuch that it can be used as a human-readable\nidentifier."
},
"length": {
"type": "integer"
},
"profile": {
"type": "array",
"description": "One or more identifiers that provide information about additional\nsemantics (constraints, conventions, extensions), in addition to \nthose defined by the media type, that are associated with the\ntarget resource.",
"items": {
"type": "string"
}
},
"created": {
"type": "string",
"description": "Date of creation of the resource pointed to\nby the link.",
"format": "date-time"
},
"updated": {
"type": "string",
"description": "Most recent date on which the resource pointed\nto 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\n(or resource fragment)."
},
"varBase": {
"type": "string",
"description": "The base URI to which the variable name can be\nappended to retrieve the definition of the\nvariable as a JSON Schema fragment.",
"format": "uri-reference"
},
"variables": {
"type": "object",
"description": "This object contains one key per substitution\nvariable in the templated URL. Each key defines\nthe schema of one substitution variable using a\nJSON Schema fragment and can thus include things\nlike the data type of the variable, enumerations,\nminimum values, maximum values, etc."
}
}
}
]
}
}
},
"definitions": {
"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. WIGOS Metadata Representation Examples
{
"id": "urn:wmo:md:ke-meteo:0-20008-0-NRB",
"type": "Feature",
"conformsTo": [
"http://wis.wmo.int/spec/wmdr/2/conf/core"
],
"geometry": {
"type": "Point",
"coordinates": [
36.75919,
-1.30169,
1795.0
]
},
"properties": {
"created": "1996-01-01T00:00:00Z",
"wmo:dataPolicy": "core",
"contacts": [
{
"name": "World Meteorological Organization WMO and Federal Office for Meteorology and Climatology MeteoSwiss",
"organization": "World Meteorological Organization WMO and Federal Office for Meteorology and Climatology MeteoSwiss",
"emails": [
{
"value": "oscar@wmo.int"
}
],
"addresses": [
{
"deliveryPoint": [
"7bis, avenue de la Paix"
],
"city": "Geneva",
"postalCode": "CH-1211",
"country": "Switzerland"
}
],
"contactInstructions": "email",
"links": [
{
"rel": "canonical",
"type": "text/html",
"href": "https://oscar.wmo.int/surface"
}
],
"roles": [
"host"
]
},
{
"name": "Waweru,Amos,Mr",
"organization": "Kenyan Meteorological Department",
"phones": [
{
"value": "+254723521586"
}
],
"emails": [
{
"value": "waweru_k@yahoo.com"
},
{
"value": "amoskamau1969@gmail.com"
}
],
"addresses": [
{
"deliveryPoint": [
"Kenya Meteorological Department 30259\nNairobi \nKenya"
],
"city": "Nairobi",
"administrativeArea": "NB",
"postalCode": "00100",
"country": "Kenya"
}
],
"contactInstructions": "africa",
"roles": [
"processor",
"producer"
]
}
]
},
"links": [
{
"rel": "license",
"href": "https://creativecommons.org/licenses/by/4.0/"
},
{
"rel": "stations",
"href": "http://www.meteo.go.ke/obsv/ozone.html"
}
]
}
Annex D: Codelists (Informative)
Annex E: Bibliography
-
W3C/OGC: Spatial Data on the Web Best Practices, W3C Working Group Note 28 September 2017, https://www.w3.org/TR/sdw-bp
-
W3C: Data on the Web Best Practices, W3C Recommendation 31 January 2017, https://www.w3.org/TR/dwbp
-
W3C: Data Catalog Vocabulary, W3C Recommendation 16 January 2014, https://www.w3.org/TR/vocab-dcat
-
IANA: Link Relation Types, https://www.iana.org/assignments/link-relations/link-relations.xml
-
Linux Foundation: SPDX License List, https://spdx.org/licenses