├── CHARTER.adoc ├── LICENSE ├── README.md ├── geozarr-interop-table.md ├── geozarr-spec.md ├── geozarr_swg_charter.html └── standard ├── README.md └── template ├── .github └── workflows │ ├── docker.yml │ └── generate.yml ├── .gitignore ├── .gitlab-ci.yml ├── Gemfile ├── Makefile ├── Makefile.win ├── README.adoc ├── UML └── README.adoc ├── abstract_tests ├── ATS_class_example1.adoc ├── ATS_test_example1.adoc ├── ATS_test_example2.adoc └── README.adoc ├── code └── README.adoc ├── document.adoc ├── figures └── README.adoc ├── images └── README.adoc ├── metanorma.yml ├── requirements ├── README.adoc ├── requirement001.adoc ├── requirement002.adoc └── requirements_class.adoc └── sections ├── annex-a.adoc ├── annex-bibliography.adoc ├── annex-history.adoc ├── annex-n.adoc ├── clause_0_front_material.adoc ├── clause_1_scope.adoc ├── clause_2_conformance.adoc ├── clause_3_references.adoc ├── clause_4_terms_and_definitions.adoc ├── clause_5_conventions.adoc ├── clause_6_informative_text.adoc ├── clause_7_annex_mapping.adoc.adoc ├── clause_7_format_requirements.adoc ├── clause_7a_format_overview.adoc ├── clause_7b_format_core.adoc ├── clause_7c_format_coordinates.adoc ├── clause_7d_format_pyramiding.adoc ├── clause_7e_format_dataset_types.adoc └── clause_8_media_types.adoc /CHARTER.adoc: -------------------------------------------------------------------------------- 1 | :Title: OGC GeoZarr Standards Working Group Charter 2 | :titletext: {Title} 3 | :doctype: book 4 | :encoding: utf-8 5 | :lang: en 6 | :toc: 7 | :toc-placement!: 8 | :toclevels: 4 9 | :numbered: 10 | :sectanchors: 11 | :source-highlighter: pygments 12 | 13 | <<< 14 | [cols = ">",frame = "none",grid = "none"] 15 | |=== 16 | |{set:cellbgcolor:#FFFFFF} 17 | |[big]*Open Geospatial Consortium* 18 | |Submission Date: 2023-05-01 19 | |Approval Date: 2023-12-04 20 | |Internal reference number of this OGC(R) document: 23-046 21 | |Category: OGC(R) Standards Working Group Charter 22 | |Authors: Christophe Noel, Brianna R. Pagán 23 | |=== 24 | 25 | [cols = "^", frame = "none"] 26 | |=== 27 | |[big]*{titletext}* 28 | |=== 29 | 30 | [cols = "^", frame = "none", grid = "none"] 31 | |=== 32 | |*Copyright notice* 33 | |Copyright (C) 2023 Open Geospatial Consortium 34 | |To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ 35 | |=== 36 | 37 | <<< 38 | 39 | To: OGC members & interested parties 40 | 41 | A new OGC Standards Working Group (SWG) is being formed. The OGC members listed below have proposed the OGC GeoZarr SWG. The SWG proposal provided in this document meets the requirements of the OGC Technical Committee (TC) Policies and Procedures. 42 | 43 | The SWG name, statement of purpose, scope, list of deliverables, audience, and language specified in the proposal will constitute the SWG's official charter. Technical discussions may occur no sooner than the SWG's first meeting. 44 | 45 | This SWG will operate under the OGC IPR Policy. The eligibility requirements for becoming a participant in the SWG at the first meeting (see details below) are that: 46 | 47 | * You must be an employee of an OGC member organization or an individual 48 | member of OGC; 49 | 50 | * The OGC member must have signed the OGC Membership agreement; 51 | 52 | * You must notify the SWG chair of your intent to participate to the first meeting. Members may do so by logging onto the OGC Portal and navigating to the Observer page and clicking on the link for the SWG they wish to join and; 53 | 54 | * You must attend meetings of the SWG. The first meeting of this SWG is at the time and date fixed below. Attendance may be by teleconference. 55 | 56 | Of course, participants also may join the SWG at any time. The OGC and the SWG welcomes all interested parties. 57 | 58 | Non-OGC members who wish to participate may contact us about joining the OGC. In addition, the public may access some of the resources maintained for each SWG: the SWG public description, the SWG Charter, Change Requests, and public comments, which will be linked from the SWG’s page. 59 | 60 | Please feel free to forward this announcement to any other appropriate lists. The OGC is an open standards organization; we encourage your feedback. 61 | 62 | == Purpose of the Standards Working Group 63 | 64 | The GeoZarr Standard Working Group (SWG) is chartered to develop a Zarr encoding for geospatial gridded data in the form of Zarr conventions (based on the approach described in the draft Zarr Enhancement Proposal 4). Zarr specifies a protocol and format used for storing Zarr arrays, while GeoZarr defines **conventions** and recommendations for storing **multidimensional georeferenced grid** of geospatial observations (including rasters). If appropriate, the GeoZarr SWG may also contribute to the Climate and Forecast (CF) conventions (e.g. alternative CRS encoding) by proposing changes based on the [CF community governance process](https://cfconventions.org/governance.html). 65 | 66 | 67 | 68 | == Business Value Proposition 69 | 70 | In the geospatial world, new cloud-native data formats are emerging. Zarr is a generic data format for n-dimensional arrays that enables access to data in compressed chunks of the original array and has become increasingly popular to use for geospatial purposes. Zarr facilitates portability and interoperability on both object stores and hard disks. In June 2022, the OGC endorsed a community standard of Zarr V2.0 (https://zarr.readthedocs.io/en/stable/spec/v2.html). The purpose of this charter is to adopt a more explicit GeoZarr as an OGC Standard which would provide guidance to standardize the approach for encoding various aspects of geospatial data in zarrs. 71 | 72 | == Scope of Work 73 | 74 | The goal of the GeoZarr specification is to establish flexible and inclusive conventions for the Zarr cloud-native format, specifically designed to meet the diverse requirements within the geospatial domain. These conventions aim to provide a clear and standardized framework for organizing and describing data, ensuring unambiguous representation. 75 | 76 | In addition to the encoding geospatial data and metadata using Zarr, the specification will aim to to provide a multidimensional alternative to the two-dimensional Cloud-Optimized GeoTiff format which has gained popularity due to its serverless capabilities. These capabilities allow for inherent support of traditionally server-based functions, including visualization (similar to OGC API Maps), data subset access (analogous to OGC API Coverages), and symbology (equivalent to OGC API Styles). These aspects are planned to be incorporated as optional profiles (e.g. conformance classes). 77 | 78 | The objectives of GeoZarr conventions includes: 79 | 80 | 1. Compatibility: Ensuring easy compatibility with popular mapping and data analysis tools such as GDAL, Xarray, ArcGIS, QGIS, and other visualisation tools, enabling seamless integration into existing workflows. 81 | 2. Dimensions: Supporting multidimensional data, such as hyperspectral and altitude information, to address diverse geospatial data requirements. 82 | 3. Data Discovery: Providing metadata for discovering, accessing, and retrieving the data, including composite products made of multiple data arrays. 83 | 4. Mixing Data: Facilitating the combination of different types of geospatial data, including satellite images, elevation maps, and weather models, to create comprehensive and informative datasets. 84 | 5. Flexibilty: Allowing scientists and researchers to work with diverse data types and projections in their preferred software and programming languages, promoting flexibility and adaptability in geospatial data processing and analysis. 85 | 86 | Specifically, the convention should provide guidance to standardize the approach for encoding various aspects of geospatial data, including, for example the following list of potential conformance classes: 87 | 88 | * Multiple related variables with heterogeneous coordinates (e.g., children or linked datasets) 89 | * Multiple resolutions of the data, possibly leveraging multiscale array representations 90 | * Data subsets that are only available at certain resolutions 91 | * Multi-dimensional optimizations (spatial chunking scheme, temporal chunking scheme) 92 | * Supporting typical Earth observation (EO) products (for example, how to encode multispectral bands) 93 | * Accessing the symbology of the corresponding data 94 | 95 | Part of the effort of this working group is to determine what should be kept as a part of the GeoZarr core requirements, and what aspects of geospatial data should be kept as separate conformance classes, which may or may not be applicable to specific sub-domains of the geospatial community. 96 | 97 | === Statement of relationship of planned work to the current OGC standards baseline 98 | As the existing draft GeoZarr metadata utilizes Climate and Forecast (CF) attributes, there is an expected relationship with the OGC CF-netCDF Data Model Extension Standard and the OGC netCDF SWG. If necessary, any adjustments or enhancements required for the GeoZarr specification will be considered as a proposal to improve CF conventions as well. 99 | There are strong connections to other OGC raster / array container standards, specifically NetCDF, HDF5, and GeoTiff. The GeoZarr SWG should seek to leverage existing metadata conventions wherever possible. 100 | 101 | As a chunked storage format, there is potentially a strong connection to the `OGC API - Tiles` standard. Map tiles could essentially be mapped 1:1 to an appropriately defined multiscale Zarr array. 102 | 103 | === What is Out of Scope? 104 | In early conversations around creating a draft GeoZarr specification, concerns arose multiple times around the CF encoding of CRS which may pose issues, see https://github.com/zarr-developers/geozarr-spec/issues/20. While these concerns will be discussed and suggestions created for potentially updating CF conventions, if resolutions cannot be made with the GeoZarr specification, we consider out of scope waiting on any subsequent updates to CF conventions to reflect these suggestions. 105 | 106 | === Specific Existing Work Used as Starting Point 107 | * GeoZarr draft specification: https://github.com/zarr-developers/geozarr-spec/ 108 | 109 | === Is This a Persistent SWG 110 | 111 | [x] YES 112 | 113 | [ ] NO 114 | 115 | === When can the SWG be Inactivated 116 | 117 | The SWG can be inactivated once the SWG identifies no new tasks for the SWG and there are no open Change Requests. 118 | 119 | == Description of deliverables 120 | The GeoZarr SWG will deliver a candidate Standard and associated developer resources. 121 | 122 | The SWG expects to have a candidate Standard ready for OGC Architecture Board (OAB) review and public comment within nine months of creation of the SWG. Because example implementations will be developed at the same time the candidate Standard is formalized, reference implementations that fully use GeoZarr should be documented at the same time the candidate Standard goes to vote. 123 | 124 | === Initial Deliverables 125 | 126 | The following deliverables will be the initial results of work of the SWG. 127 | 128 | * OGC GeoZarr Standard 129 | 130 | * GeoZarr developer resources 131 | 132 | The targeted start date for this SWG immediately upon approval of the SWG charter. 133 | 134 | === Additional SWG Tasks 135 | 136 | No specific additional tasks are currently planned for the SWG. 137 | 138 | == IPR Policy for this SWG 139 | 140 | [x] RAND-Royalty Free 141 | 142 | [ ] RAND for fee 143 | 144 | == Anticipated Audience / Participants 145 | 146 | This SWG will develop a Standard for general use in the geospatial community and suitable for data exchange beyond this community. Geospatial data providers and software implementers will be interested in assisting with the development of this Standard as well as the output of the SWG. 147 | 148 | == Domain Working Group Endorsement 149 | 150 | The SWG convenors will discuss the charter with potentially interested Domain Working Groups (DWGs) at the first opportunity. 151 | 152 | == Other informative information about the work of this SWG 153 | 154 | === Collaboration 155 | 156 | All work in the Standards Working Group will be public and the SWG solicits contributions and feedback from OGC members and non-OGC members to the extent that is supported by the OGC Technical Committee Policies and Procedures. 157 | 158 | The OGC GeoZarr SWG will collaborate on Standard development using a public GitHub repository and a Gitter channel. Development of the Standard will include the use of Issues and other project tools in GitHub. 159 | 160 | === Similar or Applicable Standards Work (OGC and Elsewhere) 161 | 162 | * The OGC endorsed a community standard of Zarr V2.0 (https://zarr.readthedocs.io/en/stable/spec/v2.html) in June 2022. 163 | 164 | * This SWG is closely related to the newly announced [Geodatacube SWG](https://www.ogc.org/press-release/ogc-forms-new-geodatacube-standards-working-group/). Essentially, Geodatacube will specify a server API while GeoZarr can define a standard Cloud-native format for a serverless datacube. Therefore, close coordination between these SWGs seems needed. 165 | 166 | * The XCube project has potential synergies with the GeoZarr specification as it already relies and complies with CF conventions: 167 | 168 | * xcube Dataset Convention: https://github.com/dcs4cop/xcube/blob/master/docs/source/cubespec.md 169 | 170 | * xcube Multi-Resolution Datasets: https://github.com/dcs4cop/xcube/blob/master/docs/source/mldatasets.md 171 | 172 | === Details of first meeting 173 | 174 | The first meeting of the SWG will occur within four weeks of approval of the SWG charter. 175 | 176 | === Projected on-going meeting schedule 177 | 178 | The work of this SWG will be carried out primarily on GitHub and via email, web conferences / calls, and at face-to-face sessions at OGC Member Meetings as agreed to by the SWG members. The web conferences / calls will be scheduled as needed and posted to the OGC portal. Voting on OGC GeoZarr Conventions content will be limited to SWG members only. 179 | 180 | === Supporters of this Charter 181 | 182 | The following people support this proposal and are committed to the Charter and projected meeting schedule. These members are known as SWG Founding or Charter members. The charter members agree to the SoW and IPR terms as defined in this charter. The charter members have voting rights beginning the day the SWG is officially formed. Charter Members are shown on the public SWG page. 183 | 184 | |=== 185 | |Name |Organization 186 | 187 | |Christophe Noel | Spacebel 188 | |Brianna R. Pagán | NASA GES DISC 189 | |Alexey N. Shiklomanov | NASA Goddard Space Flight Center 190 | |Tyler A. Erickson | VorGeo 191 | |David Blodgett | U.S. Geological Survey 192 | |=== 193 | 194 | === Conveners 195 | 196 | xxx 197 | 198 | [bibliography] 199 | == References 200 | 201 | - [[[gj,1]]] IETF: IETF RFC 7946, The GeoJSON Format, 2016 202 | [[[gj,2]]] Zarr Enhancement Proposal 4 preparation, https://github.com/zarr-developers/zeps/pull/28 203 | 204 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public 379 | licenses. Notwithstanding, Creative Commons may elect to apply one of 380 | its public licenses to material it publishes and in those instances 381 | will be considered the “Licensor.” The text of the Creative Commons 382 | public licenses is dedicated to the public domain under the CC0 Public 383 | Domain Dedication. Except for the limited purpose of indicating that 384 | material is shared under a Creative Commons public license or as 385 | otherwise permitted by the Creative Commons policies published at 386 | creativecommons.org/policies, Creative Commons does not authorize the 387 | use of the trademark "Creative Commons" or any other trademark or logo 388 | of Creative Commons without its prior written consent including, 389 | without limitation, in connection with any unauthorized modifications 390 | to any of its public licenses or any other arrangements, 391 | understandings, or agreements concerning use of licensed material. For 392 | the avoidance of doubt, this paragraph does not form part of the 393 | public licenses. 394 | 395 | Creative Commons may be contacted at creativecommons.org. 396 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GeoZarr-Spec 2 | 3 | GeoZarr Spec aims to provide a geospatial extension to the Zarr specification. Zarr specifies a protocol and format used for storing Zarr arrays, while the present extension defines **conventions** and recommendations for storing **multidimensional georeferenced grid** of geospatial observations (including rasters). 4 | 5 | The latest Editor's Draft version of OGC GeoZarr Specifications found here in [HTML](https://zarr.dev/geozarr-spec/documents/standard/template/geozarr-spec.html) or [PDF](https://zarr.dev/geozarr-spec/documents/standard/template/geozarr-spec.pdf) 6 | 7 | The following writings aim to introduce the fundamental concepts of geospatial data models and outline the context and motivation underpinning the development of GeoZarr: 8 | 9 | - [Structure Of GeoSpatial Data Systems](https://medium.com/@christophe.noel/structure-of-geospatial-data-ystems-4033d672c222?source=your_stories_page) 10 | - [Geospatial Data Storage Model](https://medium.com/@christophe.noel/geospatial-data-storage-model-d7c3fb895031?source=your_stories_page) 11 | - [Geospatial Data Model Encoding](https://medium.com/@christophe.noel/geospatial-data-model-encoding-1699f4cd5fb9?source=your_stories_page) 12 | - [Geospatial Ecosystems — Scientific vs GIS Communities](https://medium.com/@christophe.noel/geospatial-ecosystems-scientific-vs-gis-communities-324b340bee1a?source=your_stories_page) 13 | - [Motivation for a GeoZarr Unified EO Data Model](https://medium.com/@christophe.noel/motivation-for-a-geozarr-unified-eo-data-model-926dd2bec07a?source=your_stories_page) 14 | 15 | 16 | # Meetings Information 17 | The GeoZarr SWG meets monthly with an agenda and notes kept [here](https://hackmd.io/@briannapagan/geozarr-spec-swg). 18 | 19 | To receive updates about meetings and current efforts, join the Google group by navigating to [https://groups.google.com/u/2/g/geozarr](https://groups.google.com/u/2/g/geozarr) and click "Join this group". 20 | 21 | ## Status 22 | 23 | This specification early drafts (<=v0.4) were created initially by [Spacebel](https://www.spacebel.com/) for the [European Space Agency](https://esa.int) under the [General Support Technology Programme](http://www.esa.int/Enabling_Support/Space_Engineering_Technology/Shaping_the_Future/About_the_General_Support_Technology_Programme_GSTP). 24 | 25 | **Update 2023-01-20** - This spec is transitioning to community-based development in anticipation of submission as an OGC standard. It has been moved to the `zarr-developers` GitHub organization. Brianna Pagan ([@briannapagan](https://github.com/briannapagan)) has volunteered to coordinate the community development process. 26 | Feedback from users and implementers will be solicited from the community and incorporated into future drafts. 27 | Information about how to get involved in this process will be announced soon/ 28 | 29 | ## Changelog 30 | 31 | ### v0.4 32 | 33 | * Added visual portrayals and symbology (instead of quicklook) 34 | * Specified default multiscale non-projection (pseudo 'Plate Carree') 35 | 36 | ### v0.3 37 | 38 | * Refined multiscales metadata (crs and level attributes) 39 | 40 | ### v0.2 41 | 42 | * Specified multiscales zoom level str 43 | 44 | ## Document and Resources 45 | 46 | Specification [Document](geozarr-spec.md) 47 | 48 | Demonstration Videos ([Youtube channel](https://youtube.com/playlist?list=PLzPGC4s5HQOPdeLoK1MXK6gEa1x2Az8Dn)): 49 | - Project Presentation (at WGISS-53) [GeoZarr Data Store - Context of the ESA GSTP project](https://youtu.be/NYhh66EstnY) 50 | - Project Presentation (at DAP) [Hyperspectral Data Store and Access Project](https://youtu.be/CfmPppVR-o4) 51 | - Demo: [GeoZarr Visual Portrayals and OpenLayers extension](https://youtu.be/IKURmv6CVGU) 52 | - Demo: [GeoZarr Fast Time Series Plotting](https://youtu.be/Nt1URJqW71o) 53 | - Demo: [GeoZarr Compute and plot NDWI index at runtime](https://youtu.be/UP0DjphdZgM) 54 | - Demo: [GeoZarr Catalogue Integration](https://youtu.be/Nlbo3FJH8lo) 55 | - Demo: [GeoZarr Serverless Visualisation and Pixel-Based Access](https://youtu.be/sKlejJcPKqQ) 56 | - Comparison: [GeoZarr vs COG Performances](https://youtu.be/KGC8mLqlsCs) 57 | - Advanced applications: soon 58 | 59 | OpenLayers extension prototype: https://github.com/spacebel/geozarr-openlayers 60 | 61 | 62 | 63 | ## License 64 | 65 | (CC BY 4.0) : Content in this repository is licensed under a Creative Commons Attribution 4.0 International license. Licensees may copy, distribute, display, perform and make derivative works and remixes based on it only if they give the author or licensor the credits (attribution). You can find the complete text of this license at http://creativecommons.org/licenses/by/4.0/. 66 | 67 | GeoZarr was created initially by [Spacebel](https://www.spacebel.com/) for the [European Space Agency](https://esa.int) under the [General Support Technology Programme](http://www.esa.int/Enabling_Support/Space_Engineering_Technology/Shaping_the_Future/About_the_General_Support_Technology_Programme_GSTP). 68 | -------------------------------------------------------------------------------- /geozarr-interop-table.md: -------------------------------------------------------------------------------- 1 | ## GeoZarr Store Support (current spec) 2 | 3 | | Tool | Can write | Can read local storage | Can read HTTP | Can read S3 | Can read Azure Blob | Can read GCS | 4 | | -------- | ------- | ------- | ------- | ------- | ------- | ------- | 5 | | GDAL | ? | | | | | | 6 | | QGIS| ⚠️ | ⚠️ | | ✅* | | | 7 | | ArcGIS | ✅ | ✅ | | ✅ | | ✅ | 8 | | NetCDF Python | ? | ✅ | | | | | 9 | | NCO | ✅ | ✅ | | | | | 10 | | Panoply | n/a | 🚫 | | | | | 11 | | Xarray | ✅ | ✅ | | | | | 12 | 13 | ## GeoZarr Tool Interoperability (current spec) 14 | 15 | |Reader → Writer ↓| GDAL | QGIS | ArcGIS | NetCDF Python | NCO | Panoply | Xarray | 16 | | -------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | 17 | | GDAL | | | | | | n/a | | 18 | | QGIS | | | | | | n/a | | 19 | | ArcGIS | | | | | | n/a | ✅ | 20 | | NetCDF | | | | | | n/a | | 21 | | NCO | | | | | | n/a | ✅ | 22 | | Panoply | | | | | | n/a | | 23 | | Xarray | ✅* | ✅ | ✅ | ✅ | ✅ | n/a | ✅ | 24 | 25 | ## Sample data 26 | netcdf like data (Written with Xarray): http://tinyurl.com/GLDAS-NOAH025-3H 27 | 28 | https://beta.source.coop/zarr/geozarr-tests/ 29 | 30 | https://github.com/zarr-developers/geozarr-spec/issues/36 31 | 32 | ## Tools 33 | 34 | ### GDAL (3.8.3) 35 | 36 | 37 | ### QGIS (3.34.3) 38 | With GDAL (3.8.1) 39 | 40 | Can read from local storage, but can't read the CRS. 41 | 42 | Can read from S3, but extremely slowly. 43 | 44 | Can write, but with incorrect nodata value and doesn't write multiple variables to a file. 45 | 46 | ### ArcGIS (3.2.1) 47 | 48 | ### NetCDF Python Library (1.6.2) 49 | Should be able to read from S3, but depends upon configuring the NetCDF C library with [the NCZarr implementation](https://docs.unidata.ucar.edu/nug/current/nczarr_head.html) to read from S3. Attempting to read from S3 triggered this message: `s3 scheme requires that netCDF be configured with –enable-nczarr-s3 option `. 50 | 51 | ### NCO (5.1.9) 52 | Ticket: https://github.com/zarr-developers/geozarr-spec/issues/40 53 | 54 | Should be able to read from S3, but depends upon configuring the NetCDF C library with [the NCZarr implementation](https://docs.unidata.ucar.edu/nug/current/nczarr_head.html) to read from S3. Attempting to read from S3 triggered this message: `s3 scheme requires that netCDF be configured with –enable-nczarr-s3 option `. 55 | 56 | ### Panoply (5.2.9) 57 | 58 | ### Xarray (2024.1.1) 59 | Can read and write, but only if using GDAL <3.6 or no GDAL. Does not work with GDAL 3.8. 60 | -------------------------------------------------------------------------------- /geozarr-spec.md: -------------------------------------------------------------------------------- 1 | # GeoZarr-spec 0.4 2 | 3 | This document aims to provides a geospatial extension to the Zarr specification (v2). Zarr specifies a protocol and format used for storing Zarr arrays, while the present extension defines **conventions** and recommendations for storing **multidimensional georeferenced grid** of geospatial observations (including rasters). 4 | 5 | The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119. 6 | 7 | ## Status 8 | 9 | This specification is an early draft developed in the frame of an European Space Agency (ESA) GSTP. Through the optional General Support Technology Programme (GSTP) ESA, Participating States and Industry work together to convert promising engineering concepts into a broad spectrum of usable products. 10 | 11 | [Change Log](https://github.com/christophenoel/geozarr-spec/wiki) 12 | 13 | ## GeoZarr Classes 14 | 15 | GeoZarr is restricted to geospatial data which conforms to the conceptual class of Dataset as defined below. 16 | 17 | ### GeoZarr DataArray 18 | 19 | A GeoZarr DataArray variable is a **Zarr Array** that provides values of a measured or observed **geospatial phenomena** (possibly indirectly computed using processing). For example, it might provide reflectance values of a captured satellite scene, or it may describe average vegetation index (NDVI) values for defined period of times. 20 | 21 | GeoZarr DataArray variable MUST include the attribute **\_ARRAY_DIMENSIONS which list the dimension names** (this property was first introduced by xarray library). 22 | 23 | 24 | ``` 25 | "_ARRAY_DIMENSIONS": [ 26 | "lat", 27 | "lon" 28 | ] 29 | ``` 30 | 31 | ### GeoZarr Coordinates 32 | 33 | GeoZarr Coordinates variable is either a one dimensional **Zarr Array** or an empty **Zarr Array** containing a **grid_mapping** which includes a **GeoTransform**. In both cases, the coordinates **index a dimension** of a GeoZarr DataArray (e.g latitude, longitude, time, wavelength). 34 | 35 | GeoZarr Coordinates variable MUST include the attribute **\_ARRAY_DIMENSIONS equal to the Zarr array name** (e.g. latitude for the latitude Zarr Array). 36 | 37 | ### GeoZarr Auxiliary Data 38 | 39 | GeoZarr Auxiliary variable is empty, one dimensional or multidimensional **Zarr Array** providing auxiliary information. 40 | 41 | GeoZarr Auxiliary variable MUST include the attribute **\_ARRAY_DIMENSIONS set as an empty array**. 42 | 43 | ### GeoZarr Dataset 44 | 45 | GeoZarr Dataset is a root **Zarr Group** which contains a **set of DataArray variables** (observed data), **Coordinates variables**, Auxiliary variables, and optionally children Datasets (located in children Zarr Groups). Dataset MUST contain a **consistent** set of data for which the DataArray variables have aligned dimensions, and share the same coordinates grid using a common spatial projection. 46 | 47 | If multiple Array Variables share heterogeneous dimensions or coordinates, a primary homogeneous set of variables MUST be located at root level, and the other sets declared in children datasets. 48 | 49 | 50 | ## GeoZarr Metadata 51 | 52 | GeoZarr Arrays and Coordinates Variables MUST include [Climate and Forecast (CF)](http://cfconventions.org/) attributes (in the .attrs object). The variables MUST include at least: 53 | 54 | * standard_name for all variables 55 | * grid_mapping (coordinates reference system) for all array variables 56 | 57 | ### Standard Name 58 | 59 | A CF **standard name** is an attribute which identifies the physical quantity of a variable ([table](https://cfconventions.org/Data/cf-standard-names/78/build/cf-standard-name-table.html)). 60 | 61 | The quantity may describe the observed phenomenon for: 62 | * a DataArray variable (for example 'surface_bidirectional_reflectance' for optical sensor data) 63 | * a Coordinate variable 64 | * an Auxiliary variable 65 | 66 | The following standard names are recommended to describe coordinates variables for dimensions of DataArrays: 67 | * grid_latitude, grid_longitude (spatial coordinates as degrees) 68 | * projection_x_coordinate, projection_y_coordinates (spatial coordinates as per projection) 69 | * sensor_band_identifier (multisptrectal band identifier) 70 | * radiation_wavelength (hyperspectral wave length) 71 | * altitude 72 | * time 73 | 74 | ### Coordinate Reference System 75 | 76 | The **grid_mapping** CF variable defined by the DataArray variable defines the coordinate reference system (CRS) used for the horizontal spatial coordinate values. The grid_mapping value indicates the auxiliary variable that holds all the CF attributes describing the CRS. 77 | 78 | In GeoZarr, the grid_mapping variable can contain a **GeoTransform** attribute [adopted from the GDAL Raster Data Model](https://gdal.org/user/raster_data_model.html#affine-geotransform). A GeoTransform is six values: `"X_offset X0 X1 Y_offset Y0 Y1 "` encoded as a space delimited string to ensure interoperability with existing software. `X_offset` and `Y_offset` are the grid origin. `X0` and `Y0` are the grid spacing per column. `X1` and `Y1` are the grid spacing per row. In the case of north up, axis aligned images, `X1 = Y0 = 0` and `X0` is pixel width, `Y1` is pixel height, and `X_offset, Y_offset)` is the top left corner of the top left pixel of the raster. The following equations can be used to derive georeferenced cell centers for rows and columns starting at zero. 79 | 80 | ``` 81 | X_georeference = X_offset + (row + 0.5) * X1 + (column + 0.5) * X0 82 | Y_georeference = Y_offset + (row + 0.5) * Y1 + (column + 0.5) * Y0 83 | ``` 84 | 85 | ### Other CF Properties 86 | 87 | All other CF conventions are recommended, in particular the attributes below: 88 | 89 | * add_offset 90 | * scale_factor 91 | * units (as per [UDUNITS v2](https://www.unidata.ucar.edu/software/udunits/udunits-2.2.28/udunits2.html)) 92 | 93 | ## Multiscales 94 | 95 | A GeoZarr Dataset variable might include multiscales for a set of DataArray variables. Also known as "overviews", multiscales provide resampled copies of the original data at a coarser resolution. Multiscales of the original data thus always hold less detail. Common use cases for multiscales are fast rendering for visualization purposes and analyzing data at multiple resolutions. 96 | 97 | ### Multiscales Encoding 98 | 99 | Multiscales MUST be encoded in children groups. Data at all scales MUST use the same coordinate reference system and must follow ONE common zoom level strategy. The zoom level strategy is modelled in close alignment to the [OGC Two Dimensional Tile Matrix Set](https://docs.ogc.org/is/17-083r4/17-083r4.html) version 2 and the [Tiled Asset STAC extension](https://github.com/stac-extensions/tiled-assets). Each zoom level is described by a Matrix defining the number, layout, origin and pixel size of included tiles. These tiles MUST correspond to the chunk layout along the two spatial dimensions listed in `_ARRAY_DIMENSIONS` of a given group. 100 | 101 | * Multiscale group name is the zoom level identifier (e.g. '0'). 102 | * Multiscale group contains all DataArrays generated for this specific zoom level. 103 | * Multiscale chunking is RECOMMENDED to be 256 pixels or 512 pixels for the two spatial dimensions listed in `_ARRAY_DIMENSIONS`. 104 | 105 | ### Multiscales Metadata 106 | 107 | If implemented, each DataArray MUST define the 'multiscales' metadata attribute which includes the following fields: 108 | * `tile_matrix_set` 109 | * `tile_matrix_set_limits` (optional) 110 | * `resampling_method` 111 | 112 | 113 | #### Tile Matrix Set 114 | Tile Matrix Set can be: 115 | * the name of a well know tile matrix set. Well known Tile Matrix Sets are listed [here](https://schemas.opengis.net/tms/2.0/json/examples/tilematrixset/). 116 | * the URI of a JSON document describing the Tile Matrix Set following the OGC standard. 117 | * a JSON object describing the Tile Matrix Set following the OGC standard (CamelCase!). 118 | 119 | Within the Tile Matrix Set 120 | * the Tile Matrix identifier for each zoom level MUST be the relative path to the Zarr group which holds the DataArray variable 121 | * zoom levels MUST be provided from lowest to highest resolutions 122 | * the `supportedCRS` attribute of the Tile Matrix Set MUST match the crs information defined under **grid_mapping**. 123 | * the tile layout for each Matrix MUST correspond to the chunk layout along the two spatial dimensions listed in `_ARRAY_DIMENSIONS` of the corresponding group. 124 | 125 | 126 | #### Tile Matrix Set Limits 127 | Tile Matrix Sets may describe a larger spatial extent and more resolutions than used in the given dataset. 128 | In that case, users MAY specify [Tile Matrix Set Limits](https://docs.ogc.org/is/17-083r4/17-083r4.html#toc21) as described in the OGC standard to define the minimum and a maximum limits of the indices for each TileMatrix that contains actual data. However, the notation for tile matrix set does not the JSON encoding as described in the OGC standard but follows the STAC Tile Asset encoding for better readability. 129 | 130 | If used, Tile Matrix Set Limits 131 | * MUST list all included zoom levels 132 | * MAY list the min and max rows and columns for each zoom level. If omitted, it is assumed that the entire spatial extent is covered (resulting in higher chunk count of the DataArray). 133 | 134 | #### Resampling Method 135 | Resampling Method specifies which resampling method is used for generating multiscales. It MUST be one of the following string values. Resampling method MUST be the same across all zoom levels: 136 | * nearest 137 | * bilinear 138 | * cubic 139 | * cubic_spline 140 | * lanczos 141 | * average 142 | * mode 143 | * gauss 144 | * max 145 | * min 146 | * med 147 | * q1 148 | * q3 149 | * sum 150 | * rms 151 | 152 | ### Multiscale examples 153 | #### Using Well Known Name reference 154 | 155 | ```diff 156 | (mandatory items in red, optional items in green) 157 | +{ 158 | + "multiscales": 159 | - { 160 | - "tile_matrix_set": "WebMercatorQuad", 161 | - "resampling_method": "nearest", 162 | - } 163 | +} 164 | ``` 165 | #### Using a URI 166 | 167 | ```diff 168 | (mandatory items in red, optional items in green) 169 | +{ 170 | + "multiscales": 171 | - { 172 | - "tile_matrix_set": "https://schemas.opengis.net/tms/2.0/json/examples/tilematrixset/WebMercatorQuad.json", 173 | - "resampling_method": "nearest", 174 | - } 175 | +} 176 | ``` 177 | 178 | #### Using a JSON object 179 | 180 | ```diff 181 | (mandatory items in red, optional items in green) 182 | +{ 183 | + "multiscales": 184 | - { 185 | - "tile_matrix_set": { 186 | - "id": "WebMercatorQuad", 187 | - "title": "Google Maps Compatible for the World", 188 | - "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/WebMercatorQuad", 189 | - "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", 190 | - "orderedAxes": [ 191 | - "X", 192 | - "Y" 193 | - ], 194 | - "wellKnownScaleSet": "http://www.opengis.net/def/wkss/OGC/1.0/GoogleMapsCompatible", 195 | - "tileMatrices": [ 196 | - { 197 | - "id": "0", 198 | - "scaleDenominator": 559082264.028717, 199 | - "cellSize": 156543.033928041, 200 | - "pointOfOrigin": [ 201 | - -20037508.3427892, 202 | - 20037508.3427892 203 | - ], 204 | - "tileWidth": 256, 205 | - "tileHeight": 256, 206 | - "matrixWidth": 1, 207 | - "matrixHeight": 1 208 | - }, 209 | - { 210 | - "id": "1", 211 | - "scaleDenominator": 279541132.014358, 212 | - "cellSize": 78271.5169640204, 213 | - "pointOfOrigin": [ 214 | - -20037508.3427892, 215 | - 20037508.3427892 216 | - ], 217 | - "tileWidth": 256, 218 | - "tileHeight": 256, 219 | - "matrixWidth": 2, 220 | - "matrixHeight": 2 221 | - }, 222 | - } 223 | - "resampling_method": "nearest", 224 | - } 225 | +} 226 | ``` 227 | #### Setting limits 228 | 229 | ```diff 230 | (mandatory items in red, optional items in green) 231 | +{ 232 | + "multiscales": 233 | - { 234 | - "tile_matrix_set": "WebMercatorQuad", 235 | + "tile_matrix_limits: { 236 | - "0": {}, 237 | - "1": { 238 | + "min_tile_col": 0, 239 | + "max_tile_col": 0, 240 | + "min_tile_row": 0, 241 | + "max_tile_row": 0 242 | - }, 243 | - "2": { 244 | + "min_tile_col": 1, 245 | + "max_tile_col": 1, 246 | + "min_tile_row": 2, 247 | + "max_tile_row": 2 248 | - } 249 | - }, 250 | - "resampling_method": "nearest", 251 | - } 252 | +} 253 | ``` 254 | 255 | 256 | ## Portrayals and Symbology 257 | 258 | A GeoZarr Dataset variable might define a set of visual portrayals of the geospatial data and define an adequate symbology. The symbology model is based on a simplified schema based on OGC Symbology Encoding Implementation Specification https://www.ogc.org/standards/symbol. 259 | 260 | * Each portrayal defines a name and a symbology 261 | * Attribute 'channel-selection' MUST define either the RGB channels, or the grey channels to be represented. 262 | * Channel values MUST specify the relative path to the data, and optionally include the group(s), array and index (which can use positional and label-based indexing (see: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html). 263 | * If grey channel is specified, the 'color-map' MAY define the mapping of palette-type raster colors or fixed-numeric pixel values to colors. 264 | 265 | ```diff 266 | (mandatory items in red, optional items in green) 267 | +{ 268 | + "portrayals": [ 269 | - "name": { 270 | - "symbology": { 271 | - "channel-selection": { 272 | + "red":"B4" 273 | + "green":"data[3]" 274 | + "blue":"data['420']" 275 | + "grey":"data[2]" 276 | - "colorMap": [ 277 | - "color-map-entry": { 278 | - "color": "#000000", 279 | + "label": "0" 280 | - "quantity": "0" }, 281 | - "color-map-entry": { 282 | - "color": "#d73027", 283 | + "label": "50" 284 | - "quantity": "0.5" } 285 | + ] 286 | + } 287 | + ] 288 | +} 289 | ``` 290 | 291 | ## Rechunking 292 | 293 | GeoZarr DataArrray MUST specify the paths to the rechunked instance of the data. These duplicates of the data enable optimizing queries on specific dimensions to improve performances (e.g. for requesting time series). 294 | 295 | The attribute rechunking list the path the the various instances of the data. The corresponding Zarr metadata provides along the rechunked array provides the chunk size and shape. 296 | 297 | ```diff 298 | (mandatory items in red, optional items in green) 299 | + "rechunking": [ 300 | - { 301 | - "path": "rechunk1" 302 | - }, 303 | - { 304 | - "path": "rechunk2" 305 | - } 306 | + ] 307 | ``` 308 | 309 | ## Use Cases 310 | 311 | ### Multispectral Data 312 | 313 | If the optical sensor captures spectral bands for different resolution, it is RECOMMENDED to hold the highest resolution dataset in the root group, and provide the other resolutions in children groups. 314 | 315 | The spectral band SHOULD be represented as a dimension (not as an array neither a group). For identifying the band it is RECOMMENDED to either: 316 | * Use the STAC Band common name (see https://github.com/stac-extensions/eo/blob/main/README.md#common-band-names) 317 | * Use the mission specific identifier 318 | 319 | ### Hyperspectral Data 320 | 321 | The wavelength SHOULD be represented as a dimension. 322 | 323 | ### Time Series 324 | 325 | For level 3+ products, time SHOULD be represented as a dimension. 326 | When the scene temporal instances are not sharing a common coordinate grid , it is RECOMMENDED to project (interpolate) the scenes in a standard geometry. 327 | 328 | ## License 329 | 330 | (CC BY 4.0) : Content in this repository is licensed under a Creative Commons Attribution 4.0 International license. Licensees may copy, distribute, display, perform and make derivative works and remixes based on it only if they give the author or licensor the credits (attribution). You can find the complete text of this license at http://creativecommons.org/licenses/by/4.0/. 331 | 332 | GeoZarr documentation by Christophe Noël from Spacebel, supported by ScanWorld and other contributors. 333 | -------------------------------------------------------------------------------- /geozarr_swg_charter.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | OGC GeoZarr Standards Working Group Charter 9 | 10 | 438 | 439 | 440 | 442 |
443 |
444 |
445 |
446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 |

Open Geospatial Consortium

Submission Date: 2023-05-01

Approval Date: 2023-12-04

Internal reference number of this OGC® document: 23-046

Category: OGC® Standards Working Group Charter

Authors: Christophe Noel, Brianna R. Pagán

474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 |

OGC GeoZarr Standards Working Group Charter

484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 |

Copyright notice

Copyright © 2023 Open Geospatial Consortium

To obtain additional rights of use, visit http://www.opengeospatial.org/legal/

500 |
501 |
502 |

To: OGC members & interested parties

503 |
504 |
505 |

A new OGC Standards Working Group (SWG) is being formed. The OGC members listed below have proposed the OGC GeoZarr SWG. The SWG proposal provided in this document meets the requirements of the OGC Technical Committee (TC) Policies and Procedures.

506 |
507 |
508 |

The SWG name, statement of purpose, scope, list of deliverables, audience, and language specified in the proposal will constitute the SWG’s official charter. Technical discussions may occur no sooner than the SWG’s first meeting.

509 |
510 |
511 |

This SWG will operate under the OGC IPR Policy. The eligibility requirements for becoming a participant in the SWG at the first meeting (see details below) are that:

512 |
513 |
514 |
    515 |
  • 516 |

    You must be an employee of an OGC member organization or an individual 517 | member of OGC;

    518 |
  • 519 |
  • 520 |

    The OGC member must have signed the OGC Membership agreement;

    521 |
  • 522 |
  • 523 |

    You must notify the SWG chair of your intent to participate to the first meeting. Members may do so by logging onto the OGC Portal and navigating to the Observer page and clicking on the link for the SWG they wish to join and;

    524 |
  • 525 |
  • 526 |

    You must attend meetings of the SWG. The first meeting of this SWG is at the time and date fixed below. Attendance may be by teleconference.

    527 |
  • 528 |
529 |
530 |
531 |

Of course, participants also may join the SWG at any time. The OGC and the SWG welcomes all interested parties.

532 |
533 |
534 |

Non-OGC members who wish to participate may contact us about joining the OGC. In addition, the public may access some of the resources maintained for each SWG: the SWG public description, the SWG Charter, Change Requests, and public comments, which will be linked from the SWG’s page.

535 |
536 |
537 |

Please feel free to forward this announcement to any other appropriate lists. The OGC is an open standards organization; we encourage your feedback.

538 |
539 |
540 |
541 |
542 |

1. Purpose of the Standards Working Group

543 |
544 |
545 |

The GeoZarr Standard Working Group (SWG) is chartered to develop a Zarr encoding for geospatial gridded data in the form of Zarr conventions (based on the approach described in the draft Zarr Enhancement Proposal 4). Zarr specifies a protocol and format used for storing Zarr arrays, while GeoZarr defines conventions and recommendations for storing multidimensional georeferenced grid of geospatial observations (including rasters). If appropriate, the GeoZarr SWG may also contribute to the Climate and Forecast (CF) conventions (e.g. alternative CRS encoding) by proposing changes based on the [CF community governance process](https://cfconventions.org/governance.html).

546 |
547 |
548 |
549 |
550 |

2. Business Value Proposition

551 |
552 |
553 |

In the geospatial world, new cloud-native data formats are emerging. Zarr is a generic data format for n-dimensional arrays that enables access to data in compressed chunks of the original array and has become increasingly popular to use for geospatial purposes. Zarr facilitates portability and interoperability on both object stores and hard disks. In June 2022, the OGC endorsed a community standard of Zarr V2.0 (https://zarr.readthedocs.io/en/stable/spec/v2.html). The purpose of this charter is to adopt a more explicit GeoZarr as an OGC Standard which would provide guidance to standardize the approach for encoding various aspects of geospatial data in zarrs.

554 |
555 |
556 |
557 |
558 |

3. Scope of Work

559 |
560 |
561 |

The goal of the GeoZarr specification is to establish flexible and inclusive conventions for the Zarr cloud-native format, specifically designed to meet the diverse requirements within the geospatial domain. These conventions aim to provide a clear and standardized framework for organizing and describing data, ensuring unambiguous representation.

562 |
563 |
564 |

In addition to the encoding geospatial data and metadata using Zarr, the specification will aim to to provide a multidimensional alternative to the two-dimensional Cloud-Optimized GeoTiff format which has gained popularity due to its serverless capabilities. These capabilities allow for inherent support of traditionally server-based functions, including visualization (similar to OGC API Maps), data subset access (analogous to OGC API Coverages), and symbology (equivalent to OGC API Styles). These aspects are planned to be incorporated as optional profiles (e.g. conformance classes).

565 |
566 |
567 |

The objectives of GeoZarr conventions includes:

568 |
569 |
570 |
    571 |
  1. 572 |

    Compatibility: Ensuring easy compatibility with popular mapping and data analysis tools such as GDAL, Xarray, ArcGIS, QGIS, and other visualisation tools, enabling seamless integration into existing workflows.

    573 |
  2. 574 |
  3. 575 |

    Dimensions: Supporting multidimensional data, such as hyperspectral and altitude information, to address diverse geospatial data requirements.

    576 |
  4. 577 |
  5. 578 |

    Data Discovery: Providing metadata for discovering, accessing, and retrieving the data, including composite products made of multiple data arrays.

    579 |
  6. 580 |
  7. 581 |

    Mixing Data: Facilitating the combination of different types of geospatial data, including satellite images, elevation maps, and weather models, to create comprehensive and informative datasets.

    582 |
  8. 583 |
  9. 584 |

    Flexibilty: Allowing scientists and researchers to work with diverse data types and projections in their preferred software and programming languages, promoting flexibility and adaptability in geospatial data processing and analysis.

    585 |
  10. 586 |
587 |
588 |
589 |

Specifically, the convention should provide guidance to standardize the approach for encoding various aspects of geospatial data, including, for example the following list of potential conformance classes:

590 |
591 |
592 |
    593 |
  • 594 |

    Multiple related variables with heterogeneous coordinates (e.g., children or linked datasets)

    595 |
  • 596 |
  • 597 |

    Multiple resolutions of the data, possibly leveraging multiscale array representations

    598 |
  • 599 |
  • 600 |

    Data subsets that are only available at certain resolutions

    601 |
  • 602 |
  • 603 |

    Multi-dimensional optimizations (spatial chunking scheme, temporal chunking scheme)

    604 |
  • 605 |
  • 606 |

    Supporting typical Earth observation (EO) products (for example, how to encode multispectral bands)

    607 |
  • 608 |
  • 609 |

    Accessing the symbology of the corresponding data

    610 |
  • 611 |
612 |
613 |
614 |

Part of the effort of this working group is to determine what should be kept as a part of the GeoZarr core requirements, and what aspects of geospatial data should be kept as separate conformance classes, which may or may not be applicable to specific sub-domains of the geospatial community.

615 |
616 |
617 |

3.1. Statement of relationship of planned work to the current OGC standards baseline

618 |
619 |

As the existing draft GeoZarr metadata utilizes Climate and Forecast (CF) attributes, there is an expected relationship with the OGC CF-netCDF Data Model Extension Standard and the OGC netCDF SWG. If necessary, any adjustments or enhancements required for the GeoZarr specification will be considered as a proposal to improve CF conventions as well. 620 | There are strong connections to other OGC raster / array container standards, specifically NetCDF, HDF5, and GeoTiff. The GeoZarr SWG should seek to leverage existing metadata conventions wherever possible.

621 |
622 |
623 |

As a chunked storage format, there is potentially a strong connection to the OGC API - Tiles standard. Map tiles could essentially be mapped 1:1 to an appropriately defined multiscale Zarr array.

624 |
625 |
626 |
627 |

3.2. What is Out of Scope?

628 |
629 |

In early conversations around creating a draft GeoZarr specification, concerns arose multiple times around the CF encoding of CRS which may pose issues, see https://github.com/zarr-developers/geozarr-spec/issues/20. While these concerns will be discussed and suggestions created for potentially updating CF conventions, if resolutions cannot be made with the GeoZarr specification, we consider out of scope waiting on any subsequent updates to CF conventions to reflect these suggestions.

630 |
631 |
632 |
633 |

3.3. Specific Existing Work Used as Starting Point

634 |
635 | 640 |
641 |
642 |
643 |

3.4. Is This a Persistent SWG

644 |
645 |

[x] YES

646 |
647 |
648 |

[ ] NO

649 |
650 |
651 |
652 |

3.5. When can the SWG be Inactivated

653 |
654 |

The SWG can be inactivated once the SWG identifies no new tasks for the SWG and there are no open Change Requests.

655 |
656 |
657 |
658 |
659 |
660 |

4. Description of deliverables

661 |
662 |
663 |

The GeoZarr SWG will deliver a candidate Standard and associated developer resources.

664 |
665 |
666 |

The SWG expects to have a candidate Standard ready for OGC Architecture Board (OAB) review and public comment within nine months of creation of the SWG. Because example implementations will be developed at the same time the candidate Standard is formalized, reference implementations that fully use GeoZarr should be documented at the same time the candidate Standard goes to vote.

667 |
668 |
669 |

4.1. Initial Deliverables

670 |
671 |

The following deliverables will be the initial results of work of the SWG.

672 |
673 |
674 |
    675 |
  • 676 |

    OGC GeoZarr Standard

    677 |
  • 678 |
  • 679 |

    GeoZarr developer resources

    680 |
  • 681 |
682 |
683 |
684 |

The targeted start date for this SWG immediately upon approval of the SWG charter.

685 |
686 |
687 |
688 |

4.2. Additional SWG Tasks

689 |
690 |

No specific additional tasks are currently planned for the SWG.

691 |
692 |
693 |
694 |
695 |
696 |

5. IPR Policy for this SWG

697 |
698 |
699 |

[x] RAND-Royalty Free

700 |
701 |
702 |

[ ] RAND for fee

703 |
704 |
705 |
706 |
707 |

6. Anticipated Audience / Participants

708 |
709 |
710 |

This SWG will develop a Standard for general use in the geospatial community and suitable for data exchange beyond this community. Geospatial data providers and software implementers will be interested in assisting with the development of this Standard as well as the output of the SWG.

711 |
712 |
713 |
714 |
715 |

7. Domain Working Group Endorsement

716 |
717 |
718 |

The SWG convenors will discuss the charter with potentially interested Domain Working Groups (DWGs) at the first opportunity.

719 |
720 |
721 |
722 |
723 |

8. Other informative information about the work of this SWG

724 |
725 |
726 |

8.1. Collaboration

727 |
728 |

All work in the Standards Working Group will be public and the SWG solicits contributions and feedback from OGC members and non-OGC members to the extent that is supported by the OGC Technical Committee Policies and Procedures.

729 |
730 |
731 |

The OGC GeoZarr SWG will collaborate on Standard development using a public GitHub repository and a Gitter channel. Development of the Standard will include the use of Issues and other project tools in GitHub.

732 |
733 |
734 |
735 |

8.2. Similar or Applicable Standards Work (OGC and Elsewhere)

736 |
737 | 754 |
755 |
756 |
757 |

8.3. Details of first meeting

758 |
759 |

The first meeting of the SWG will occur within four weeks of approval of the SWG charter.

760 |
761 |
762 |
763 |

8.4. Projected on-going meeting schedule

764 |
765 |

The work of this SWG will be carried out primarily on GitHub and via email, web conferences / calls, and at face-to-face sessions at OGC Member Meetings as agreed to by the SWG members. The web conferences / calls will be scheduled as needed and posted to the OGC portal. Voting on OGC GeoZarr Conventions content will be limited to SWG members only.

766 |
767 |
768 |
769 |

8.5. Supporters of this Charter

770 |
771 |

The following people support this proposal and are committed to the Charter and projected meeting schedule. These members are known as SWG Founding or Charter members. The charter members agree to the SoW and IPR terms as defined in this charter. The charter members have voting rights beginning the day the SWG is officially formed. Charter Members are shown on the public SWG page.

772 |
773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 |
NameOrganization

Christophe Noel

Spacebel

Brianna R. Pagán

NASA GES DISC

Alexey N. Shiklomanov

NASA Goddard Space Flight Center

Tyler A. Erickson

VorGeo

David Blodgett

U.S. Geological Survey

807 |
808 |
809 |

8.6. Conveners

810 |
811 |

xxx

812 |
813 |
814 |
815 |
816 |
817 |

References

818 |
819 |
820 | 826 |
827 |
828 |
829 |
830 | 835 | 836 | -------------------------------------------------------------------------------- /standard/README.md: -------------------------------------------------------------------------------- 1 | # Standard template 2 | 3 | OGC uses [Metanorma](https://www.metanorma.org) software for creating Standards documents. 4 | 5 | You can compile documents using either a local installation of Metanorma or optionally a docker-containerized instance of Metanorma. 6 | 7 | ## Using Metanorma from a local installation 8 | 9 | ### Pre-requisite 10 | 11 | Confirm that you have Metanorma installed locally on your operating system. If you do not have Metanorma installed, follow the steps at the [Metanorma website](https://www.metanorma.org/install/) to install it. 12 | 13 | ### Getting the Templates 14 | 15 | **Step 1**. Obtain the template for a Draft OGC Standard from the `template` sub-folder. 16 | 17 | ### Editing a Draft OGC Standard for compilation with Metanorma 18 | 19 | Now that you have obtained a copy of the template, you can edit the document. The following steps assume that you have read the **authoring guidelines** are at https://www.metanorma.org/author/ogc/authoring-guide/ 20 | 21 | **Step 2**. Next, edit the asciidoc file `document.adoc` by filling the document properties: `docsubtype`, `status`, `abbrev`, `edition` (i.e. version of the document), `docnumber` (OGC Document Number), `keywords`, `fullname` (of the editors). 22 | 23 | **Step 3**. Ensure that the `doctype` property is set to `standard`. 24 | 25 | Refer to the authoring guidelines for the complete list of document properties. 26 | 27 | NOTE: If there are multiple editors, the names of the editors are listed in the sequence `fullname`, `fullname_2`, `fullname_3`,... 28 | 29 | ### Compiling a Draft OGC Standard with a local Metanorma instance 30 | 31 | To convert the draft document from asciidoc format to HTML and PDF formats, we use the metanorma software to **compile** the document. 32 | 33 | **Step 4**. From the folder containing the `document.adoc` file, run the following command. 34 | 35 | `metanorma compile --agree-to-terms -t ogc -x xml,html,doc document.adoc` 36 | 37 | NOTE: You need to add this option to retrieve licensed fonts `--agree-to-terms` 38 | 39 | ## Using Metanorma from within Docker 40 | 41 | ### Pre-requisite 42 | 43 | Confirm that you have docker installed on your operating system. If you do not have docker installed, follow the steps at the [Get Docker page](https://docs.docker.com/get-docker/) to install it. 44 | 45 | ### Creating a copy of the template 46 | 47 | The template for Standards documents is organized as a folder of asciidoc files, with nested folders for sections, abstract tests, requirements and other resources. 48 | 49 | To create a copy of the template, follow these steps. 50 | 51 | **Step 1**. Pull the latest version of the Metanorma image on to your local docker installation. 52 | 53 | `docker pull metanorma/metanorma:latest` 54 | 55 | **Step 2**. Generate a copy of the template for OGC Standards by running the following command from a terminal (i.e. from the command prompt). 56 | 57 | `docker run --rm -v "$(pwd)":/metanorma metanorma/metanorma metanorma new -d standard -t ogc -l https://github.com/metanorma/metanorma-templates-ogc folder_for_standard` 58 | 59 | NOTE: The `-d standard -t ogc` flags instruct metanorma that the template is for OGC Standards. 60 | 61 | NOTE: The `folder_for_standard` value can be replaced with whatever you would like to be the name of the folder that contains the copy of the template. 62 | 63 | ### Editing a Draft OGC Standard for compilation with Metanorma 64 | 65 | Now that you have generated a copy of the template, you can edit the document. The following steps assume that you have read the **authoring guidelines** are at https://www.metanorma.org/author/ogc/authoring-guide/ 66 | 67 | **Step 3**. Next, edit the asciidoc file `document.adoc` by filling the document properties: `docsubtype`, `status`, `abbrev`, `edition` (i.e. version of the standard), `docnumber` (OGC Document Number), `keywords`, `fullname` (of the editors). 68 | 69 | **Step 4**. Ensure that the `doctype` property is set to `standard`. 70 | 71 | Refer to the authoring guidelines for the complete list of document properties. 72 | 73 | NOTE: If there are multiple editors, the names of the editors are listed in the sequence `fullname`, `fullname_2`, `fullname_3`,... 74 | 75 | ### Compiling a Draft OGC Standard with a docker-containerized Metanorma instance 76 | 77 | To convert the draft standard from asciidoc format to HTML and PDF formats, we use the metanorma software to **compile** the document. 78 | 79 | **Step 5**. From the folder containing the `document.adoc` file, run the following command. 80 | 81 | `docker run -v "$(pwd)":/metanorma -v ${HOME}/.fontist/fonts/:/config/fonts metanorma/metanorma metanorma compile --agree-to-terms -t ogc -x xml,html,doc document.adoc` 82 | 83 | NOTE: You need to add this option to retrieve licensed fonts `--agree-to-terms` 84 | -------------------------------------------------------------------------------- /standard/template/.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | # Auto-generated by Cimas: Do not edit it manually! 2 | # See https://github.com/metanorma/cimas 3 | name: docker 4 | 5 | on: 6 | push: 7 | branches: [ master, main ] 8 | pull_request: 9 | paths-ignore: 10 | - .gitlab-ci.yml 11 | - .github/workflows/test.yml 12 | - .github/workflows/generate.yml 13 | repository_dispatch: 14 | types: [ metanorma/metanorma-docker ] 15 | 16 | jobs: 17 | test-docker: 18 | runs-on: ubuntu-latest 19 | container: docker://metanorma/mn 20 | steps: 21 | - uses: actions/checkout@v2 22 | with: 23 | token: ${{ secrets.METANORMA_CI_PAT_TOKEN || github.token }} 24 | submodules: true 25 | 26 | - uses: actions/cache@v2 27 | with: 28 | path: /config/fonts 29 | key: fontist-docker 30 | restore-keys: fontist-docker 31 | 32 | - uses: actions/cache@v2 33 | with: 34 | path: ~/.metanorma-ietf-workgroup-cache.json 35 | key: metanorma-ietf-workgroup-cache 36 | restore-keys: metanorma-ietf-workgroup-cache 37 | 38 | - uses: metanorma/metanorma-build-scripts/gh-rubygems-setup-action@master 39 | with: 40 | token: ${{ secrets.METANORMA_CI_PAT_TOKEN }} 41 | 42 | - run: | 43 | curl -L --retry 3 https://raw.githubusercontent.com/metanorma/metanorma-build-scripts/master/gemfile-to-bundle-add.sh | bash 44 | 45 | - uses: actions-mn/cli/site-gen@main 46 | with: 47 | agree-to-terms: true 48 | 49 | - uses: actions/upload-artifact@master 50 | with: 51 | name: site 52 | path: site 53 | 54 | deploy-gh-pages: 55 | if: github.ref == 'refs/heads/master' 56 | runs-on: ubuntu-latest 57 | needs: test-docker 58 | steps: 59 | - uses: actions/checkout@v2 60 | 61 | - uses: actions/download-artifact@v1 62 | with: 63 | name: site 64 | 65 | - uses: peaceiris/actions-gh-pages@v3 66 | with: 67 | github_token: ${{ github.token }} 68 | publish_dir: ./site 69 | force_orphan: true 70 | user_name: ${{ github.actor }} 71 | user_email: ${{ format('{0}@users.noreply.github.com', github.actor) }} 72 | commit_message: "${{ format('Deploy to GitHub Pages: {0}', github.sha) }}" 73 | 74 | - uses: kolpav/purge-artifacts-action@v1 75 | with: 76 | token: ${{ github.token }} 77 | expire-in: 0 78 | -------------------------------------------------------------------------------- /standard/template/.github/workflows/generate.yml: -------------------------------------------------------------------------------- 1 | # Auto-generated by Cimas: Do not edit it manually! 2 | # See https://github.com/metanorma/cimas 3 | name: generate 4 | 5 | on: 6 | push: 7 | branches: [ master, main ] 8 | pull_request: 9 | paths-ignore: 10 | - .gitlab-ci.yml 11 | - .github/workflows/test.yml 12 | - .github/workflows/docker.yml 13 | workflow_dispatch: 14 | 15 | jobs: 16 | test-linux: 17 | name: Test on ${{ matrix.os }} 18 | runs-on: ${{ matrix.os }} 19 | strategy: 20 | fail-fast: false 21 | matrix: 22 | os: [ ubuntu-latest, windows-latest, macos-latest ] 23 | steps: 24 | - uses: actions/checkout@v2 25 | with: 26 | token: ${{ secrets.METANORMA_CI_PAT_TOKEN || github.token }} 27 | submodules: true 28 | 29 | - uses: actions/cache@v2 30 | with: 31 | path: ~/.cache/xml2rfc 32 | key: xml2rfc 33 | restore-keys: xml2rfc 34 | 35 | - uses: actions/cache@v2 36 | with: 37 | path: ~/.fontist 38 | key: fontist-${{ runner.os }} 39 | restore-keys: fontist-${{ runner.os }} 40 | 41 | - uses: actions/cache@v2 42 | with: 43 | path: ~/.metanorma-ietf-workgroup-cache.json 44 | key: metanorma-ietf-workgroup-cache 45 | restore-keys: metanorma-ietf-workgroup-cache 46 | 47 | - if: matrix.os == 'windows-latest' 48 | run: rm Gemfile 49 | 50 | - uses: actions-mn/setup@master 51 | 52 | - uses: actions-mn/cli/site-gen@main 53 | with: 54 | agree-to-terms: true 55 | -------------------------------------------------------------------------------- /standard/template/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .swp 3 | .tmp.xml 4 | 5 | # Deploy key 6 | deploy_key 7 | -------------------------------------------------------------------------------- /standard/template/.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | # Auto-generated by Cimas: Do not edit it manually! 2 | # See https://github.com/metanorma/cimas 3 | image: 4 | name: metanorma/mn 5 | entrypoint: [ "" ] 6 | 7 | cache: 8 | paths: 9 | 10 | stages: 11 | - build 12 | - deploy 13 | 14 | 15 | build: 16 | stage: build 17 | script: 18 | # We need to do this to install mscorefonts 19 | - curl -Ls -o yq https://github.com/mikefarah/yq/releases/download/3.3.0/yq_linux_amd64 20 | - chmod +x yq && mv yq /usr/bin 21 | - yq 22 | - apt-add-repository -y contrib && apt-get update 23 | - echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections 24 | - apt-get install -y ttf-mscorefonts-installer 25 | - curl -Ls https://raw.githubusercontent.com/metanorma/vista-fonts-installer/master/vista-fonts-installer.sh | bash 26 | - curl -L --retry 3 https://raw.githubusercontent.com/metanorma/metanorma-build-scripts/master/gemfile-to-bundle-add.sh | bash 27 | - bundle install 28 | - metanorma site generate sources --output-dir public 29 | 30 | artifacts: 31 | paths: 32 | - public 33 | 34 | pages: 35 | dependencies: 36 | - build 37 | stage: deploy 38 | script: 39 | - > 40 | 'curl --location --output artifacts.zip --header 41 | "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/artifacts/master/download?job=build"' 42 | artifacts: 43 | paths: 44 | - public 45 | only: 46 | - master 47 | -------------------------------------------------------------------------------- /standard/template/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "metanorma-cli" 4 | gem "relaton-cli" 5 | -------------------------------------------------------------------------------- /standard/template/Makefile: -------------------------------------------------------------------------------- 1 | # Auto-generated by Cimas: Do not edit it manually! 2 | # See https://github.com/metanorma/cimas 3 | #!make 4 | SHELL := /bin/bash 5 | # Ensure the xml2rfc cache directory exists locally 6 | IGNORE := $(shell mkdir -p $(HOME)/.cache/xml2rfc) 7 | 8 | SRC := $(shell yq r metanorma.yml metanorma.source.files | cut -c 3-) 9 | 10 | ifeq ($(SRC),null) 11 | SRC := 12 | endif 13 | ifeq ($(SRC),ll) 14 | SRC := 15 | endif 16 | 17 | ifeq ($(SRC),) 18 | BUILT := $(shell yq r metanorma.yml metanorma.source.built_targets | cut -d ':' -f 1 | tr -s '\n' ' ') 19 | 20 | ifeq ($(BUILT),null) 21 | SRC := 22 | endif 23 | ifeq ($(BUILT),ll) 24 | SRC := 25 | endif 26 | 27 | ifeq ($(BUILT),) 28 | SRC := $(filter-out README.adoc, $(wildcard sources/*.adoc)) 29 | else 30 | XML := $(patsubst sources/%,documents/%,$(BUILT)) 31 | endif 32 | endif 33 | 34 | FORMATS := $(shell yq r metanorma.yml metanorma.formats | tr -d '[:space:]' | tr -s '-' ' ') 35 | ifeq ($(FORMATS),) 36 | FORMAT_MARKER := mn-output- 37 | FORMATS := $(shell grep "$(FORMAT_MARKER)" $(SRC) | cut -f 2 -d " " | tr "," "\\n" | sort | uniq | tr "\\n" " ") 38 | endif 39 | 40 | XML ?= $(patsubst sources/%,documents/%,$(patsubst %.adoc,%.xml,$(SRC))) 41 | HTML := $(patsubst %.xml,%.html,$(XML)) 42 | 43 | ifdef METANORMA_DOCKER 44 | PREFIX_CMD := echo "Running via docker..."; docker run -v "$$(pwd)":/metanorma/ $(METANORMA_DOCKER) 45 | else 46 | ifdef SKIP_BUNDLE 47 | PREFIX_CMD := echo "Running locally..."; 48 | else 49 | PREFIX_CMD := echo "Running locally via bundle ..."; bundle exec 50 | endif 51 | endif 52 | 53 | _OUT_FILES := $(foreach FORMAT,$(FORMATS),$(shell echo $(FORMAT) | tr '[:lower:]' '[:upper:]')) 54 | OUT_FILES := $(foreach F,$(_OUT_FILES),$($F)) 55 | 56 | define print_vars 57 | $(info "src $(SRC)") 58 | $(info "xml $(XML)") 59 | $(info "formats $(FORMATS)") 60 | endef 61 | 62 | all: documents.html 63 | $(call print_vars) 64 | 65 | documents: 66 | mkdir -p $@ 67 | 68 | documents/%.html: documents/%.xml | documents 69 | ${PREFIX_CMD} metanorma $< 70 | 71 | documents/%.xml: sources/%.xml | documents 72 | mkdir -p $(dir $@) 73 | mv $< $@ 74 | 75 | # Build canonical XML output 76 | # If XML file is provided, copy it over 77 | # Otherwise, build the xml using adoc 78 | sources/%.xml: | bundle 79 | BUILT_TARGET="$(shell yq r metanorma.yml metanorma.source.built_targets[$@])"; \ 80 | if [ "$$BUILT_TARGET" = "" ] || [ "$$BUILT_TARGET" = "null" ]; then \ 81 | BUILT_TARGET=$@; \ 82 | $(PREFIX_CMD) metanorma -x xml "$${BUILT_TARGET//xml/adoc}"; \ 83 | else \ 84 | if [ -f "$$BUILT_TARGET" ] && [ "$${BUILT_TARGET##*.}" == "xml" ]; then \ 85 | cp "$$BUILT_TARGET" $@; \ 86 | else \ 87 | $(PREFIX_CMD) metanorma -x xml $$BUILT_TARGET; \ 88 | cp "$${BUILT_TARGET//adoc/xml}" $@; \ 89 | fi \ 90 | fi 91 | 92 | documents.rxl: $(XML) $(HTML) 93 | ${PREFIX_CMD} relaton concatenate \ 94 | -t "$(shell yq r metanorma.yml relaton.collection.name)" \ 95 | -g "$(shell yq r metanorma.yml relaton.collection.organization)" \ 96 | documents $@ 97 | 98 | documents.html: documents.rxl 99 | $(PREFIX_CMD) relaton xml2html documents.rxl 100 | 101 | %.adoc: 102 | 103 | define FORMAT_TASKS 104 | OUT_FILES-$(FORMAT) := $($(shell echo $(FORMAT) | tr '[:lower:]' '[:upper:]')) 105 | 106 | open-$(FORMAT): 107 | open $$(OUT_FILES-$(FORMAT)) 108 | 109 | clean-$(FORMAT): 110 | rm -f $$(OUT_FILES-$(FORMAT)) 111 | 112 | $(FORMAT): clean-$(FORMAT) $$(OUT_FILES-$(FORMAT)) 113 | 114 | .PHONY: clean-$(FORMAT) 115 | 116 | endef 117 | 118 | $(foreach FORMAT,$(FORMATS),$(eval $(FORMAT_TASKS))) 119 | 120 | open: open-html 121 | 122 | clean: 123 | rm -rf documents documents.{html,rxl} published *_images $(OUT_FILES) 124 | 125 | bundle: 126 | ifndef METANORMA_DOCKER 127 | ifndef SKIP_BUNDLE 128 | bundle install --jobs 4 --retry 3 129 | endif 130 | endif 131 | $(call print_vars) 132 | 133 | .PHONY: bundle all open clean 134 | 135 | # 136 | # Watch-related jobs 137 | # 138 | 139 | .PHONY: watch serve watch-serve 140 | 141 | NODE_BINS := onchange live-serve run-p 142 | NODE_BIN_DIR := node_modules/.bin 143 | NODE_PACKAGE_PATHS := $(foreach PACKAGE_NAME,$(NODE_BINS),$(NODE_BIN_DIR)/$(PACKAGE_NAME)) 144 | 145 | $(NODE_PACKAGE_PATHS): package.json 146 | npm i 147 | 148 | watch: $(NODE_BIN_DIR)/onchange 149 | make all 150 | $< $(ALL_SRC) -- make all 151 | 152 | define WATCH_TASKS 153 | watch-$(FORMAT): $(NODE_BIN_DIR)/onchange 154 | make $(FORMAT) 155 | $$< $$(SRC_$(FORMAT)) -- make $(FORMAT) 156 | 157 | .PHONY: watch-$(FORMAT) 158 | endef 159 | 160 | $(foreach FORMAT,$(FORMATS),$(eval $(WATCH_TASKS))) 161 | 162 | serve: $(NODE_BIN_DIR)/live-server revealjs-css reveal.js 163 | export PORT=$${PORT:-8123} ; \ 164 | port=$${PORT} ; \ 165 | for html in $(HTML); do \ 166 | $< --entry-file=$$html --port=$${port} --ignore="*.html,*.xml,Makefile,Gemfile.*,package.*.json" --wait=1000 & \ 167 | port=$$(( port++ )) ;\ 168 | done 169 | 170 | watch-serve: $(NODE_BIN_DIR)/run-p 171 | $< watch serve 172 | 173 | # 174 | # Deploy jobs 175 | # 176 | 177 | publish: published 178 | 179 | published: documents.html 180 | mkdir -p $@ && \ 181 | cp -a documents $@/ && \ 182 | cp $< $@/index.html; 183 | 184 | # 185 | # PDF 186 | # 187 | 188 | PDFTEXT := $(patsubst %.pdf,%.txt,$(subst /pdfs,/text,$(wildcard reference-docs/pdfs/*.pdf))) 189 | 190 | pdf2text: $(PDFTEXT) 191 | 192 | reference-docs/text: 193 | mkdir -p $@ 194 | 195 | reference-docs/text/%.txt: reference-docs/pdfs/%.pdf | reference-docs/text 196 | ps2ascii "$<" "$@" 197 | -------------------------------------------------------------------------------- /standard/template/Makefile.win: -------------------------------------------------------------------------------- 1 | # Auto-generated by Cimas: Do not edit it manually! 2 | # See https://github.com/metanorma/cimas 3 | #!make 4 | SHELL := cmd 5 | # Ensure the xml2rfc cache directory exists locally 6 | IGNORE := $(shell md $(USERPROFILE)\.cache\xml2rfc) 7 | 8 | SRC := $(shell yq r metanorma.yml metanorma.source.files | cut -c 3-) 9 | 10 | ifeq ($(SRC),null) 11 | SRC := 12 | endif 13 | ifeq ($(SRC),ll) 14 | SRC := 15 | endif 16 | 17 | ifeq ($(SRC),) 18 | BUILT := $(subst ${ },${\n},$(shell yq r metanorma.yml metanorma.source.built_targets | cut -d ":" -f 1)) 19 | 20 | ifeq ($(BUILT),null) 21 | BUILT := 22 | SRC := 23 | endif 24 | ifeq ($(BUILT),ll) 25 | BUILT := 26 | SRC := 27 | endif 28 | ifeq ($(BUILT),) 29 | SRC := 30 | endif 31 | 32 | ifeq ($(BUILT),) 33 | SRC := $(filter-out README.adoc, $(wildcard sources/*.adoc)) 34 | else 35 | XML := $(patsubst sources/%,documents/%,$(BUILT)) 36 | endif 37 | endif 38 | 39 | FORMATS := $(subst -,${ },$(strip $(shell yq r metanorma.yml metanorma.formats))) 40 | ifeq ($(FORMATS),null) 41 | FORMATS := 42 | endif 43 | ifeq ($(FORMATS),) 44 | FORMAT_MARKER := mn-output- 45 | FORMATS := $(subst ${\n},${ },$(shell grep "$(FORMAT_MARKER)" $(SRC) | cut -f 2 -d " " | tr "," "\n" | sort | uniq)) 46 | endif 47 | 48 | XML ?= $(patsubst sources/%,documents/%,$(patsubst %.adoc,%.xml,$(SRC))) 49 | HTML := $(patsubst %.xml,%.html,$(XML)) 50 | 51 | ifdef METANORMA_DOCKER 52 | PREFIX_CMD := echo "Running via docker..." & docker run -v "$$(pwd)":/metanorma/ $(METANORMA_DOCKER) 53 | else 54 | ifdef SKIP_BUNDLE 55 | PREFIX_CMD := echo "Running locally..." & 56 | else 57 | PREFIX_CMD := echo "Running locally via bundle ..." & bundle exec 58 | endif 59 | endif 60 | 61 | _OUT_FILES := $(foreach FORMAT,$(FORMATS),$(shell echo $(FORMAT) | tr '[:lower:]' '[:upper:]')) 62 | OUT_FILES := $(foreach F,$(_OUT_FILES),$($F)) 63 | 64 | define print_vars 65 | $(info "src $(SRC)") 66 | $(info "xml $(XML)") 67 | $(info "formats $(FORMATS)") 68 | endef 69 | 70 | all: documents.html 71 | $(call print_vars) 72 | 73 | documents: 74 | setlocal enableextensions & md $@ & endlocal 75 | 76 | documents/%.html: documents/%.xml | documents 77 | ${PREFIX_CMD} metanorma $< 78 | 79 | documents/%.xml: sources/%.xml | documents 80 | if not exist "$(subst /,\,$(dir $@))" md "$(subst /,\,$(dir $@))" 81 | move "$(subst /,\,$<)" "$(subst /,\,$@)" 82 | 83 | # Build canonical XML output 84 | # If XML file is provided, copy it over 85 | # Otherwise, build the xml using adoc 86 | sources/%.xml: | bundle 87 | $(eval BUILT_TARGET := $(subst /,\,$(shell yq r metanorma.yml metanorma.source.built_targets[$@]))) 88 | $(eval BUILT_TARGET_EMPTY := $(if $(filter $(or $(BUILT_TARGET),null),null ll),true,false)) 89 | if "$(BUILT_TARGET_EMPTY)" == "true" ( \ 90 | $(PREFIX_CMD) metanorma -x xml "$(subst xml,adoc,$@)" \ 91 | ) else ( \ 92 | if exist "$(BUILT_TARGET)" ( \ 93 | if "$(suffix $(BUILT_TARGET))" == ".xml" ( \ 94 | copy "$(BUILT_TARGET)" "$(subst /,\,$@)" \ 95 | ) else ( \ 96 | $(PREFIX_CMD) metanorma $(BUILT_TARGET) & \ 97 | copy "$(subst adoc,xml,$(BUILT_TARGET))" "$(subst /,\,$@)" \ 98 | ) \ 99 | ) else ( \ 100 | $(PREFIX_CMD) metanorma $(BUILT_TARGET) & \ 101 | copy "$(subst adoc,xml,$(BUILT_TARGET))" "$(subst /,\,$@)" \ 102 | ) \ 103 | ) 104 | 105 | documents.rxl: $(XML) $(HTML) 106 | ${PREFIX_CMD} relaton concatenate \ 107 | -t "$(shell yq r metanorma.yml relaton.collection.name)" \ 108 | -g "$(shell yq r metanorma.yml relaton.collection.organization)" \ 109 | documents $@ 110 | 111 | documents.html: documents.rxl 112 | $(PREFIX_CMD) relaton xml2html documents.rxl 113 | 114 | %.adoc: 115 | 116 | define FORMAT_TASKS 117 | OUT_FILES-$(FORMAT) := $($(shell echo $(FORMAT) | tr '[:lower:]' '[:upper:]')) 118 | 119 | open-$(FORMAT): 120 | "$$(OUT_FILES-$(FORMAT))" 121 | 122 | clean-$(FORMAT): 123 | del /q $$(OUT_FILES-$(FORMAT)) 124 | 125 | $(FORMAT): clean-$(FORMAT) $$(OUT_FILES-$(FORMAT)) 126 | 127 | .PHONY: clean-$(FORMAT) 128 | 129 | endef 130 | 131 | $(foreach FORMAT,$(FORMATS),$(eval $(FORMAT_TASKS))) 132 | 133 | open: open-html 134 | 135 | clean: 136 | rm -rf $(OUT_FILES) 137 | del /q documents published 138 | del /q *_images 139 | del /q documents.* 140 | 141 | bundle: 142 | ifndef METANORMA_DOCKER 143 | ifndef SKIP_BUNDLE 144 | bundle install --jobs 4 --retry 3 145 | endif 146 | endif 147 | $(call print_vars) 148 | 149 | .PHONY: bundle all open clean 150 | 151 | # 152 | # Watch-related jobs 153 | # 154 | 155 | .PHONY: watch serve watch-serve 156 | 157 | NODE_BINS := onchange live-serve run-p 158 | NODE_BIN_DIR := node_modules/.bin 159 | NODE_PACKAGE_PATHS := $(foreach PACKAGE_NAME,$(NODE_BINS),$(NODE_BIN_DIR)/$(PACKAGE_NAME)) 160 | 161 | $(NODE_PACKAGE_PATHS): package.json 162 | npm i 163 | 164 | watch: $(NODE_BIN_DIR)/onchange 165 | make all 166 | $< $(ALL_SRC) -- make all 167 | 168 | define WATCH_TASKS 169 | watch-$(FORMAT): $(NODE_BIN_DIR)/onchange 170 | make $(FORMAT) 171 | $$< $$(SRC_$(FORMAT)) -- make $(FORMAT) 172 | 173 | .PHONY: watch-$(FORMAT) 174 | endef 175 | 176 | $(foreach FORMAT,$(FORMATS),$(eval $(WATCH_TASKS))) 177 | 178 | ifndef PORT 179 | override PORT = 8123 180 | endif 181 | 182 | serve: $(NODE_BIN_DIR)/live-server revealjs-css reveal.js 183 | set port=$(PORT) & \ 184 | for /r %%html in $(HTML) do ( \ 185 | $< --entry-file=%%html --port=%port% --ignore="*.html,*.xml,Makefile,Gemfile.*,package.*.json" --wait=1000 & \ 186 | set /A port=%port%+1 \ 187 | ) 188 | 189 | watch-serve: $(NODE_BIN_DIR)/run-p 190 | $< watch serve 191 | 192 | # 193 | # Deploy jobs 194 | # 195 | 196 | publish: published 197 | 198 | published: documents.html 199 | setlocal enableextensions & md $@ & endlocal 200 | copy documents $@/ 201 | copy $< $@/index.html 202 | if exist "source\images" xcopy /E source\images $@ 203 | 204 | # 205 | # PDF 206 | # 207 | 208 | PDFTEXT := $(patsubst %.pdf,%.txt,$(subst /pdfs,/text,$(wildcard reference-docs/pdfs/*.pdf))) 209 | 210 | pdf2text: $(PDFTEXT) 211 | 212 | reference-docs/text: 213 | md $@ 214 | 215 | reference-docs/text/%.txt: reference-docs/pdfs/%.pdf | reference-docs/text 216 | ps2ascii "$<" "$@" 217 | -------------------------------------------------------------------------------- /standard/template/README.adoc: -------------------------------------------------------------------------------- 1 | = Standard template in Metanorma 2 | 3 | == Content 4 | 5 | This repository contains the content for an OGC standard. 6 | 7 | * `document.adoc` - the main standard document with references to all sections 8 | * remaining ``adoc``s - each section of the standard document is in a separate document: follow directions in each document to populate 9 | * `figures` - figures go here 10 | * `images` - Image files for graphics go here. Image files for figures go in the `figures` directory. Only place in here images not used in figures (e.g., as parts of tables, as logos, etc.) 11 | * `requirements` - directory for requirements and requirement classes to be referenced in `clause_7_normative_text.adoc` 12 | * `code` - sample code to accompany the standard, if desired 13 | * `abstract_tests` - the Abstract Test Suite comprising one test for every requirement, optional 14 | * `UML` - UML diagrams, if applicable 15 | 16 | == Building 17 | 18 | Run `make`. 19 | -------------------------------------------------------------------------------- /standard/template/UML/README.adoc: -------------------------------------------------------------------------------- 1 | Store UML content in this directory. Feel free to use any organizational scheme that you like. 2 | 3 | Figures derived from UML diagrams should be placed in the "figures" folder. 4 | -------------------------------------------------------------------------------- /standard/template/abstract_tests/ATS_class_example1.adoc: -------------------------------------------------------------------------------- 1 | [[ats_example1]] 2 | [conformance_class_example1] 3 | ==== 4 | [%metadata] 5 | label:: http://www.opengis.net/spec/name-of-standard/1.0/conf/example1 6 | subject:: Requirements Class "example1" 7 | classification:: Target Type:Web API 8 | ==== 9 | 10 | ==== Example 1 11 | 12 | include::./ATS_test_example1.adoc[] 13 | 14 | ==== Example 2 15 | 16 | include::./ATS_test_example2.adoc[] 17 | -------------------------------------------------------------------------------- /standard/template/abstract_tests/ATS_test_example1.adoc: -------------------------------------------------------------------------------- 1 | [[ats_core_api-definition-op]] 2 | [abstract_test] 3 | ==== 4 | [%metadata] 5 | label:: /conf/core/api-definition-op 6 | subject:: /req/req-class-a/req-name-1 7 | test-purpose:: Validate that the API Definition document can be retrieved from the expected location. 8 | 9 | [.component,class=test method] 10 | ===== 11 | [.component,class=step] 12 | -- 13 | Construct a path for the API Definition document that ends with `/api`. 14 | -- 15 | 16 | [.component,class=step] 17 | -- 18 | Issue a HTTP GET request on that path 19 | -- 20 | 21 | [.component,class=step] 22 | -- 23 | Validate the contents of the returned document using test <>. 24 | -- 25 | ===== 26 | ==== 27 | -------------------------------------------------------------------------------- /standard/template/abstract_tests/ATS_test_example2.adoc: -------------------------------------------------------------------------------- 1 | [[ats_core_http]] 2 | [abstract_test] 3 | ==== 4 | [%metadata] 5 | label:: /conf/core/http 6 | subject:: /req/req-class-a/req-name-2 7 | test-purpose:: Validate that the resource paths advertised through the API conform with HTTP 1.1 and, where appropriate, TLS. 8 | 9 | [.component,class=test method] 10 | ===== 11 | [.component,class=step] 12 | -- 13 | All compliance tests SHALL be configured to use the HTTP 1.1 protocol exclusively. 14 | -- 15 | 16 | [.component,class=step] 17 | -- 18 | For APIs which support HTTPS, all compliance tests SHALL be configured to use <> (RFC 2818) with their HTTP 1.1 protocol. 19 | -- 20 | ===== 21 | ==== 22 | -------------------------------------------------------------------------------- /standard/template/abstract_tests/README.adoc: -------------------------------------------------------------------------------- 1 | This folder contains the Abstract Test Suite. 2 | 3 | The test is expressed according to this pattern: 4 | 5 | NOTE: for each test, there should be a corresponding requirement in the "requirements" folder. 6 | -------------------------------------------------------------------------------- /standard/template/code/README.adoc: -------------------------------------------------------------------------------- 1 | Sample code may be stored in this folder, organized as you see fit 2 | -------------------------------------------------------------------------------- /standard/template/document.adoc: -------------------------------------------------------------------------------- 1 | = OGC (add title text) 2 | :doctype: standard 3 | :encoding: utf-8 4 | :lang: en 5 | :status: draft 6 | :committee: technical 7 | :draft: 3.0 8 | :external-id: http://www.opengis.net/doc/{doc-type}/{standard}/{m.n} 9 | :docnumber: YY-999 10 | :received-date: 2029-03-30 11 | :issued-date: 2029-03-30 12 | :published-date: 2029-03-30 13 | :fullname: Editor One 14 | :fullname_2: Editor Two 15 | :docsubtype: Interface 16 | :keywords: ogcdoc, OGC document, API, openapi, html 17 | :submitting-organizations: Organization One; Organization Two 18 | :mn-document-class: ogc 19 | :mn-output-extensions: xml,html,doc,pdf 20 | :local-cache-only: 21 | :data-uri-image: 22 | :pdf-uri: ./document.pdf 23 | :xml-uri: ./document.xml 24 | :doc-uri: ./document.doc 25 | :edition: 1.0 26 | 27 | //// 28 | Make sure to complete each included document 29 | //// 30 | include::sections/clause_0_front_material.adoc[] 31 | 32 | include::sections/clause_1_scope.adoc[] 33 | 34 | include::sections/clause_2_conformance.adoc[] 35 | 36 | include::sections/clause_3_references.adoc[] 37 | 38 | include::sections/clause_4_terms_and_definitions.adoc[] 39 | 40 | include::sections/clause_5_conventions.adoc[] 41 | 42 | include::sections/clause_6_informative_text.adoc[] 43 | 44 | include::sections/clause_7_normative_text.adoc[] 45 | 46 | include::sections/clause_8_media_types.adoc[] 47 | 48 | //// 49 | add or remove annexes after "A" as necessary 50 | //// 51 | include::sections/annex-a.adoc[] 52 | 53 | include::sections/annex-n.adoc[] 54 | 55 | //// 56 | Revision History should be the last annex before the Bibliography 57 | Bibliography should be the last annex 58 | //// 59 | include::sections/annex-history.adoc[] 60 | 61 | include::sections/annex-bibliography.adoc[] 62 | -------------------------------------------------------------------------------- /standard/template/figures/README.adoc: -------------------------------------------------------------------------------- 1 | Figures go here. 2 | 3 | Each figure is a separate file with the naming convention: 4 | 5 | "FIGn.xxx" where "n" is a number with leading zeroes appropriate for the total number of figures and "xxx" is the appropriate extension for the file type. -------------------------------------------------------------------------------- /standard/template/images/README.adoc: -------------------------------------------------------------------------------- 1 | Image files for graphics go here. Image files for figures go in the "figures" directory. Only place in here images not used in figures (e.g., as parts of tables, as logos, etc.) 2 | 3 | Each graphic is a separate file with the naming convention: 4 | 5 | "GRPn.xxx" where "n" is a sequential number with leading zeroes appropriate for the total number of graphics and "xxx" is the appropriate extension for the file type. 6 | -------------------------------------------------------------------------------- /standard/template/metanorma.yml: -------------------------------------------------------------------------------- 1 | --- 2 | metanorma: 3 | deploy: 4 | email: "ci@metanorma.org" 5 | -------------------------------------------------------------------------------- /standard/template/requirements/README.adoc: -------------------------------------------------------------------------------- 1 | This folder contains requirements description. 2 | 3 | Each file is a single requirement. The naming convention for these files is: 4 | 5 | "REQn.adoc" where "n" corresponds to the requirement number. Numbers should have preceding zeros appropriate for the total number of requirements in the project (e.g., the first requirement could be REQ001 if less than 1000 requirements are anticipated). 6 | 7 | The requirement files are integrated into the main document as links. 8 | 9 | The requirement is expressed according to this pattern: 10 | 11 | NOTE: for each requirement, there should be a corresponding Abstract Test in the "abstract_tests" folder. 12 | 13 | NOTE: sample code may reference one or more requirements and should state which requirements are included in the code by adding the following line to the Extended Description: 14 | 15 | "#REQS: reqnum1,reqnum2,...reqnumn" 16 | -------------------------------------------------------------------------------- /standard/template/requirements/requirement001.adoc: -------------------------------------------------------------------------------- 1 | [requirement,type="general",id="/req/req-class-a/req-name-1",label="/req/req-class-a/req-name-1",obligation="requirement"] 2 | ==== 3 | 4 | Requirement 'shall' statement 5 | 6 | ==== 7 | -------------------------------------------------------------------------------- /standard/template/requirements/requirement002.adoc: -------------------------------------------------------------------------------- 1 | [[req_core_process-execute-input-inline-object]] 2 | [requirement] 3 | ==== 4 | [%metadata] 5 | label:: /req/req-class-a/req-name-2 6 | [.component,class=conditions] 7 | -- 8 | . The process input value is specified in-line in an execute request. 9 | . The process input is defined as an object according to its schema. 10 | -- 11 | 12 | [.component,class=part] 13 | -- 14 | The server SHALL support process input values encoded as qualified values. 15 | -- 16 | 17 | [.component,class=part] 18 | -- 19 | The value of the `value` key SHALL be an _object_ instance. 20 | -- 21 | ==== 22 | -------------------------------------------------------------------------------- /standard/template/requirements/requirements_class.adoc: -------------------------------------------------------------------------------- 1 | //// 2 | [cols="1,4",width="90%"] 3 | |=== 4 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 5 | 2+|http://www.opengis.net/spec/ABCD/m.n/req/req-class-a {set:cellbgcolor:#FFFFFF} 6 | |Target type |Token 7 | |Dependency |http://www.example.org/req/blah 8 | |Dependency |urn:iso:ts:iso:19139:clause:6 9 | |*Requirement 1* {set:cellbgcolor:#CACCCE} |http://www.opengis.net/spec/ABCD/m.n/req/req-class-a/req-name-1 + 10 | requirement description {set:cellbgcolor:#FFFFFF} 11 | |*Requirement 2* {set:cellbgcolor:#CACCCE} |http://www.opengis.net/spec/ABCD/m.n/req/req-class-a/req-name-2 + 12 | requirement description {set:cellbgcolor:#FFFFFF} 13 | 14 | |*Requirement 3* {set:cellbgcolor:#CACCCE} |http://www.opengis.net/spec/ABCD/m.n/req/req-class-a/req-name-3 + 15 | requirement description 16 | {set:cellbgcolor:#FFFFFF} 17 | |=== 18 | //// 19 | 20 | 21 | [requirement,type="class",id="http://www.opengis.net/spec/ABCD/m.n/req/req-class-a",obligation="requirement"] 22 | ==== 23 | 24 | Requirements Class 25 | 26 | [dependency] 27 | -- 28 | * http://www.example.org/req/blah 29 | * urn:iso:ts:iso:19139:clause:6 30 | -- 31 | 32 | [requirement,type="general",label="/req/req-class-a/req-name-1"] 33 | ====== 34 | 35 | ====== 36 | 37 | [requirement,type="general",label="/req/req-class-a/req-name-2"] 38 | ====== 39 | 40 | ====== 41 | 42 | ==== 43 | -------------------------------------------------------------------------------- /standard/template/sections/annex-a.adoc: -------------------------------------------------------------------------------- 1 | [appendix] 2 | == Conformance Class Abstract Test Suite (Normative) 3 | 4 | [NOTE] 5 | Ensure that there is a conformance class for each requirements class and a test for each requirement (identified by requirement name and number) 6 | 7 | === Conformance Class A 8 | 9 | include::../abstract_tests/ATS_class_example1.adoc[] 10 | -------------------------------------------------------------------------------- /standard/template/sections/annex-bibliography.adoc: -------------------------------------------------------------------------------- 1 | [bibliography] 2 | [[Bibliography]] 3 | == Bibliography 4 | 5 | [NOTE] 6 | .Example Bibliography (Delete this note). 7 | =============================================== 8 | The TC has approved Springer LNCS as the official document citation type. 9 | 10 | Springer LNCS is widely used in technical and computer science journals and other publications 11 | 12 | * For citations in the text please use square brackets and consecutive numbers: [1], [2], [3] 13 | 14 | – Actual References: 15 | 16 | [n] Journal: Author Surname, A.: Title. Publication Title. Volume number, Issue number, Pages Used (Year Published) 17 | 18 | [n] Web: Author Surname, A.: Title, http://Website-Url 19 | 20 | =============================================== 21 | 22 | * [[[OGC2015,OGCTB12]]], _OGC: OGC Testbed 12 Annex B: Architecture_ (2015). 23 | -------------------------------------------------------------------------------- /standard/template/sections/annex-history.adoc: -------------------------------------------------------------------------------- 1 | [appendix] 2 | == Revision History 3 | 4 | [width="90%",options="header"] 5 | |=== 6 | |Date |Release |Editor | Primary clauses modified |Description 7 | |2016-04-28 |0.1 |G. Editor |all |initial version 8 | |=== 9 | -------------------------------------------------------------------------------- /standard/template/sections/annex-n.adoc: -------------------------------------------------------------------------------- 1 | [appendix,obligation="informative"] 2 | == Title 3 | 4 | [NOTE] 5 | Place other Annex material in sequential annexes beginning with "B" and leave final two annexes for the Revision History and Bibliography 6 | -------------------------------------------------------------------------------- /standard/template/sections/clause_0_front_material.adoc: -------------------------------------------------------------------------------- 1 | .Preface 2 | 3 | [NOTE] 4 | ==== 5 | Insert Preface Text here. Give OGC specific commentary: describe the technical content, reason for document, history of the document and precursors, and plans for future work. 6 | ==== 7 | 8 | //// 9 | *OGC Declaration* 10 | //// 11 | 12 | Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. The Open Geospatial Consortium shall not be held responsible for identifying any or all such patent rights. 13 | 14 | Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by any implementation of the standard set forth in this document, and to provide supporting documentation. 15 | 16 | //// 17 | NOTE: Uncomment ISO section if necessary 18 | 19 | *ISO Declaration* 20 | 21 | ISO (the International Organization for Standardization) is a worldwide federation of national standards bodies (ISO member bodies). The work of preparing International Standards is normally carried out through ISO technical committees. Each member body interested in a subject for which a technical committee has been established has the right to be represented on that committee. International organizations, governmental and non-governmental, in liaison with ISO, also take part in the work. ISO collaborates closely with the International Electrotechnical Commission (IEC) on all matters of electrotechnical standardization. 22 | 23 | International Standards are drafted in accordance with the rules given in the ISO/IEC Directives, Part 2. 24 | 25 | The main task of technical committees is to prepare International Standards. Draft International Standards adopted by the technical committees are circulated to the member bodies for voting. Publication as an International Standard requires approval by at least 75 % of the member bodies casting a vote. 26 | 27 | Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. ISO shall not be held responsible for identifying any or all such patent rights. 28 | //// 29 | 30 | [abstract] 31 | == Abstract 32 | 33 | 34 | 35 | 36 | 37 | == Preface 38 | 39 | [NOTE] 40 | ==== 41 | Insert Preface Text here. Give OGC specific commentary: describe the technical content, reason for document, history of the document and precursors, and plans for future work. > 42 | Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. The Open Geospatial Consortium shall not be held responsible for identifying any or all such patent rights. 43 | 44 | Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by any implementation of the standard set forth in this document, and to provide supporting documentation. 45 | ==== 46 | 47 | == Security considerations 48 | 49 | //If no security considerations have been made for this Standard, use the following text. 50 | 51 | No security considerations have been made for this Standard. 52 | 53 | //// 54 | If security considerations have been made for this Standard, follow the examples found in IANA or IETF documents. Please see the following example. 55 | “VRRP is designed for a range of internetworking environments that may employ different security policies. The protocol includes several authentication methods ranging from no authentication, simple clear text passwords, and strong authentication using IP Authentication with MD5 HMAC. The details on each approach including possible attacks and recommended environments follows. 56 | Independent of any authentication type VRRP includes a mechanism (setting TTL=255, checking on receipt) that protects against VRRP packets being injected from another remote network. This limits most vulnerabilities to local attacks. 57 | NOTE: The security measures discussed in the following sections only provide various kinds of authentication. No confidentiality is provided at all. This should be explicitly described as outside the scope....” 58 | //// 59 | 60 | 61 | 62 | == Submitters 63 | 64 | All questions regarding this submission should be directed to the editor or the submitters: 65 | 66 | |=== 67 | |*Name* |*Affiliation* 68 | | | 69 | |=== 70 | 71 | == Contributors 72 | 73 | //This clause is optional. 74 | 75 | Additional contributors to this Standard include the following: 76 | 77 | Individual name(s), Organization 78 | -------------------------------------------------------------------------------- /standard/template/sections/clause_1_scope.adoc: -------------------------------------------------------------------------------- 1 | == Scope 2 | [NOTE] 3 | ==== 4 | Insert Scope text here. Give the subject of the document and the aspects of that scope covered by the document. 5 | ==== 6 | -------------------------------------------------------------------------------- /standard/template/sections/clause_2_conformance.adoc: -------------------------------------------------------------------------------- 1 | == Conformance 2 | This standard defines XXXX. 3 | 4 | Requirements for N standardization target types are considered: 5 | 6 | * AAAA 7 | * BBBB 8 | 9 | Conformance with this standard shall be checked using all the relevant tests specified in Annex A (normative) of this document. The framework, concepts, and methodology for testing, and the criteria to be achieved to claim conformance are specified in the OGC Compliance Testing Policies and Procedures and the OGC Compliance Testing web site. 10 | 11 | In order to conform to this OGC® interface standard, a software implementation shall choose to implement: 12 | 13 | * Any one of the conformance levels specified in Annex A (normative). 14 | * Any one of the Distributed Computing Platform profiles specified in Annexes TBD through TBD (normative). 15 | 16 | All requirements-classes and conformance-classes described in this document are owned by the standard(s) identified. 17 | -------------------------------------------------------------------------------- /standard/template/sections/clause_3_references.adoc: -------------------------------------------------------------------------------- 1 | [bibliography] 2 | == References 3 | 4 | The following normative documents contain provisions that, through reference in this text, constitute provisions of this document. For dated references, subsequent amendments to, or revisions of, any of these publications do not apply. For undated references, the latest edition of the normative document referred to applies. 5 | 6 | [NOTE] 7 | ==== 8 | Insert References here. If there are no references, leave this section empty. 9 | 10 | References are to follow the Springer LNCS style, with the exception that optional information may be appended to references: DOIs are added after the date and web resource references may include an access date at the end of the reference in parentheses. See examples from Springer and OGC below. 11 | ==== 12 | 13 | * [[[Smith81,Identification of Common Molecular Subsequences]]], 14 | _Identification of Common Molecular Subsequences_. 15 | Smith, T.F., Waterman, M.S., J. Mol. Biol. 147, 195–197 (1981) 16 | 17 | * [[[May06,ZIB Structure Prediction Pipeline]]], 18 | _ZIB Structure Prediction Pipeline: Composing a Complex Biological Workflow through Web Services_. 19 | May, P., Ehrlich, H.C., Steinke, T. In: Nagel, W.E., Walter, 20 | W.V., Lehner, W. (eds.) Euro-Par 2006. LNCS, vol. 4128, pp. 1148–1158. Springer, 21 | Heidelberg (2006) 22 | 23 | * [[[Grid,The Grid]]], _The Grid: Blueprint for a New Computing Infrastructure._, 24 | Foster, I., Kesselman, C.. Morgan Kaufmann, San Francisco (1999). 25 | 26 | * [[[Czajkowski01,Grid Information Services for Distributed Resource Sharing]]], 27 | _Grid Information Services for Distributed Resource Sharing._ 28 | Czajkowski, K., Fitzgerald, S., Foster, I., Kesselman, C. In: 10th IEEE International Symposium on High 29 | Performance Distributed Computing, pp. 181–184. IEEE Press, New York (2001) 30 | 31 | * [[[Foster02,The Physiology of the Grid]]], 32 | _The Physiology of the Grid: an Open Grid Services Architecture for Distributed Systems Integration._ 33 | Foster, I., Kesselman, C., Nick, J., Tuecke, S. Technical report, Global Grid Forum (2002) 34 | 35 | * [[[NCBI,NCBI]]], _National Center for Biotechnology Information_, http://www.ncbi.nlm.nih.gov 36 | 37 | * [[[ISO19101-1,ISO 19101-1:2014]]], Geographic information -- Reference model -- Part 1: Fundamentals 38 | 39 | * [[[ISO19115-1,ISO 19115-1:2014]]], _Geographic information -- Metadata -- Part 1: Fundamentals_ 40 | 41 | * [[[ISO19157,ISO 19157:2013]]], _Geographic information -- Data quality_ 42 | 43 | * [[[ISO19139,ISO 19139:2007]]], _Geographic information -- Metadata -- XML schema implementation_ 44 | 45 | * [[[ISO19115-3,ISO 19115-3]]], _Geographic information -- Metadata -- Part 3: XML schemas_ (2016) 46 | 47 | * [[[OGC15-097,OGC 15-097]]], _OGC Geospatial User Feedback Standard: Conceptual Model_ (2016) 48 | 49 | * [[[OGC12-019,OGC 12-019]]], _OGC City Geography Markup Language (CityGML) Encoding Standard_ (2012) 50 | 51 | * [[[OGC14-005r3,OGC 14-005r3]]], _OGC IndoorGML_ (2014) 52 | 53 | * [[[OGC06121r9,OGC 06-121r9]]], _OGC Web Service Common Implementation Specification_, April 7, 2010. http://portal.opengeospatial.org/files/?artifact_id=38867 -------------------------------------------------------------------------------- /standard/template/sections/clause_4_terms_and_definitions.adoc: -------------------------------------------------------------------------------- 1 | == Terms and definitions 2 | 3 | This document uses the terms defined in Sub-clause 5.3 of <>, 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. 4 | 5 | For the purposes of this document, the following additional terms and definitions apply. 6 | 7 | === example term 8 | 9 | term used for exemplary purposes 10 | 11 | [.source] 12 | <> 13 | 14 | NOTE: An example note. 15 | 16 | [example] 17 | Here's an example of an example term. 18 | -------------------------------------------------------------------------------- /standard/template/sections/clause_5_conventions.adoc: -------------------------------------------------------------------------------- 1 | == Conventions 2 | 3 | This sections provides details and examples for any conventions used in the document. Examples of conventions are symbols, abbreviations, use of XML schema, or special notes regarding how to read the document. 4 | 5 | === Identifiers 6 | The normative provisions in this standard are denoted by the URI 7 | 8 | `http://www.opengis.net/spec/{standard}/{m.n}` 9 | 10 | All requirements and conformance tests that appear in this document are denoted by partial URIs which are relative to this base. 11 | -------------------------------------------------------------------------------- /standard/template/sections/clause_6_informative_text.adoc: -------------------------------------------------------------------------------- 1 | [obligation=informative] 2 | == Clauses not containing normative material 3 | 4 | Paragraph 5 | 6 | === Clauses not containing normative material sub-clause 1 7 | 8 | Paragraph 9 | 10 | === Clauses not containing normative material sub-clause 2 11 | -------------------------------------------------------------------------------- /standard/template/sections/clause_7_annex_mapping.adoc.adoc: -------------------------------------------------------------------------------- 1 | == GeoZarr format requirements 2 | 3 | TIP: This is a very preliminary draft. The content is primarily for demonstrating the purpose of the proposed sections. The main focus should be on the table of contents. 4 | 5 | A GeoZarr data format is a regular Zarr hierarchy that represents geospatial coverages such as granules, scenes series, mosaics or any spatio temporal asset (as per STAC specification). 6 | 7 | === Overview and Definitions 8 | 9 | The OGC Abstract Topic 6 [OGC 07-011] standard defines all geographic object as a feature, with coverage being a special type for any digital geospatial information representing space and time varying phenomena. The ISO 19123 standard provides a formal definition for coverages: a "feature acting as a function that returns values from its range for any direct position within its spatiotemporal domain". 10 | 11 | GeoZarr, like many array-oriented geospatial data formats (e.g., NetCDF, GeoTIFF), primarily supports *Rectified Grid Coverages*. Rectified Grid Coverage is a type of grid coverage that aligns with a coordinate reference system, ensuring that each cell or grid point corresponds precisely to a specific geographic location. 12 | 13 | The base terminology in the scope of this specification includes the following terms: 14 | 15 | - A *GeoZarr Instance* (or GeoZarr) is a hierarchy of objects including attributes and arrays describing geospatial information. 16 | - A *GeoZarr Data Variable* is the arrray and attributes that define the values of a n-D coverage (i.e. a Rectified Grid Coverage) 17 | - A *GeoZarr Coordinate Variable* is the array (might be empty) and attributes that define a coordinate dimension of a n-D coverage 18 | - A *GeoZarr Auxiliary Variable* is the array (might be empty) and attributes that define other type of information 19 | - A *GeoZarr Dataset* is a self-describing collection of n-D coverages defined by a set of values, coordinates and attributes (similar to a NetCDF dataset). 20 | 21 | Unlike some popular geospatial data formats, GeoZarr is not limited to 2D rasters and extends to multiple dimensions, including time, altitude, wavelength, and others. Additionally, the order of these dimensions is not fixed, allowing for optimizations in data analysis. 22 | 23 | A Dataset (referenced as an asset in a STAC item) facilitates the discovery and handling of the coverages by clients, such as web maps, and supports advanced capabilities such as pyramiding. However,GeoZarr also flexible and adaptable enough to accommodate other types of information: the specification aim to ensure that a transformation to GeoZarr from a source format can be reverted back to the original format. 24 | 25 | === Underlying GeoZarr Requirements 26 | 27 | The requirement class GeoZarr Core is mandatory for all GeoZarr instances and must be specified at the root level with the `conformsTo` attribute. 28 | 29 | Some requirement classes are optional and define specific type of assets to facilitate standard interpretation by clients, such as a the requirement class Dataset. These optional requirement classes must be specified at the appropriate level within the hierarchy, using the conformsTo attribute to indicate adherence to the respective requirement class. 30 | 31 | TIP: maybe list possible requirements classes and purpose 32 | 33 | ==== Requirement Class GeoZarr Core 34 | 35 | The base requirement class is designed to be flexible, facilitating conversion from any data source and support most source formats.. 36 | 37 | [[req_geozarr-core]] 38 | [cols="1,4",width="90%"] 39 | |=== 40 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 41 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/geozarr-core {set:cellbgcolor:#FFFFFF} 42 | |Target type | Zarr Encoder 43 | |Dependency | TBD 44 | |=== 45 | 46 | ===== Structure 47 | 48 | A GeoZarr instance must consist of any Zarr tree structure with a root that is always a Zarr group, include the attribute conformsTo set to the GeoZarr requirement class in the root group, and allow any number of hierarchical levels within the groups. 49 | 50 | [width="90%",cols="2,6"] 51 | |=== 52 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr/structure 53 | | A {set:cellbgcolor:#EEEEEE} | A GeoZarr instance (or GeoZarr) must consist of a Zarr tree structure. 54 | | B {set:cellbgcolor:#EEEEEE} | The GeoZarr root must always be a Zarr group. 55 | | C {set:cellbgcolor:#EEEEEE} | The root group must include the attribute `conformsTo` set to the GeoZarr requirement class. 56 | | D {set:cellbgcolor:#EEEEEE} | The GeoZarr instance may have any number of levels within the hierarchy. 57 | |=== 58 | 59 | ===== Variables 60 | 61 | A variable represents an array of values of the same type in a Zarr array. A variable can describe coverage values, their coordinates, or any auxiliary data (i.e., additional information to the coverage). These different types of variables are defined further in the specification. 62 | 63 | [width="90%",cols="2,6"] 64 | |=== 65 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr/variable 66 | | A {set:cellbgcolor:#EEEEEE} | A variable represents an array of values of the same type and is stored in Zarr arrays. 67 | |=== 68 | 69 | 70 | ===== Attributes 71 | 72 | GeoZarr attributes are used to store ancillary data or metadata at any level of the hierarchy. This information can pertain to variables, coordinates, spatio-temporal assets, or any other relevant purpose. 73 | 74 | [width="90%",cols="2,6"] 75 | |=== 76 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr/attributes 77 | | A {set:cellbgcolor:#EEEEEE} | GeoZarr attributes are used to store ancillary data or metadata at any level of the hierarchy. 78 | | B {set:cellbgcolor:#EEEEEE} | GeoZarr attributes must be encoded as Zarr attributes. 79 | |=== 80 | 81 | ==== Requirement Class GeoZarr Dataset 82 | 83 | [[req_geozarr-dataset]] 84 | [cols="1,4",width="90%"] 85 | |=== 86 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 87 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/geozarr-dataset {set:cellbgcolor:#FFFFFF} 88 | |Target type | Zarr Encoder 89 | |Dependency | TBD 90 | |=== 91 | 92 | ===== Notion of Dataset 93 | 94 | GeoZarr defines flexible conventions to encode content from various source formats, including geospatial arrays (raster), non-geospatial arrays, and hierarchical structures. 95 | 96 | GeoZarr emphasizes Rectified Grid Coverages, which can be easily discovered, interpreted, and displayed on a map. A coverage is spatial data organized in a regular grid, where each cell holds a value representing a specific geographic area. Examples include 2D Rasters, Raster Time Series, and Geo-Datacubes (with dimensions like time, light spectrum, altitude, etc.). 97 | 98 | A GeoZarr Dataset, consists of a collection of coverage defined by data variables, their common coordinates, and some attributes which together form a self describing dataset and represent a geospatial phenomenon in the data hierarchy. GeoZarr defines the structure and necessary metadata for understanding this dataset, such as an index of available variables, the projection used, and the coordinates describing the dimensions of these variables. 99 | 100 | The purpose of a GeoZarr Dataset is to maximize compatibility and facilitate the seamless mapping of diverse source formats into a standardized, easily interpretable structure. 101 | 102 | **Figure 1: GeoZarr Dataset Abstract Representation** 103 | 104 | ```mermaid 105 | classDiagram 106 | class Dataset { 107 | +attributes 108 | } 109 | class DataVariable { 110 | +values 111 | +attributes 112 | } 113 | class CoordinateVariable { 114 | +coordinates 115 | +attributes 116 | } 117 | class AuxiliaryVariable { 118 | +data 119 | +attributes 120 | } 121 | 122 | Dataset --> "1..*" DataVariable : includes 123 | Dataset --> "1..*" CoordinateVariable : includes 124 | Dataset --> "0..*" AuxiliaryVariable : includes 125 | CoordinateVariable --> DataVariable : coordinates 126 | ``` 127 | 128 | ===== Dataset Structure 129 | 130 | A GeoZarr may include Dataset Groups which consists in n-D variables observed by a sensor (temperature, humidity, elevation). These variables are defined by geospatial coordinates and optional extra dimensions (time, altitude, etc.). 131 | 132 | [width="90%",cols="2,6"] 133 | |=== 134 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/group 135 | | A {set:cellbgcolor:#EEEEEE} | A Dataset must be represented by a Zarr group. 136 | | B {set:cellbgcolor:#EEEEEE} | The Zarr group must include the attribute `conformsTo` set to the Dataset requirement class. 137 | | C {set:cellbgcolor:#EEEEEE} | Coordinates, attributes, and any additional information must be represented in the Zarr group or children Zarr objects (see furhter equirements) 138 | |=== 139 | 140 | [width="90%",cols="2,6"] 141 | |=== 142 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/coordinate-variable 143 | | A {set:cellbgcolor:#EEEEEE} | Each coordinate variable must include the Climate and Forecast (CF) standard name in the `standard_name` attribute of the Zarr array. 144 | |=== 145 | 146 | [width="90%",cols="2,6"] 147 | |=== 148 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/data-variable-coordinates 149 | | A {set:cellbgcolor:#EEEEEE} | Data Variables (coverages) in a dataset should share a common set of coordinates and coordinate reference system. 150 | |=== 151 | 152 | 153 | **Hierarchy of Zarr Elements** 154 | 155 | ```mermaid 156 | classDiagram 157 | class ZarrGroup { 158 | +attrs (attributes) 159 | } 160 | class ZarrArray { 161 | +attrs (attributes) 162 | } 163 | 164 | ZarrGroup <|-- Dataset : maps to 165 | ZarrArray <|-- Coordinate : maps to 166 | ZarrArray <|-- DataVariable : maps to 167 | 168 | class Dataset { 169 | } 170 | class Coordinate { 171 | } 172 | class DataVariable { 173 | } 174 | 175 | Dataset --> ZarrGroup 176 | ZarrGroup --> "1..*" ZarrArray : contains 177 | Coordinate --> ZarrArray 178 | DataVariable --> ZarrArray 179 | ``` 180 | 181 | Below is a representation of a Zarr structure for an abstract Dataset with a single data variable. 182 | 183 | ``` 184 | GeoZarr_Dataset/ 185 | ├── .zgroup 186 | ├── attrs.json 187 | ├── data_variable/ 188 | │ ├── .zarray 189 | │ ├── attrs.json 190 | │ └── data (chunks) 191 | ├── latitude/ 192 | │ ├── .zarray 193 | │ ├── attrs.json 194 | │ └── data (chunks) 195 | ├── longitude/ 196 | │ ├── .zarray 197 | │ ├── attrs.json 198 | │ └── data (chunks) 199 | └── time/ 200 | ├── .zarray 201 | ├── attrs.json 202 | └── data (chunks) 203 | ``` 204 | 205 | INFO: a coordinate is not necessary a list of positions (labelled coordinates) but might be encoded in different ways further defined. 206 | 207 | NOTE: We may require or recommend that a Dataset is restricted to a single data variable or to variable with consistent coordinates (otherwise the group is a mess). We might specify also an attribute for a index of variables. 208 | 209 | 210 | ===== Data Variables 211 | 212 | TIP: Defines the requirements for the variables in a dataset (how to specify dimensions and relationship with the coordinates sibling) 213 | 214 | A Data Variable holds the data values of the observed geospatial phenomena. A variable has a name, type,any dimension, attributes and values. 215 | 216 | TBD: can/should a data variable have dimensions which are not coordinates 217 | 218 | [width="90%",cols="2,6"] 219 | |=== 220 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/data-variable 221 | | A {set:cellbgcolor:#EEEEEE} | Each data variable (values of a rectified grid coverage) must be stored as a child Zarr array within the dataset group. 222 | | B {set:cellbgcolor:#EEEEEE} | The child Zarr array must include the attribute `_ARRAY_DIMENSIONS` which lists the dimension names. 223 | | C {set:cellbgcolor:#EEEEEE} | For each dimension listed in `_ARRAY_DIMENSIONS`, there must be a corresponding coordinate variable in the dataset group. 224 | |=== 225 | 226 | Each data variable must: 227 | - Be stored as a child Zarr array within the dataset group. 228 | - Include the attribute `_ARRAY_DIMENSIONS` listing the dimension names. 229 | - Have a corresponding coordinate variable for each dimension listed in `_ARRAY_DIMENSIONS` within the dataset group. 230 | 231 | 232 | ===== Coordinates 233 | 234 | TIP: Defines the requirement for the data coordinates and reference to the requirement classes for the different encoding of data coordinate. 235 | 236 | [width="90%",cols="2,6"] 237 | |=== 238 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/coordinate-variable 239 | | A {set:cellbgcolor:#EEEEEE} | Each coordinate variable (representing the positions of one dimension of a data variable) must be represented in a child Zarr array within the dataset group. 240 | | B {set:cellbgcolor:#EEEEEE} | The Zarr array variables must be named with the same name as the dimension of the data variable they represent. 241 | |=== 242 | 243 | Each coordinate variable must: 244 | - Be represented in a child Zarr array within the dataset group. 245 | - Be named with the same name as the dimension of the data variable it represents. 246 | 247 | [width="90%",cols="2,6"] 248 | |=== 249 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/coordinate-variable 250 | | A {set:cellbgcolor:#EEEEEE} | Each coordinate variable must include the Climate and Forecast (CF) standard name in the `standard_name` attribute of the Zarr array. 251 | |=== 252 | 253 | Each coordinate variable should: 254 | - Include the Climate and Forecast (CF) standard name in the `standard_name` attribute of the Zarr array. 255 | 256 | 257 | === Coordinates 258 | 259 | 260 | ==== Coordinate Types 261 | 262 | TIP: Defines what are the requirement in GeoZarr related to latitude, longitude, time, etc. metadata such as does it impose to use CF standard names for qualifying the coordinate (or another convention from GDAL) 263 | 264 | ==== Geospatial Coordinate Encodings 265 | 266 | There are multiple types of encoding for coordinates, each serving different purposes and applications in geospatial data processing. Some common examples include: 267 | 268 | * Geospatial Control Points (labeled Coordinates) : each data point or grid cell is explicitly assigned a coordinate value, which can be used to directly map and reference spatial data. 269 | * Affine Transforms (Coordinate Origin and Step): this involves defining a starting point (origin) and a regular interval (step) between points. This method is commonly used in grid-based data where the position of each cell is calculated based on its distance from the origin. 270 | 271 | Proposed encoding: 272 | - 2D array (the nominal encoding applied by xarray) 273 | - origin/offset: 274 | - COARDS : 275 | 276 | ===== Requirements Class Geospatial_Control_Points 277 | 278 | Geospatial Control Points (GCPs), also known as Labeled Coordinates, are specific geographic locations with known coordinates. These points serve as reference markers to accurately align and georeference spatial data in mapping and GIS applications, ensuring that the data corresponds correctly to real-world locations. 279 | 280 | [[req_geozarr-coordinate-labelled]] 281 | [cols="1,4",width="90%"] 282 | |=== 283 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 284 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-labelled {set:cellbgcolor:#FFFFFF} 285 | |Target type | Dataset Coordinate 286 | |Dependency | TBD 287 | |=== 288 | 289 | 290 | ===== Requirements Class CoordinateOriginOffset 291 | 292 | TIP: It is not supported yet in the model, but this seems relevant to be added. 293 | 294 | [[req_geozarr-coordinate-oo]] 295 | [cols="1,4",width="90%"] 296 | |=== 297 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 298 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-oo {set:cellbgcolor:#FFFFFF} 299 | |Target type | Dataset Coordinate 300 | |Dependency | TBD 301 | |=== 302 | 303 | To accurately represent the spatial dimensions of the dataset, each coordinate type origin offset must be defined in a child Zarr array within the dataset. This array must contain the triplet of values: origin, offset, and end, to describe the coordinate's range and intervals. Additionally, the coordinate variable must include a CF standard name in the `standard_name` attribute, specifically for latitude or longitude. 304 | 305 | [width="90%",cols="2,6"] 306 | |=== 307 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/coordinate-variable 308 | | A {set:cellbgcolor:#EEEEEE} | A coordinate type origin offset should be represented in a child Zarr array of the dataset. 309 | | B {set:cellbgcolor:#EEEEEE} | The coordinate variable must define in the array the triplet of values: origin, offset, end. 310 | | C {set:cellbgcolor:#EEEEEE} | The coordinate variable must provide a standard name (CF) for latitude or longitude in the `standard_name` attribute. 311 | |=== 312 | 313 | To enhance clarity and interoperability, it is recommended that each coordinate variable link to the `grid_mapping` variable, which describes the CRS applicable to this coordinate. 314 | 315 | [width="90%",cols="2,6"] 316 | |=== 317 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/coordinate-variable 318 | | A {set:cellbgcolor:#EEEEEE} | The coordinate variable should link to the `grid_mapping` variable defined to describe the CRS that applies to this coordinate. 319 | |=== 320 | 321 | The coordinate variable should: 322 | - Link to the `grid_mapping` variable defined to describe the CRS that applies to this coordinate. 323 | 324 | 325 | ===== Requirements Class CoordinateVector 326 | 327 | TIP: please add the definition 328 | 329 | [[req_geozarr-coordinate-vector]] 330 | [cols="1,4",width="90%"] 331 | |=== 332 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 333 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-vector {set:cellbgcolor:#FFFFFF} 334 | |Target type | TBD 335 | |Dependency | TBD 336 | |=== 337 | 338 | 339 | ==== Coordinates Reference System Encodings 340 | 341 | TIP: any consideration with projections and affine transformations ? 342 | 343 | [width="90%",cols="2,6"] 344 | |=== 345 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/data-variable-coordinates 346 | | A {set:cellbgcolor:#EEEEEE} | The coordinate reference system (CRS) must be indicated for each data variable (coverage). 347 | | B {set:cellbgcolor:#EEEEEE} | The CRS should be represented in a child Zarr array of the dataset (auxiliary variable). 348 | | C {set:cellbgcolor:#EEEEEE} | The CRS variable name should be referenced in the data variable (coverage) in the `grid_mapping` attribute. 349 | | D {set:cellbgcolor:#EEEEEE} | The CRS should be described in the attributes of the CRS variable using CF conventions properties. 350 | |=== 351 | 352 | Each data variable (coverage) must: 353 | - Indicate the coordinate reference system used. 354 | - Reference the CRS variable name in the `grid_mapping` attribute. 355 | 356 | The CRS should: 357 | - Be represented in a child Zarr array of the dataset (auxiliary variable). 358 | - Be described in the attributes of the CRS variable using CF conventions properties. 359 | 360 | While it is recommended that all coverages in a dataset share the same set of coordinates and coordinate reference system to ensure consistency and ease of use, explicitly indicating the coordinate reference system for each data variable is necessary to avoid any ambiguity and to support interoperability when integrating data from diverse sources. 361 | 362 | TBD explain the grid_mapping and required properties 363 | 364 | 365 | === Tiling and Pyramiding 366 | 367 | TIP: equivalent to GeoTiff (https://docs.ogc.org/is/21-026/21-026.html). GeoZarr should specify if and how tiling might be applied for three-dimensional and higher-dimensional data (for example, order of dimensions might be critical) 368 | 369 | ==== Requirements Class Tiling 370 | 371 | [[req_geozarr-tiling]] 372 | [cols="1,4",width="90%"] 373 | |=== 374 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 375 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/tiling {set:cellbgcolor:#FFFFFF} 376 | |Target type | Dataset 377 | |Dependency | TBD 378 | |=== 379 | 380 | 381 | Tiling is a strategy for optimising chunking in GeoZarr. With tiling, access to a specific area or two-dimensional bounding box is much quicker, as the relevant data is stored closer together in the file, reducing the number of bytes that need to be read compared to the strips approach. 382 | 383 | ==== Requirements Class Pyramiding 384 | 385 | Pyramiding is useful when the client wants to quickly render an image of the entire area or a large portion of the area represented in the file. Instead of downloading every pixel, the software can request a smaller, pre-created, lower-resolution version. 386 | 387 | [[req_geozarr-coordinate-pyramiding]] 388 | [cols="1,4",width="90%"] 389 | |=== 390 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 391 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-piramidiing {set:cellbgcolor:#FFFFFF} 392 | |Target type | Dataset 393 | |Dependency | TBD 394 | |=== 395 | 396 | 397 | ==== Requirements Class Map Rendering 398 | 399 | TIP: in addition to traditional 2D formats, some conventions might be needed to faciltiate the rendering of time series or N-D arrays on map tools. For example, how the bands / layers of the array are referenced, etc. 400 | 401 | 402 | ==== Requirement 403 | 404 | === Referencing in STAC 405 | 406 | TIP: might be useful to describe or provide extension for referencing GeoZarr assets (e.g. dataset) in STAC Items. 407 | 408 | == Annex B: Mappings with other formats 409 | 410 | TIP: Provides the mappings for information purpose to show how source formats can preserve information from any data source. 411 | 412 | To maximize compatibility with various source formats, GeoZarr preserves as much metadata and structure as possible from these formats. 413 | 414 | NOTE: In particular, if relevant information which cannot be encoded in GeoZarr is identified, the specification might be extended. 415 | 416 | === Mappings with CF 417 | 418 | 419 | === Mappings with GeoTiff 420 | 421 | To map a GeoTIFF to the GeoZarr structure, we need to carefully translate the data arrays, coordinate variables, and metadata (such as the CRS) into the appropriate GeoZarr elements. 422 | 423 | GeoZarr is structured as a single GeoZarr dataset at the root, encapsulating all necessary components to represent the geospatial data and metadata effectively. 424 | 425 | - GeoTIFF Data Array to GeoZarr Data Variable: In the case of a single band, the data variable represents a 2D raster with latitude and longitude dimensions. If there are multiple bands, they might be mapped to positions within a band dimension, with coordinates providing the wavelength and standard names indicating the units of measure for those coordinates. 426 | - GeoTIFF Coordinates to GeoZarr Coordinate Variables: Latitude and longitude coordinates are extracted and stored as GeoZarr Coordinate Variables. 427 | - GeoTIFF Metadata to GeoZarr Attributes: Metadata from the GeoTIFF (such as CRS and transform) are stored in the attributes of the GeoZarr Data Varaible. The CRS is translated to an auxiliary variable, referenced from the GeoZarr Data Variable in the grid_mapping attribute. 428 | - GeoZarr Dataset Group for Organizing: All the data variables and coordinate variables are organized within a GeoZarr Dataset Group, ensuring a coherent structure. This group is the root of the GeoZarr hierarchy, making it a self-contained and self-describing dataset. 429 | 430 | 431 | === Mappings with GDAL entities 432 | 433 | -------------------------------------------------------------------------------- /standard/template/sections/clause_7_format_requirements.adoc: -------------------------------------------------------------------------------- 1 | == GeoZarr format requirements 2 | 3 | TIP: This is a very preliminary draft. The content is primarily for demonstrating the purpose of the proposed sections. The main focus should be on the table of contents. 4 | 5 | include::clause_7a_format_overview.adoc[] 6 | 7 | === Underlying GeoZarr Requirements 8 | 9 | The requirement class GeoZarr Core is mandatory for all GeoZarr instances and must be specified at the root level with the `conformsTo` attribute. 10 | 11 | Some requirement classes are optional and define specific type of assets to facilitate standard interpretation by clients, such as a the requirement class Dataset. These optional requirement classes must be specified at the appropriate level within the hierarchy, using the conformsTo attribute to indicate adherence to the respective requirement class. 12 | 13 | TIP: maybe list possible requirements classes and purpose 14 | 15 | include::clause_7b_format_core.adoc[] 16 | 17 | include::clause_7c_format_coordinates.adoc[] 18 | 19 | include::clause_7d_format_pyramiding.adoc[] 20 | 21 | include::clause_7e_format_dataset_types.adoc[] 22 | 23 | include::clause_7_annex_mapping.adoc.adoc[] -------------------------------------------------------------------------------- /standard/template/sections/clause_7a_format_overview.adoc: -------------------------------------------------------------------------------- 1 | A GeoZarr data format is a regular Zarr hierarchy that represents geospatial coverages such as granules, scenes series, mosaics or any spatio temporal asset (as per STAC specification). 2 | 3 | === Overview and Definitions 4 | 5 | The OGC Abstract Topic 6 [OGC 07-011] standard defines all geographic object as a feature, with coverage being a special type for any digital geospatial information representing space and time varying phenomena. The ISO 19123 standard provides a formal definition for coverages: a "feature acting as a function that returns values from its range for any direct position within its spatiotemporal domain". 6 | 7 | GeoZarr, like many array-oriented geospatial data formats (e.g., NetCDF, GeoTIFF), primarily supports *Rectified Grid Coverages*. Rectified Grid Coverage is a type of grid coverage that aligns with a coordinate reference system, ensuring that each cell or grid point corresponds precisely to a specific geographic location. 8 | 9 | The base terminology in the scope of this specification includes the following terms: 10 | 11 | - A *GeoZarr Instance* (or GeoZarr) is a hierarchy of objects including attributes and arrays describing geospatial information. 12 | - A *GeoZarr Data Variable* is the arrray and attributes that define the values of a n-D coverage (i.e. a Rectified Grid Coverage) 13 | - A *GeoZarr Coordinate Variable* is the array (might be empty) and attributes that define a coordinate dimension of a n-D coverage 14 | - A *GeoZarr Auxiliary Variable* is the array (might be empty) and attributes that define other type of information 15 | - A *GeoZarr Dataset* is a self-describing collection of n-D coverages defined by a set of values, coordinates and attributes (similar to a NetCDF dataset). 16 | 17 | Unlike some popular geospatial data formats, GeoZarr is not limited to 2D rasters and extends to multiple dimensions, including time, altitude, wavelength, and others. Additionally, the order of these dimensions is not fixed, allowing for optimizations in data analysis. 18 | 19 | A Dataset (referenced as an asset in a STAC item) facilitates the discovery and handling of the coverages by clients, such as web maps, and supports advanced capabilities such as pyramiding. However,GeoZarr also flexible and adaptable enough to accommodate other types of information: the specification aim to ensure that a transformation to GeoZarr from a source format can be reverted back to the original format. 20 | -------------------------------------------------------------------------------- /standard/template/sections/clause_7b_format_core.adoc: -------------------------------------------------------------------------------- 1 | ==== Requirement Class GeoZarr Core 2 | 3 | The base requirement class is designed to be flexible, facilitating conversion from any data source and support most source formats.. 4 | 5 | [[req_geozarr-core]] 6 | [cols="1,4",width="90%"] 7 | |=== 8 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 9 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/geozarr-core {set:cellbgcolor:#FFFFFF} 10 | |Target type | Zarr Encoder 11 | |Dependency | TBD 12 | |=== 13 | 14 | ===== Structure 15 | 16 | A GeoZarr instance must consist of any Zarr tree structure with a root that is always a Zarr group, include the attribute conformsTo set to the GeoZarr requirement class in the root group, and allow any number of hierarchical levels within the groups. 17 | 18 | [width="90%",cols="2,6"] 19 | |=== 20 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr/structure 21 | | A {set:cellbgcolor:#EEEEEE} | A GeoZarr instance (or GeoZarr) must consist of a Zarr tree structure. 22 | | B {set:cellbgcolor:#EEEEEE} | The GeoZarr root must always be a Zarr group. 23 | | C {set:cellbgcolor:#EEEEEE} | The root group must include the attribute `conformsTo` set to the GeoZarr requirement class. 24 | | D {set:cellbgcolor:#EEEEEE} | The GeoZarr instance may have any number of levels within the hierarchy. 25 | |=== 26 | 27 | ===== Variables 28 | 29 | A variable represents an array of values of the same type in a Zarr array. A variable can describe coverage values, their coordinates, or any auxiliary data (i.e., additional information to the coverage). These different types of variables are defined further in the specification. 30 | 31 | [width="90%",cols="2,6"] 32 | |=== 33 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr/variable 34 | | A {set:cellbgcolor:#EEEEEE} | A variable represents an array of values of the same type and is stored in Zarr arrays. 35 | |=== 36 | 37 | 38 | ===== Attributes 39 | 40 | GeoZarr attributes are used to store ancillary data or metadata at any level of the hierarchy. This information can pertain to variables, coordinates, spatio-temporal assets, or any other relevant purpose. 41 | 42 | [width="90%",cols="2,6"] 43 | |=== 44 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr/attributes 45 | | A {set:cellbgcolor:#EEEEEE} | GeoZarr attributes are used to store ancillary data or metadata at any level of the hierarchy. 46 | | B {set:cellbgcolor:#EEEEEE} | GeoZarr attributes must be encoded as Zarr attributes. 47 | |=== 48 | 49 | ==== Requirement Class GeoZarr Dataset 50 | 51 | [[req_geozarr-dataset]] 52 | [cols="1,4",width="90%"] 53 | |=== 54 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 55 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/geozarr-dataset {set:cellbgcolor:#FFFFFF} 56 | |Target type | Zarr Encoder 57 | |Dependency | TBD 58 | |=== 59 | 60 | ===== Notion of Dataset 61 | 62 | GeoZarr defines flexible conventions to encode content from various source formats, including geospatial arrays (raster), non-geospatial arrays, and hierarchical structures. 63 | 64 | GeoZarr emphasizes Rectified Grid Coverages, which can be easily discovered, interpreted, and displayed on a map. A coverage is spatial data organized in a regular grid, where each cell holds a value representing a specific geographic area. Examples include 2D Rasters, Raster Time Series, and Geo-Datacubes (with dimensions like time, light spectrum, altitude, etc.). 65 | 66 | A GeoZarr Dataset, consists of a collection of coverage defined by data variables, their common coordinates, and some attributes which together form a self describing dataset and represent a geospatial phenomenon in the data hierarchy. GeoZarr defines the structure and necessary metadata for understanding this dataset, such as an index of available variables, the projection used, and the coordinates describing the dimensions of these variables. 67 | 68 | The purpose of a GeoZarr Dataset is to maximize compatibility and facilitate the seamless mapping of diverse source formats into a standardized, easily interpretable structure. 69 | 70 | **Figure 1: GeoZarr Dataset Abstract Representation** 71 | 72 | ```mermaid 73 | classDiagram 74 | class Dataset { 75 | +attributes 76 | } 77 | class DataVariable { 78 | +values 79 | +attributes 80 | } 81 | class CoordinateVariable { 82 | +coordinates 83 | +attributes 84 | } 85 | class AuxiliaryVariable { 86 | +data 87 | +attributes 88 | } 89 | 90 | Dataset --> "1..*" DataVariable : includes 91 | Dataset --> "1..*" CoordinateVariable : includes 92 | Dataset --> "0..*" AuxiliaryVariable : includes 93 | CoordinateVariable --> DataVariable : coordinates 94 | ``` 95 | 96 | ===== Dataset Structure 97 | 98 | A GeoZarr may include Dataset Groups which consists in n-D variables observed by a sensor (temperature, humidity, elevation). These variables are defined by geospatial coordinates and optional extra dimensions (time, altitude, etc.). 99 | 100 | [width="90%",cols="2,6"] 101 | |=== 102 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/group 103 | | A {set:cellbgcolor:#EEEEEE} | A Dataset must be represented by a Zarr group. 104 | | B {set:cellbgcolor:#EEEEEE} | The Zarr group must include the attribute `conformsTo` set to the Dataset requirement class. 105 | | C {set:cellbgcolor:#EEEEEE} | Coordinates, attributes, and any additional information must be represented in the Zarr group or children Zarr objects (see furhter equirements) 106 | |=== 107 | 108 | [width="90%",cols="2,6"] 109 | |=== 110 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/coordinate-variable 111 | | A {set:cellbgcolor:#EEEEEE} | Each coordinate variable must include the Climate and Forecast (CF) standard name in the `standard_name` attribute of the Zarr array. 112 | |=== 113 | 114 | [width="90%",cols="2,6"] 115 | |=== 116 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/data-variable-coordinates 117 | | A {set:cellbgcolor:#EEEEEE} | Data Variables (coverages) in a dataset should share a common set of coordinates and coordinate reference system. 118 | |=== 119 | 120 | 121 | **Hierarchy of Zarr Elements** 122 | 123 | ```mermaid 124 | classDiagram 125 | class ZarrGroup { 126 | +attrs (attributes) 127 | } 128 | class ZarrArray { 129 | +attrs (attributes) 130 | } 131 | 132 | ZarrGroup <|-- Dataset : maps to 133 | ZarrArray <|-- Coordinate : maps to 134 | ZarrArray <|-- DataVariable : maps to 135 | 136 | class Dataset { 137 | } 138 | class Coordinate { 139 | } 140 | class DataVariable { 141 | } 142 | 143 | Dataset --> ZarrGroup 144 | ZarrGroup --> "1..*" ZarrArray : contains 145 | Coordinate --> ZarrArray 146 | DataVariable --> ZarrArray 147 | ``` 148 | 149 | Below is a representation of a Zarr structure for an abstract Dataset with a single data variable. 150 | 151 | ``` 152 | GeoZarr_Dataset/ 153 | ├── .zgroup 154 | ├── attrs.json 155 | ├── data_variable/ 156 | │ ├── .zarray 157 | │ ├── attrs.json 158 | │ └── data (chunks) 159 | ├── latitude/ 160 | │ ├── .zarray 161 | │ ├── attrs.json 162 | │ └── data (chunks) 163 | ├── longitude/ 164 | │ ├── .zarray 165 | │ ├── attrs.json 166 | │ └── data (chunks) 167 | └── time/ 168 | ├── .zarray 169 | ├── attrs.json 170 | └── data (chunks) 171 | ``` 172 | 173 | INFO: a coordinate is not necessary a list of positions (labelled coordinates) but might be encoded in different ways further defined. 174 | 175 | NOTE: We may require or recommend that a Dataset is restricted to a single data variable or to variable with consistent coordinates (otherwise the group is a mess). We might specify also an attribute for a index of variables. 176 | 177 | 178 | ===== Data Variables 179 | 180 | TIP: Defines the requirements for the variables in a dataset (how to specify dimensions and relationship with the coordinates sibling) 181 | 182 | A Data Variable holds the data values of the observed geospatial phenomena. A variable has a name, type,any dimension, attributes and values. 183 | 184 | TBD: can/should a data variable have dimensions which are not coordinates 185 | 186 | [width="90%",cols="2,6"] 187 | |=== 188 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/data-variable 189 | | A {set:cellbgcolor:#EEEEEE} | Each data variable (values of a rectified grid coverage) must be stored as a child Zarr array within the dataset group. 190 | | B {set:cellbgcolor:#EEEEEE} | The child Zarr array must include the attribute `_ARRAY_DIMENSIONS` which lists the dimension names. 191 | | C {set:cellbgcolor:#EEEEEE} | For each dimension listed in `_ARRAY_DIMENSIONS`, there must be a corresponding coordinate variable in the dataset group. 192 | |=== 193 | 194 | Each data variable must: 195 | - Be stored as a child Zarr array within the dataset group. 196 | - Include the attribute `_ARRAY_DIMENSIONS` listing the dimension names. 197 | - Have a corresponding coordinate variable for each dimension listed in `_ARRAY_DIMENSIONS` within the dataset group. 198 | 199 | 200 | ===== Coordinates 201 | 202 | TIP: Defines the requirement for the data coordinates and reference to the requirement classes for the different encoding of data coordinate. 203 | 204 | [width="90%",cols="2,6"] 205 | |=== 206 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/coordinate-variable 207 | | A {set:cellbgcolor:#EEEEEE} | Each coordinate variable (representing the positions of one dimension of a data variable) must be represented in a child Zarr array within the dataset group. 208 | | B {set:cellbgcolor:#EEEEEE} | The Zarr array variables must be named with the same name as the dimension of the data variable they represent. 209 | |=== 210 | 211 | Each coordinate variable must: 212 | - Be represented in a child Zarr array within the dataset group. 213 | - Be named with the same name as the dimension of the data variable it represents. 214 | 215 | [width="90%",cols="2,6"] 216 | |=== 217 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/coordinate-variable 218 | | A {set:cellbgcolor:#EEEEEE} | Each coordinate variable must include the Climate and Forecast (CF) standard name in the `standard_name` attribute of the Zarr array. 219 | |=== 220 | 221 | Each coordinate variable should: 222 | - Include the Climate and Forecast (CF) standard name in the `standard_name` attribute of the Zarr array. 223 | 224 | -------------------------------------------------------------------------------- /standard/template/sections/clause_7c_format_coordinates.adoc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | === Coordinates 5 | 6 | 7 | ==== Coordinate Types 8 | 9 | TIP: Defines what are the requirement in GeoZarr related to latitude, longitude, time, etc. metadata such as does it impose to use CF standard names for qualifying the coordinate (or another convention from GDAL) 10 | 11 | ==== Geospatial Coordinate Encodings 12 | 13 | There are multiple types of encoding for coordinates, each serving different purposes and applications in geospatial data processing. Some common examples include: 14 | 15 | * Geospatial Control Points (labeled Coordinates) : each data point or grid cell is explicitly assigned a coordinate value, which can be used to directly map and reference spatial data. 16 | * Affine Transforms (Coordinate Origin and Step): this involves defining a starting point (origin) and a regular interval (step) between points. This method is commonly used in grid-based data where the position of each cell is calculated based on its distance from the origin. 17 | 18 | Proposed encoding: 19 | 20 | - 2D array (the nominal encoding applied by xarray) 21 | - origin/offset: 22 | - COARDS : 23 | 24 | ===== Requirements Class Geospatial_Control_Points 25 | 26 | Geospatial Control Points (GCPs), also known as Labeled Coordinates, are specific geographic locations with known coordinates. These points serve as reference markers to accurately align and georeference spatial data in mapping and GIS applications, ensuring that the data corresponds correctly to real-world locations. 27 | 28 | [[req_geozarr-coordinate-labelled]] 29 | [cols="1,4",width="90%"] 30 | |=== 31 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 32 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-labelled {set:cellbgcolor:#FFFFFF} 33 | |Target type | Dataset Coordinate 34 | |Dependency | TBD 35 | |=== 36 | 37 | 38 | ===== Requirements Class CoordinateOriginOffset 39 | 40 | TIP: It is not supported yet in the model, but this seems relevant to be added. 41 | 42 | [[req_geozarr-coordinate-oo]] 43 | [cols="1,4",width="90%"] 44 | |=== 45 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 46 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-oo {set:cellbgcolor:#FFFFFF} 47 | |Target type | Dataset Coordinate 48 | |Dependency | TBD 49 | |=== 50 | 51 | To accurately represent the spatial dimensions of the dataset, each coordinate type origin offset must be defined in a child Zarr array within the dataset. This array must contain the triplet of values: origin, offset, and end, to describe the coordinate's range and intervals. Additionally, the coordinate variable must include a CF standard name in the `standard_name` attribute, specifically for latitude or longitude. 52 | 53 | [width="90%",cols="2,6"] 54 | |=== 55 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/coordinate-variable 56 | | A {set:cellbgcolor:#EEEEEE} | A coordinate type origin offset should be represented in a child Zarr array of the dataset. 57 | | B {set:cellbgcolor:#EEEEEE} | The coordinate variable must define in the array the triplet of values: origin, offset, end. 58 | | C {set:cellbgcolor:#EEEEEE} | The coordinate variable must provide a standard name (CF) for latitude or longitude in the `standard_name` attribute. 59 | |=== 60 | 61 | To enhance clarity and interoperability, it is recommended that each coordinate variable link to the `grid_mapping` variable, which describes the CRS applicable to this coordinate. 62 | 63 | [width="90%",cols="2,6"] 64 | |=== 65 | |*Recommendation {counter:rec-id}* {set:cellbgcolor:#CACCCE}|/rec/geozarr-dataset/coordinate-variable 66 | | A {set:cellbgcolor:#EEEEEE} | The coordinate variable should link to the `grid_mapping` variable defined to describe the CRS that applies to this coordinate. 67 | |=== 68 | 69 | The coordinate variable should: 70 | - Link to the `grid_mapping` variable defined to describe the CRS that applies to this coordinate. 71 | 72 | 73 | ===== Requirements Class CoordinateVector 74 | 75 | TIP: please add the definition 76 | 77 | [[req_geozarr-coordinate-vector]] 78 | [cols="1,4",width="90%"] 79 | |=== 80 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 81 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-vector {set:cellbgcolor:#FFFFFF} 82 | |Target type | TBD 83 | |Dependency | TBD 84 | |=== 85 | 86 | 87 | ==== Coordinates Reference System Encodings 88 | 89 | TIP: any consideration with projections and affine transformations ? 90 | 91 | [width="90%",cols="2,6"] 92 | |=== 93 | |*Requirement {counter:req-id}* {set:cellbgcolor:#CACCCE}|/req/geozarr-dataset/data-variable-coordinates 94 | | A {set:cellbgcolor:#EEEEEE} | The coordinate reference system (CRS) must be indicated for each data variable (coverage). 95 | | B {set:cellbgcolor:#EEEEEE} | The CRS should be represented in a child Zarr array of the dataset (auxiliary variable). 96 | | C {set:cellbgcolor:#EEEEEE} | The CRS variable name should be referenced in the data variable (coverage) in the `grid_mapping` attribute. 97 | | D {set:cellbgcolor:#EEEEEE} | The CRS should be described in the attributes of the CRS variable using CF conventions properties. 98 | |=== 99 | 100 | Each data variable (coverage) must: 101 | - Indicate the coordinate reference system used. 102 | - Reference the CRS variable name in the `grid_mapping` attribute. 103 | 104 | The CRS should: 105 | - Be represented in a child Zarr array of the dataset (auxiliary variable). 106 | - Be described in the attributes of the CRS variable using CF conventions properties. 107 | 108 | While it is recommended that all coverages in a dataset share the same set of coordinates and coordinate reference system to ensure consistency and ease of use, explicitly indicating the coordinate reference system for each data variable is necessary to avoid any ambiguity and to support interoperability when integrating data from diverse sources. 109 | 110 | TBD explain the grid_mapping and required properties 111 | 112 | -------------------------------------------------------------------------------- /standard/template/sections/clause_7d_format_pyramiding.adoc: -------------------------------------------------------------------------------- 1 | 2 | === Tiling and Pyramiding 3 | 4 | TIP: equivalent to GeoTiff (https://docs.ogc.org/is/21-026/21-026.html). GeoZarr should specify if and how tiling might be applied for three-dimensional and higher-dimensional data (for example, order of dimensions might be critical) 5 | 6 | ==== Requirements Class Tiling 7 | 8 | [[req_geozarr-tiling]] 9 | [cols="1,4",width="90%"] 10 | |=== 11 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 12 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/tiling {set:cellbgcolor:#FFFFFF} 13 | |Target type | Dataset 14 | |Dependency | TBD 15 | |=== 16 | 17 | 18 | A GeoZarr Dataset variable might include multiscales for a set of DataArray variables. Also known as "overviews", multiscales provide resampled copies of the original data at a coarser resolution. Multiscales of the original data thus always hold less detail. Common use cases for multiscales are fast rendering for visualization purposes and analyzing data at multiple resolutions. 19 | 20 | Tiling is a strategy for optimising chunking in GeoZarr. With tiling, access to a specific area or two-dimensional bounding box is much quicker, as the relevant data is stored closer together in the file, reducing the number of bytes that need to be read compared to the strips approach. 21 | 22 | ==== Requirements Class Pyramiding 23 | 24 | Pyramiding is useful when the client wants to quickly render an image of the entire area or a large portion of the area represented in the file. Instead of downloading every pixel, the software can request a smaller, pre-created, lower-resolution version. 25 | 26 | [[req_geozarr-coordinate-pyramiding]] 27 | [cols="1,4",width="90%"] 28 | |=== 29 | 2+|*Requirements Class* {set:cellbgcolor:#CACCCE} 30 | 2+|http://www.opengis.net/spec/GeoZarr/1.0/req/coordinate-piramidiing {set:cellbgcolor:#FFFFFF} 31 | |Target type | Dataset 32 | |Dependency | TBD 33 | |=== 34 | 35 | 36 | ==== Requirements Class Map Rendering 37 | 38 | TIP: in addition to traditional 2D formats, some conventions might be needed to faciltiate the rendering of time series or N-D arrays on map tools. For example, how the bands / layers of the array are referenced, etc. 39 | 40 | ==== Draft Text 41 | 42 | ===== Multiscales Encoding 43 | 44 | Multiscales MUST be encoded in children groups. Data at all scales MUST use the same coordinate reference system and must follow ONE common zoom level strategy. The zoom level strategy is modelled in close alignment to the [OGC Two Dimensional Tile Matrix Set](https://docs.ogc.org/is/17-083r4/17-083r4.html) version 2 and the [Tiled Asset STAC extension](https://github.com/stac-extensions/tiled-assets). Each zoom level is described by a Matrix defining the number, layout, origin and pixel size of included tiles. These tiles MUST correspond to the chunk layout along the two spatial dimensions listed in `_ARRAY_DIMENSIONS` of a given group. 45 | 46 | * Multiscale group name is the zoom level identifier (e.g. '0'). 47 | * Multiscale group contains all DataArrays generated for this specific zoom level. 48 | * Multiscale chunking is RECOMMENDED to be 256 pixels or 512 pixels for the two spatial dimensions listed in `_ARRAY_DIMENSIONS`. 49 | 50 | ===== Multiscales Metadata 51 | 52 | If implemented, each DataArray MUST define the 'multiscales' metadata attribute which includes the following fields: 53 | * `tile_matrix_set` 54 | * `tile_matrix_set_limits` (optional) 55 | * `resampling_method` 56 | 57 | 58 | ====== Tile Matrix Set 59 | Tile Matrix Set can be: 60 | * the name of a well know tile matrix set. Well known Tile Matrix Sets are listed [here](https://schemas.opengis.net/tms/2.0/json/examples/tilematrixset/). 61 | * the URI of a JSON document describing the Tile Matrix Set following the OGC standard. 62 | * a JSON object describing the Tile Matrix Set following the OGC standard (CamelCase!). 63 | 64 | Within the Tile Matrix Set 65 | * the Tile Matrix identifier for each zoom level MUST be the relative path to the Zarr group which holds the DataArray variable 66 | * zoom levels MUST be provided from lowest to highest resolutions 67 | * the `supportedCRS` attribute of the Tile Matrix Set MUST match the crs information defined under **grid_mapping**. 68 | * the tile layout for each Matrix MUST correspond to the chunk layout along the two spatial dimensions listed in `_ARRAY_DIMENSIONS` of the corresponding group. 69 | 70 | 71 | ====== Tile Matrix Set Limits 72 | Tile Matrix Sets may describe a larger spatial extent and more resolutions than used in the given dataset. 73 | In that case, users MAY specify [Tile Matrix Set Limits](https://docs.ogc.org/is/17-083r4/17-083r4.html#toc21) as described in the OGC standard to define the minimum and a maximum limits of the indices for each TileMatrix that contains actual data. However, the notation for tile matrix set does not the JSON encoding as described in the OGC standard but follows the STAC Tile Asset encoding for better readability. 74 | 75 | If used, Tile Matrix Set Limits 76 | * MUST list all included zoom levels 77 | * MAY list the min and max rows and columns for each zoom level. If omitted, it is assumed that the entire spatial extent is covered (resulting in higher chunk count of the DataArray). 78 | 79 | ====== Resampling Method 80 | Resampling Method specifies which resampling method is used for generating multiscales. It MUST be one of the following string values. Resampling method MUST be the same across all zoom levels: 81 | * nearest 82 | * bilinear 83 | * cubic 84 | * cubic_spline 85 | * lanczos 86 | * average 87 | * mode 88 | * gauss 89 | * max 90 | * min 91 | * med 92 | * q1 93 | * q3 94 | * sum 95 | * rms 96 | 97 | ===== Multiscale examples 98 | =====# Using Well Known Name reference 99 | 100 | ```diff 101 | (mandatory items in red, optional items in green) 102 | +{ 103 | + "multiscales": 104 | - { 105 | - "tile_matrix_set": "WebMercatorQuad", 106 | - "resampling_method": "nearest", 107 | - } 108 | +} 109 | ``` 110 | =====# Using a URI 111 | 112 | ```diff 113 | (mandatory items in red, optional items in green) 114 | +{ 115 | + "multiscales": 116 | - { 117 | - "tile_matrix_set": "https://schemas.opengis.net/tms/2.0/json/examples/tilematrixset/WebMercatorQuad.json", 118 | - "resampling_method": "nearest", 119 | - } 120 | +} 121 | ``` 122 | 123 | ====== Using a JSON object 124 | 125 | ```diff 126 | (mandatory items in red, optional items in green) 127 | +{ 128 | + "multiscales": 129 | - { 130 | - "tile_matrix_set": { 131 | - "id": "WebMercatorQuad", 132 | - "title": "Google Maps Compatible for the World", 133 | - "uri": "http://www.opengis.net/def/tilematrixset/OGC/1.0/WebMercatorQuad", 134 | - "crs": "http://www.opengis.net/def/crs/EPSG/0/3857", 135 | - "orderedAxes": [ 136 | - "X", 137 | - "Y" 138 | - ], 139 | - "wellKnownScaleSet": "http://www.opengis.net/def/wkss/OGC/1.0/GoogleMapsCompatible", 140 | - "tileMatrices": [ 141 | - { 142 | - "id": "0", 143 | - "scaleDenominator": 559082264.028717, 144 | - "cellSize": 156543.033928041, 145 | - "pointOfOrigin": [ 146 | - -20037508.3427892, 147 | - 20037508.3427892 148 | - ], 149 | - "tileWidth": 256, 150 | - "tileHeight": 256, 151 | - "matrixWidth": 1, 152 | - "matrixHeight": 1 153 | - }, 154 | - { 155 | - "id": "1", 156 | - "scaleDenominator": 279541132.014358, 157 | - "cellSize": 78271.5169640204, 158 | - "pointOfOrigin": [ 159 | - -20037508.3427892, 160 | - 20037508.3427892 161 | - ], 162 | - "tileWidth": 256, 163 | - "tileHeight": 256, 164 | - "matrixWidth": 2, 165 | - "matrixHeight": 2 166 | - }, 167 | - } 168 | - "resampling_method": "nearest", 169 | - } 170 | +} 171 | ``` 172 | =====# Setting limits 173 | 174 | ```diff 175 | (mandatory items in red, optional items in green) 176 | +{ 177 | + "multiscales": 178 | - { 179 | - "tile_matrix_set": "WebMercatorQuad", 180 | + "tile_matrix_limits: { 181 | - "0": {}, 182 | - "1": { 183 | + "min_tile_col": 0, 184 | + "max_tile_col": 0, 185 | + "min_tile_row": 0, 186 | + "max_tile_row": 0 187 | - }, 188 | - "2": { 189 | + "min_tile_col": 1, 190 | + "max_tile_col": 1, 191 | + "min_tile_row": 2, 192 | + "max_tile_row": 2 193 | - } 194 | - }, 195 | - "resampling_method": "nearest", 196 | - } 197 | +} 198 | ``` 199 | 200 | -------------------------------------------------------------------------------- /standard/template/sections/clause_7e_format_dataset_types.adoc: -------------------------------------------------------------------------------- 1 | == Supported Dataset Types 2 | 3 | TIP: To be done 4 | 5 | 6 | This section outlines the specific dataset types supported within this specification, along with additional requirements for each type. Each dataset type has requirements related to data format, metadata, and any unique processing needs. 7 | 8 | === 1. 2D Raster RGB Data 9 | 10 | - **Description**: Two-dimensional raster images with RGB channels, primarily for visualisation. 11 | - **Data Format**: Supported formats include `GeoTIFF` and `PNG`. 12 | - **Resolution Requirements**: Minimum resolution of 10m per pixel. 13 | - **Metadata Requirements**: 14 | - RGB Channel Mapping. 15 | - Spatial reference and bounding box. 16 | - **Additional Processing**: 17 | - Multiscale overview generation to support fast rendering at various zoom levels. 18 | 19 | === 2. 2D Multispectral Data 20 | 21 | - **Description**: Multiband data that includes spectral information beyond RGB, useful for environmental and remote sensing applications. 22 | - **Data Format**: Supported formats include `NetCDF` and `GeoTIFF` with multiple bands. 23 | - **Band Information**: 24 | - Supported bands, such as Blue, Green, Red, NIR. 25 | - Wavelength range or specifications per band. 26 | - **Metadata Requirements**: 27 | - Spectral resolution and sensor-specific information. 28 | - Spatial reference, bounding box, and temporal extent if time-indexed. 29 | - **Additional Processing**: 30 | - Generation of multiscale overviews. 31 | - Band normalization or calibration to standardize across datasets. 32 | 33 | === 3. 3D Time Series 34 | 35 | - **Description**: Multidimensional datasets incorporating spatial (X, Y) and temporal (Z) dimensions for tracking changes over time. 36 | - **Data Format**: Supported formats include `Zarr` and `NetCDF`. 37 | - **Temporal Resolution**: Required intervals, such as daily, weekly, or monthly. 38 | - **Metadata Requirements**: 39 | - Temporal indexing, ideally in ISO 8601 format. 40 | - Spatial reference and bounding box. 41 | - Data provenance, if applicable. 42 | - **Additional Processing**: 43 | - Support for multiscale pyramids to enable fast access and visualization over time. 44 | - Aggregation or summarization of data for efficient handling. 45 | 46 | -------------------------------------------------------------------------------- /standard/template/sections/clause_8_media_types.adoc: -------------------------------------------------------------------------------- 1 | == Media Types for any data encoding(s) 2 | 3 | A section describing the MIME-types to be used is mandatory for any standard involving data encodings. If no suitable MIME type exists in http://www.iana.org/assignments/media-types/index.html then this section may be used to define a new MIME type for registration with IANA. 4 | --------------------------------------------------------------------------------