From 0c2306e8414d5669da81d3bdbf02aacce3a1e805 Mon Sep 17 00:00:00 2001 From: Rajat Shinde Date: Tue, 20 Jan 2026 00:29:47 -0600 Subject: [PATCH 1/7] Push GeoCroissant spec and ttl file --- docs/croissant-geo-spec.md | 1441 ++++++++++++++++++++++++++++++++++++ docs/croissant.ttl | 7 + docs/croissant_geo.ttl | 161 ++++ 3 files changed, 1609 insertions(+) create mode 100644 docs/croissant-geo-spec.md create mode 100644 docs/croissant_geo.ttl diff --git a/docs/croissant-geo-spec.md b/docs/croissant-geo-spec.md new file mode 100644 index 000000000..1aff122cc --- /dev/null +++ b/docs/croissant-geo-spec.md @@ -0,0 +1,1441 @@ +# **GeoCroissant format Specification** + +Version 1.0 + +Status: Release Candidate + +Published: 01/20/2025 + +[http://mlcommons.org/croissant/geo/1.0](http://mlcommons.org/croissant/geo/1.0) + +Authors: + +* Rajat Shinde \- NASA Office of Data Science and Informatics \- University of Alabama in Huntsville, US +* Manil Maskey \- NASA, US +* Ag Stephens \- STFC Centre for Environmental Data Analysis (UK) +* Harsh Shinde \- Individual Researcher +* Joseph Edgerton \- UVA +* Tejasri N \- IIT Hyderabad, India +* Douglas Fils \- San Diego SuperComputing Center, US +* Edenna Chen \- Massachusetts Institute of Technology, US +* Claus Weiland \- Senckenberg \- Leibniz Institution for Biodiversity and Earth System Research +* Pedram Ghamisi \- Helmholtz-Zentrum Dresden-Rossendorf (HZDR), Germany | Lancaster University, UK +* Gerald Fenoy \- GeoLabs, France +* Yuhan Douglas Rao \- National Oceanic and Atmospheric Administration +* Omar Benjelloun \- Google +* Elena Simperl \- King’s College London & Open Data Institute, UK + + +Contributors *(in alphabetical order)*: + +* Anna Boser \- UCSB, US +* Armin Mehrabian +* Ben Lewis \- Harvard University +* Brianna R Pagan \- Development Seed +* Christine Kirkpatrick \- San Diego Super Computing Center, US +* Ed Parsons \- Google +* Gilles Quentin Hacheme \- Microsoft AI /GeoAI Africa +* Gobe Hobona \- Open Geospatial Consortium +* Harsha Vardhan Madiraju \- Open Geospatial Consortium +* Iksha Gurung \- NASA Office of Data Science and Informatics \- University of Alabama in Huntsville, US +* Jim Antonoissee \- National Geospatial-Intelligence Agency, US +* Jon Marokhovsky \- Clark University +* Konstantin Klemmer +* Luis Oala +* Samapriya Roy \- SpatialBytes and Desert Research Institute, US +* Scott Simmons \- Open Geospatial Consortium +* Sidharth Subramaniam \- Terrafloww Labs, India +* Simon Ilyushchenko \- Google +* Siri Jodha Khalsa \- IEEE Geosciences and Remote Sensing Society Standards Committee +* Slava Tykhonov \- CODATA +* Ying-Jung Chen + +Acknowledgements + +* MLCommons GeoCroissant Working Group +* MLCommons Croissant Working Group +* Open Geospatial Consortium (OGC) GeoAI Domain Working Group + +# **Introduction & overview** + +Croissant \[1\] is a metadata standard designed to describe datasets in a structured, machine-actionable way, improving how data is discovered, understood, and consumed by automated tools and AI/ML pipelines. Building on this foundation, GeoCroissant extends Croissant with GeoAI-specific concepts, including spatial and temporal extent, coordinate reference systems, tiling and grids, and geospatial assets to better support GeoAI and Earth observation (EO) workflows, where interoperability and precise geospatial context are essential. + +With the growing availability of geospatial and Earth observation (EO) data, there is increasing emphasis on making datasets FAIR and machine-actionable for automated discovery and reuse. Consistently structured metadata is central to this goal, capturing key geospatial characteristics (e.g., spatial/temporal extent, CRS, and resolution) alongside provenance and licensing to enable interoperability across platforms. Geospatial initiatives such as the Group on Earth Observations (GEO) Data Sharing Principles, as well as broader frameworks like the OECD Recommendation on Enhancing Access to and Sharing of Research Data and the European Open Science Cloud (EOSC), further reinforce transparent, responsible data stewardship and cross-platform interoperability. + +Efforts to standardize metadata documentation have led to the development of frameworks like the Data Catalog Vocabulary (DCAT) \[2\] and the dataset vocabulary in schema.org \[3\]. DCAT, for instance, enhances interoperability among web-based data catalogs, allowing users to efficiently aggregate, classify, and filter datasets. Similarly, schema.org \[3\] has become a widely adopted standard for metadata, enabling search engines to discover and index web content, including datasets. This improves the accessibility and understandability of datasets, making them more visible to a broader audience. Additionally, frameworks like Data Packages \[4\] and CSV on the Web \[5\] provide methods for describing and exchanging tabular data, further supporting data usability. + +## **Pre-requisites** + +Similar to non-geospatial aspects of the Croissant metadata standard, the GeoCroissant extension builds upon the schema.org/Dataset vocabulary. + +The GeoCroissant vocabulary is defined in its own namespace, identified by the IRI: + **http://mlcommons.org/croissant/geo/** + +This namespace IRI is generally abbreviated using the prefix: **geocr** + +In addition, this vocabulary relies on the following namespaces: + +| Prefix | IRI | Description | +| ----- | ----- | ----- | +| sc | [http://schema.org/](http://schema.org/) | The schema.org namespace | +| cr | [http://mlcommons.org/croissant/](http://mlcommons.org/croissant/) | MLCommons Croissant base namespace | +| geocr | [http://mlcommons.org/croissant/geo/](http://mlcommons.org/croissant/geo/) | GeoCroissant extension namespace | + +The GeoCroissant specification is versioned, and the version is included in the URI of this specification: + **http://mlcommons.org/croissant/geo/1.0** + +Croissant datasets that conform to the GeoCroissant specification must declare both their base Croissant conformance (e.g., Croissant 1.0 or 1.1) and, in addition, GeoCroissant conformance at the dataset level by including the following property: + +```json +"dct:conformsTo": [ + "http://mlcommons.org/croissant/1.1", + "http://mlcommons.org/croissant/geo/1.0" +] +``` + +Note that while the GeoCroissant specification is versioned, the geocr namespace itself is not. Therefore, the vocabulary terms within the GeoCroissant extension will retain stable URIs, even as the specification evolves. This approach supports machine-actionable compliance with the FAIR principles by making datasets **findable** through versioned URIs, **accessible** through standardized API endpoints and persistent URLs, **interoperable** via stable vocabulary terms, and **reusable** through explicit conformance declarations. + +***Note: Refer to Appendix A for instructions on installing GeoCroissant.*** + +## **Why metadata is important\!** + +Metadata plays a critical role in making data meaningful and actionable. Without it, datasets can be challenging to interpret, leading to misunderstandings or underutilization. Metadata provides context, ensuring that users understand the origin, purpose, and structure of the data. It also enables efficient search and discovery, saving time and resources. By standardizing metadata, organizations can ensure consistency, improve data sharing, and foster collaboration across different platforms and systems. + +## **Need for metadata in ML ready datasets & How Croissant helps** + + +Datasets are the foundation of Machine Learning (ML). However, the lack of standardization in how ML datasets are described and structured has created significant challenges for researchers and practitioners. Without clear and consistent descriptions, exploring, understanding, and utilizing datasets effectively becomes difficult. This has led to a situation where only a tiny fraction of popular datasets are widely used, while many others remain underutilized. To address these challenges, the Croissant metadata format has been introduced. Croissant simplifies using data in ML models by providing a standardized vocabulary based on [schema.org](http://schema.org) for describing dataset attributes. This standardization streamlines the way data is loaded across popular ML frameworks like PyTorch, TensorFlow, and JAX, enabling seamless interchange of datasets between different frameworks tackles key issues such as discoverability, portability, reproducibility, and responsible AI (RAI) practices via the [Croissant RAI extension](https://mlcommons.org/croissant/RAI/1.0). + +Croissant simplifies working with datasets in machine learning by providing detailed metadata that allows ML platforms to load datasets seamlessly. Users can integrate Croissant datasets into model training or evaluation with just a few lines of code. It is also easy to incorporate Croissant into tools commonly used by ML practitioners, such as those for data preprocessing, analysis, or labeling. Beyond enabling cross-platform compatibility, Croissant enhances dataset discovery. When publishers create Croissant metadata and set up compatible repositories, search engines can help users find and use datasets from various sources effortlessly. Additionally, publishers can create or modify Croissant descriptions using a visual editor or a Python library, making the process user-friendly. + +# **Geospatial Artificial Intelligence \- GeoAI** + +Geospatial Artificial Intelligence (GeoAI) refers to the application of AI techniques to geospatial data for advanced, location-based analysis, mapping, and decision-making. GeoAI leverages diverse data streams from satellites, airborne platforms, in-situ sensors, and ground observations, resulting in rich, high-volume datasets with complex spatio-temporal structures. + +As the volume and resolution of Earth data continue to grow, GeoAI enables new frontiers in applications such as climate modeling, disaster response, urban planning, and crop yield forecasting. The credibility and performance of AI models in these domains depend heavily on well-prepared, context-aware datasets. + +Several considerations are critical in the development of AI-ready geospatial datasets: + +1. **Importance of Location:** Accurate spatial information is fundamental, as geolocation errors or coarse annotations can directly compromise model predictions and reduce reliability in downstream tasks. +2. **Sampling Strategy:** With petabyte-scale datasets, careful sampling is essential to avoid class imbalance and ensure fair representation of diverse regions and phenomena. +3. **Data Lifecycle:** Many GeoAI applications are time-sensitive; stale or temporally mismatched data can reduce model relevance and generalizability. +4. **Cloud-Based Access:** Centralized, cloud-optimized storage and access enable efficient training, evaluation, and validation of large-scale datasets, and support collaborative workflows and scalable computation. +5. **End-to-End AI Workflow Integration:** Metadata-rich, modular formats like GeoCroissant allow seamless dataset ingestion into modern AI workflows, improving scalability and automation across the model lifecycle. + +While this specification emphasizes structural and semantic consistency, it also aligns with emerging practices in **Responsible AI** by promoting transparency, reproducibility, and ethical use of geospatial data in AI applications. + +## **Croissant and Geo-AI datasets** + +Modern Earth observation systems, such as NASA’s satellite fleet, generate massive volumes of high-resolution, multi-modal geospatial data daily. Analyzing this data manually is infeasible and AI and machine learning are essential for extracting insights at scale. However, turning raw geospatial data into AI-ready form requires rich, structured metadata. + +While the Croissant format introduces a strong foundation for ML dataset metadata, it lacks specific support for the unique characteristics of geospatial datasets. Earth observation data often exhibits high dimensionality, temporal complexity, and heterogeneity across formats (e.g., raster, vector, point cloud). It also demands spatial context, quality indicators, and privacy-aware attributes. + +The table below summarizes representative geospatial dataset types, the complexities common to Earth observation (EO) data, and the areas where Croissant core does not prescribe geospatial conventions (e.g., CRS, resolution, modality, and band semantics). GeoCroissant addresses these gaps by extending Croissant with standardized, interoperable metadata constructs that improve discoverability, interoperability, and ML-readiness for scalable and responsible GeoAI workflows. + +| Types of Geospatial Datasets | Issues in GeoAI datasets as compared to “generic” datasets | How does GeoCroissant (and Croissant) address these issues? | +| ----- | ----- | ----- | +| EO imagery (multi-band; optical/SAR) | Band semantics and modality-specific acquisition parameters | Standardize sensor/band descriptors and ML task metadata (Interoperability, ML workflow) | +| Spatiotemporal datasets (time series, in-situ, simulations) | Time indexing \+ spatiotemporal coverage consistency | Consistent temporal modeling and time-series support (Time-series support, Discovery) | +| Complex geo formats (NetCDF/HDF5/Zarr) | Nested variables, chunking, multiple assets per logical sample | Clear-mapping from raw containers to AI-ready datasets | +| Mixed geometry data (vector, raster, point clouds) | Heterogeneous geometry types and spatial reference handling | Uniform spatial semantics and discovery/query support | +| Human-labeled / crowdsourced GeoAI datasets | Sampling choices and spatial representativeness affect outcomes | Explicit provenance and spatial bias/sampling documentation based on Croissant RAI | + +## **GeoCroissant** + +As geospatial datasets grow to petabyte-scale and are distributed across multiple archives, there is a need for fast and efficient data access. We aim to create a standardized way to define geospatial datasets for AI through a new specification called **GeoCroissant**. Building on the core Croissant framework, **GeoCroissant** is explicitly designed for geospatial machine learning (Geo-ML) datasets. It enhances Croissant by adding essential geospatial metadata elements such as coordinate reference systems, temporal information, spatial and spectral resolution to make datasets easily discoverable and accessible with machine learning/deep learning frameworks such as PyTorch, TensorFlow, Keras, and HuggingFace for tasks such as land cover classification, climate modeling and forecasting extreme weather events. It also emphasizes responsible Geo-AI practices, as location-based attributes can vary significantly in Earth observation tasks. Key considerations like sampling strategies and geospatial biases are significant data-centric concepts that can impact model accuracy and will be efficiently represented in GeoCroissant to improve end-to-end data processing workflows. + +Below is an illustrative example of GeoCroissant metadata for a representative GeoAI dataset, highlighting key geospatial and machine-learning descriptors. + +### **Sample GeoCroissant Metadata** + +Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging Face: [https://huggingface.co/datasets/ibm-nasa-geospatial/hls\_burn\_scars](https://huggingface.co/datasets/ibm-nasa-geospatial/hls_burn_scars)). + +``` +{ + "@context": { + "@language": "en", + "@vocab": "https://schema.org/", + "cr": "http://mlcommons.org/croissant/", + "dct": "http://purl.org/dc/terms/", + "geocr": "http://mlcommons.org/croissant/geo/", + "sc": "https://schema.org/", + "conformsTo": "dct:conformsTo", + "citeAs": "cr:citeAs", + + "recordSet": "cr:recordSet", + "field": "cr:field", + "dataType": { "@id": "cr:dataType", "@type": "@vocab" }, + "source": "cr:source", + "extract": "cr:extract", + "fileSet": "cr:fileSet", + "fileProperty": "cr:fileProperty", + "includes": "cr:includes", + "containedIn": "cr:containedIn", + "references": "cr:references", + "key": "cr:key", + "arrayShape": "cr:arrayShape" + }, + "@type": "Dataset", + "name": "GeoCroissant Example: HLS Burn Scars", + "description": "Minimal GeoCroissant example illustrating CRS, spatial/temporal coverage, spatial resolution, band configuration, per-band spectral metadata, and RecordSets for images and masks.", + "datePublished": "2024-01-01", + "version": "1.0", + "conformsTo": [ + "http://mlcommons.org/croissant/1.1", + "http://mlcommons.org/croissant/geo/1.0" + ], + "citeAs": "https://doi.org/10.0000/example-doi", + "license": "https://creativecommons.org/licenses/by/4.0/", + + "spatialCoverage": { + "@type": "Place", + "geo": { + "@type": "GeoShape", + "box": "24.0 -125.0 49.0 -66.0" + } + }, + "temporalCoverage": "2018-01-01/2021-12-31", + + "geocr:coordinateReferenceSystem": "EPSG:4326", + "geocr:spatialResolution": { "@type": "QuantitativeValue", "value": 30, "unitText": "m" }, + + "geocr:bandConfiguration": { + "@type": "geocr:BandConfiguration", + "geocr:totalBands": 6, + "geocr:bandNameList": ["Blue", "Green", "Red", "NIR", "SW1", "SW2"] + }, + + "geocr:spectralBandMetadata": [ + { + "@type": "geocr:SpectralBand", + "name": "Blue", + "geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 490, "unitText": "nm" }, + "geocr:bandwidth": { "@type": "QuantitativeValue", "value": 98, "unitText": "nm" } + }, + { + "@type": "geocr:SpectralBand", + "name": "NIR", + "geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 865, "unitText": "nm" } + } + ], + + "distribution": [ + { + "@type": "cr:FileSet", + "@id": "images", + "name": "Images", + "encodingFormat": "image/tiff", + "includes": "images/**/*.tif" + }, + { + "@type": "cr:FileSet", + "@id": "masks", + "name": "Masks", + "encodingFormat": "image/tiff", + "includes": "masks/**/*.tif" + } + ], + + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "images_recordset", + "name": "Images", + "description": "Image assets (multi-band).", + "key": { "@id": "images_recordset/image" }, + "field": [ + { + "@type": "cr:Field", + "@id": "images_recordset/image", + "name": "image", + "dataType": "sc:ImageObject", + "source": { + "fileSet": { "@id": "images" }, + "extract": { "fileProperty": "content" } + }, + "arrayShape": [512, 512, 6], + + "geocr:bandConfiguration": { + "@type": "geocr:BandConfiguration", + "geocr:totalBands": 6, + "geocr:bandNameList": ["Blue", "Green", "Red", "NIR", "SW1", "SW2"] + }, + "geocr:spectralBandMetadata": [ + { + "@type": "geocr:SpectralBand", + "name": "Blue", + "geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 490, "unitText": "nm" } + } + ] + } + ] + }, + { + "@type": "cr:RecordSet", + "@id": "masks_recordset", + "name": "Masks", + "description": "Mask assets (single-band).", + "key": { "@id": "masks_recordset/mask" }, + "field": [ + { + "@type": "cr:Field", + "@id": "masks_recordset/mask", + "name": "mask", + "dataType": "sc:ImageObject", + "source": { + "fileSet": { "@id": "masks" }, + "extract": { "fileProperty": "content" } + }, + "arrayShape": [512, 512, 1], + + "geocr:bandConfiguration": { + "@type": "geocr:BandConfiguration", + "geocr:totalBands": 1, + "geocr:bandNameList": ["mask"] + } + } + ] + } + ] +} +``` + +***Note: Refer to Appendix B for the use-case study results, based on a survey conducted as part of the GeoCroissant user study.*** + +# **GeoCroissant Properties** + +The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). + +| GeoCroissant Use Case | GeoCroissant Properties | External Vocabulary Properties | Croissant Core Properties | Schema.org Properties | +| ----- | ----- | ----- | ----- | ----- | +| **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox proj:epsg, stac:gsd | | sc: GeospatialGeometry, sc:spatialCoverage | +| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType, spase:Observatory, spase:Iinstrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | +| **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | +| **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | +| **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | +| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI\_EOTask (OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | +| **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | +| **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | +| **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | +| **Use case 9: Caching AI-ready transformations of large geospatial data** | \- | | cr:transform, cr:extract, cr:FileSet / cr:FileObject | sc:encodingFormat, sc:contentUrl | + +The concepts which cannot be cleanly expressed using existing, widely adopted vocabularies are introduced as GeoCroissant (geocr:) properties. Below, we provide concise definitions and illustrative examples for each GeoCroissant property introduced in this specification grouped by specific geospatial metadata. + +### **Spatial Metadata** + +**`geocr:coordinateReferenceSystem`** +Coordinate Reference System (CRS)/projection used to interpret spatial data. Applicable to datasets requiring explicit spatial referencing and interoperability across geospatial tools and standards. +Expected data type: `sc:Text` +Domain: `sc:Dataset` +Range: `sc:Text` +Cardinality: ONE +Example: + +``` +{ + "@type": "Dataset", + "name": "Example dataset", + "geocr:coordinateReferenceSystem": "EPSG:4326" +} +``` + +**`geocr:spatialResolution`** +Nominal spatial resolution (ground sampling distance) represented by one pixel on the ground. Applicable when consumers need consistent resolution metadata for discovery, comparison, and ML-readiness; may be defined at dataset level or per record when resolution varies. +Expected data type: `sc:Text` or `sc:QuantitativeValue` +Domain: `sc:Dataset`, `cr:RecordSet` (or data-level) +Range: `sc:Text`, `sc:QuantitativeValue` +Cardinality: ONE + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (dataset-level resolution)", + "geocr:spatialResolution": { "@type": "QuantitativeValue", "value": 30, "unitText": "m" } +} +``` + +Example: Data-level (spatial resolution varies per record, for eg. [Harmonized Landsat and Sentinel-2 Product](https://www.earthdata.nasa.gov/data/projects/hls/spectral-bands)) + +``` +{ + "@type": "Dataset", + "name": "Example dataset (data-level resolution)", + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "records", + "name": "Records", + "field": [ + { + "@type": "cr:Field", + "@id": "records/spatialResolution", + "name": "spatialResolution", + "dataType": "sc:Text" + } + ], + "data": [ + { "records/spatialResolution": "10m" }, + { "records/spatialResolution": "30m" } + ] + } + ] +} +``` + +**`geocr:spatialIndex`** +Precomputed spatial index token(s) to support scalable, coarse spatial filtering (e.g., DGGS/H3/geohash-like identifiers). Applicable for large catalogs where indexing enables faster spatial discovery prior to exact geometry operations. +Expected data type: `sc:Text` +Domain: `sc:Dataset`, `cr:RecordSet` (or record-level) +Range: `sc:Text` +Cardinality: MANY + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (dataset-level spatial index)", + "geocr:spatialIndex": ["h3:8a2a1072b59fff", "h3:8a2a1072b5bfff"] +} +``` + +Example: Record-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (data-level spatial index)", + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "records", + "name": "Records", + "field": [ + { + "@type": "cr:Field", + "@id": "records/spatialIndex", + "name": "spatialIndex", + "dataType": "sc:Text" + } + ], + "data": [ + { "records/spatialIndex": "h3:8a2a1072b59fff" }, + { "records/spatialIndex": "h3:8a2a1072b5bfff" } + ] + } + ] +} +``` + +### **Spectral and Band Semantics Metadata** + +**`geocr:bandConfiguration`** +Band organization and semantics (e.g., band count, ordering, and names) for raster datasets. Applicable for multi-band EO datasets to ensure consistent interpretation of channels across workflows and standards. +Expected data type: `geocr:BandConfiguration` +Domain: `sc:Dataset`, `cr:Field` +Range: `geocr:BandConfiguration` +Cardinality: ONE + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (dataset-level band configuration)", + "geocr:bandConfiguration": { + "@type": "geocr:BandConfiguration", + "geocr:totalBands": 6, + "geocr:bandNameList": ["Blue", "Green", "Red", "NIR", "SW1", "SW2"] + } +} +``` + +Example: Data-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (field-level band configuration)", + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "records", + "name": "Records", + "field": [ + { + "@type": "cr:Field", + "@id": "records/image", + "name": "image", + "dataType": "sc:ImageObject", + "geocr:bandConfiguration": { + "@type": "geocr:BandConfiguration", + "geocr:totalBands": 6, + "geocr:bandNameList": ["Blue", "Green", "Red", "NIR", "SW1", "SW2"] + } + }, + { + "@type": "cr:Field", + "@id": "records/mask", + "name": "mask", + "dataType": "sc:ImageObject", + "geocr:bandConfiguration": { + "@type": "geocr:BandConfiguration", + "geocr:totalBands": 1, + "geocr:bandNameList": ["mask"] + } + } + ] + } + ] +} +``` + +**`geocr:totalBands`** +Number of bands in the raster asset. +Expected data type: `sc:Integer` +Domain: `geocr:BandConfiguration` +Range: `sc:Integer` +Cardinality: ONE + +Example: `"geocr:totalBands": 6` + +**`geocr:bandNameList`** +Ordered list of band names corresponding to the raster band stack. +Expected data type: `sc:Text` +Domain: `geocr:BandConfiguration` +Range: `sc:Text` +Cardinality: MANY + +Example: `"geocr:bandNameList": ["Blue", "Green", "Red", "NIR", "SW1", "SW2"]` + +**`geocr:spectralBandMetadata`** +Per-band spectral descriptors (e.g., center wavelength, bandwidth), enabling interoperable description of EO spectral characteristics. Applicable when downstream users/models require band physics/semantics beyond names alone. +Expected data type: `geocr:SpectralBand` +Domain: `sc:Dataset`, `cr:Field` +Range: `geocr:SpectralBand` +Cardinality: MANY + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (dataset-level spectral band metadata)", + "geocr:spectralBandMetadata": [ + { + "@type": "geocr:SpectralBand", + "name": "Blue", + "geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 490, "unitText": "nm" }, + "geocr:bandwidth": { "@type": "QuantitativeValue", "value": 98, "unitText": "nm" } + }, + { + "@type": "geocr:SpectralBand", + "name": "NIR", + "geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 865, "unitText": "nm" } + } + ] +} +``` + +Example: Data-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (field-level spectral band metadata)", + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "records", + "name": "Records", + "field": [ + { + "@type": "cr:Field", + "@id": "records/image", + "name": "image", + "dataType": "sc:ImageObject", + "geocr:spectralBandMetadata": [ + { + "@type": "geocr:SpectralBand", + "name": "Blue", + "geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 490, "unitText": "nm" }, + "geocr:bandwidth": { "@type": "QuantitativeValue", "value": 98, "unitText": "nm" } + }, + { + "@type": "geocr:SpectralBand", + "name": "NIR", + "geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 865, "unitText": "nm" } + } + ] + } + ] + } + ] +} +``` + +**`geocr:centerWavelength`** +Center wavelength for a spectral band entry. +Expected data type: `sc:QuantitativeValue` +Domain: `geocr:SpectralBand` +Range: `sc:QuantitativeValue` +Cardinality: ONE + +Example: `"geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 490, "unitText": "nm" }` + +**`geocr:bandwidth`** +Spectral bandwidth (e.g., full-width at half-maximum) for a spectral band entry. +Expected data type: `sc:QuantitativeValue` +Domain: `geocr:SpectralBand` +Range: `sc:QuantitativeValue` +Cardinality: ZERO or ONE + +Example: `"geocr:bandwidth": { "@type": "QuantitativeValue", "value": 98, "unitText": "nm" }` + +### **Programmatic Metadata Access** + +**`geocr:recordEndpoint`** +A URL that points to a service where the dataset’s metadata records can be queried and retrieved programmatically. This is useful when GeoCroissant metadata is maintained or served dynamically (e.g., a catalog or registry) and clients need to discover and access record-level metadata at scale. In practice, a user can start from the GeoCroissant JSON-LD, follow `geocr:recordEndpoint`, and then use that endpoint to list records, page through results, and apply supported filters (such as spatial, temporal, or keyword constraints) to obtain the specific records relevant to their workflow. + +For example, users can retrieve all records within a region by appending the dataset’s bounding box values as a query parameter to the `geocr:recordEndpoint`, e.g., `.../api/records?bbox=-125,24,-66,49`. Similarly, records within a temporal window can be requested by passing the dataset’s temporal range, e.g., `.../api/records?datetime=2018-01-01/2021-12-31`. + +Expected data type: `sc:Text`, `sc:URL` +Domain: `sc:Dataset` +Range: `sc:Text`, `sc:URL` +Cardinality: ZERO or ONE + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset with an API records endpoint", + "description": "Example dataset whose record-level metadata is accessible via OGC API – Records.", + "geocr:recordEndpoint": "https://example.org/ogcapi/records"} +``` + +### **Responsible GeoAI** + +**`geocr:spatialBias`** +Spatial representativeness limitations that may affect model generalization and evaluation (e.g., geographic concentration, under-sampled regions/biomes). Applicable for responsible reporting and risk-aware model use. +Expected data type: `sc:Text` +Domain: `sc:Dataset` +Range: `sc:Text` +Cardinality: ZERO or ONE + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (spatial bias)", + "geocr:spatialBias": "Geographically concentrated over CONUS; limited coverage elsewhere." +} +``` + +**`geocr:samplingStrategy`** +Description of how samples were selected or constructed (e.g., windowing/chipping strategy, filtering criteria), improving transparency and reproducibility. Applicable for documenting dataset construction choices that influence downstream performance. +Expected data type: `sc:Text` +Domain: `sc:Dataset` +Range: `sc:Text` +Cardinality: ZERO or ONE + +Example: Dataset-level + +``` +{ "@type": "Dataset", "name": "Example dataset (sampling strategy)", "geocr:samplingStrategy": "512×512 chips centered on burn polygons; cloudy scenes removed." } +``` + +### **Temporal Metadata** + +**`geocr:temporalResolution`** +Temporal cadence of the collection (e.g., 1 month), enabling consistent time-series interpretation, alignment, and sampling. Applicable to time-series EO and spatiotemporal datasets; can be dataset-level or record-level when cadence varies. +Expected data type: `sc:Text` or `sc:QuantitativeValue` +Domain: `sc:Dataset`, `cr:RecordSet` (or record-level) +Range: `sc:Text`, `sc:QuantitativeValue` +Cardinality: ZERO or ONE +Example: `"geocr:temporalResolution": { "@type":"QuantitativeValue","value":1,"unitText":"month" }` + +Example: Dataset-level + +``` +{ "@type": "Dataset", "name": "Example dataset (dataset-level temporal resolution)", "geocr:temporalResolution": { "@type": "QuantitativeValue", "value": 1, "unitText": "month" } } +``` + +Example: Data-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset (record-level temporal resolution)", + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "records", + "name": "Records", + "field": [ + { + "@type": "cr:Field", + "@id": "records/temporalResolution", + "name": "temporalResolution", + "dataType": "sc:Text" + } + ], + "data": [ + { "records/temporalResolution": "1 month" }, + { "records/temporalResolution": "1 week" } + ] + } + ] +} +``` + +**`geocr:timeSeriesIndex`** +Identifies the record-level field used to order/index the time series (e.g., a timestamp field), enabling deterministic sorting and slicing of temporal sequences. Applicable to RecordSets representing ordered temporal observations. +Expected data type: `sc:Text` +Domain: `cr:RecordSet` +Range: `sc:Text` +Cardinality: ZERO or ONE + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example dataset", + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "timeseries_recordset", + "name": "Time series records", + "geocr:timeSeriesIndex": { "@id": "timeseries_recordset/timestamp" }, + "field": [ + { + "@type": "cr:Field", + "@id": "timeseries_recordset/timestamp", + "name": "timestamp", + "dataType": "sc:DateTime" + }, + { + "@type": "cr:Field", + "@id": "timeseries_recordset/image", + "name": "image", + "dataType": "sc:ImageObject", + "cr:arrayShape": [512, 512, 6] + } + ] + } + ] +} +``` + +### **Space Weather Metadata** + +**`geocr:multiWavelengthConfiguration`** +Composite wrapper for multi-wavelength configuration to simplify authoring and later mapping to SPASE constructs. Applicable to Space Weather/heliophysics datasets with multiple wavelength channels. +Expected data type: `geocr:MultiWavelengthConfiguration` +Domain: `sc:Dataset` +Range: `geocr:MultiWavelengthConfiguration` +Cardinality: ZERO or ONE + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example Space Weather dataset (multi-wavelength configuration)", + "geocr:multiWavelengthConfiguration": { + "@type": "geocr:MultiWavelengthConfiguration", + "geocr:channelList": ["171Å", "193Å"] + } +} +``` + +**`geocr:solarInstrumentCharacteristics`** +Composite wrapper for solar/heliophysics instrument characterization to simplify authoring and later mapping to SPASE constructs. Applicable to Space Weather datasets requiring instrument-specific descriptors. +Expected data type: `geocr:SolarInstrumentCharacteristics` +Domain: `sc:Dataset` +Range: `geocr:SolarInstrumentCharacteristics` +Cardinality: ZERO or ONE + +Example: Dataset-level + +``` +{ + "@type": "Dataset", + "name": "Example Space Weather dataset (solar instrument characteristics)", + "geocr:solarInstrumentCharacteristics": { + "@type": "geocr:SolarInstrumentCharacteristics", + "geocr:observatory": "SDO", + "geocr:instrument": "AIA" + } +} +``` + +**`geocr:observatory`** +Name or identifier of the observatory/platform associated with a solar/heliophysics measurement. +Expected data type: `sc:Text` +Domain: `geocr:SolarInstrumentCharacteristics` +Range: `sc:Text` +Cardinality: ZERO or ONE +Example: `"geocr:observatory": "SDO"` + +**`geocr:instrument`** +Name or identifier of the instrument producing the measurement. +Expected data type: `sc:Text` +Domain: `geocr:SolarInstrumentCharacteristics` +Range: `sc:Text` +Cardinality: ZERO or ONE +Example: `"geocr:instrument": "AIA"` + +**`geocr:channelList`** +Composite wrapper to capture the wavelength channels used in a Space Weather/heliophysics dataset, to support mapping to SPASE constructs. +Expected data type: `sc:Text` +Domain: `geocr:MultiWavelengthConfiguration` +Range: `sc:Text` +Cardinality: ZERO or ONE +Example: `"geocr:channelList": ["171Å", "193Å"]` + +# **Use cases** + +This section provides an overview of the various use cases that would be served by the vocabulary. Generally speaking, we distinguish between metadata attributes at dataset level, akin to existing data cards and similar formats, and at record level (e.g. extracting information from the lexical and semantic content of records in a dataset using them as record-level annotations), which are needed to respond to use cases around fairness or safety that require a more granular view of the dataset life cycle. We consider records to be the atomic units of the dataset, e.g. sentence, conversations, images, videos, etc. Ultimately, these record-level annotations will also be aggregated at a dataset-level metadata indicating descriptions such as, e.g. coverage of concepts, topics and level of adversariality for safety, and extracting insights for context-specific bias present in the dataset. + +## **Use case 1: Space Weather Datasets** + +This use case demonstrates the integration of space weather datasets into the GeoCroissant format through automated metadata conversion workflows. Specifically, it explores the use of large language models (LLMs) and custom parsing logic to convert metadata from the Space Physics Archive Search and Extract (SPASE) standard into Croissant-compliant metadata. The datasets, derived from NASA’s GOES satellite missions, include both single CSV files and ZIP archives containing multiple CSVs with associated SPASE XML metadata. + +A proof-of-concept tool named **SPASECroissant Oven** was developed to automate this process. It builds Croissant metadata layers—including description, distribution, and recordSet—by leveraging LLMs to infer spase:MeasurementType, data types, and column descriptors. The tool also demonstrates the feasibility of integrating SPASE-specific metadata elements (e.g., NumericalData, Observatory, and InstrumentTypes) into the GeoCroissant structure, enabling richer scientific documentation. + +Furthermore, the use case identifies opportunities to support multiple data formats (e.g., NetCDF), incorporate "loose" or contextual metadata via descriptive fields, and handle varied file extractions. These explorations suggest a path toward broader interoperability between GeoCroissant and existing domain-specific metadata standards, while supporting automated tooling for scalable metadata generation. + +### **Key Properties in Use:** + +| GeoCroissant Property | Notes | +| ----- | ----- | +| `geocr:multiWavelengthConfiguration` | Structured GeoCroissant property (typed as `geocr:MultiWavelengthConfiguration`) that captures the set of wavelength channels (e.g., via `geocr:channelList`) to simplify authoring and support subsequent mapping to SPASE | +| `geocr:solarInstrumentCharacteristics` | Structured GeoCroissant property (typed as `geocr:SolarInstrumentCharacteristics`) that captures observatory/platform and instrument identifiers (e.g., `geocr:observatory`, `geocr:instrument`) to simplify authoring and support subsequent mapping to SPASE. | + +## **Use case 2: Interoperability with other standards** + +This use case addresses the need for interoperability between the GeoCroissant metadata format and other established geospatial metadata standards, specifically the **Spatio-Temporal Asset Catalog (STAC)** and **GeoDCAT**. As geospatial data infrastructures increasingly rely on standard-compliant catalogs and APIs, enabling attribute-level alignment across these formats is critical for ensuring data discoverability and reuse. + +The table below demonstrates a mapping between commonly used metadata fields in STAC, GeoCroissant, and GeoDCAT. This mapping enables metadata interoperability, facilitates automated format conversion, and supports integration with existing data catalogs, search engines, and metadata brokers. + +| STAC field | GeoCroissant field | External vocabulary field | +| ----- | ----- | ----- | +| id | @id | N/A | +| type | @type | N/A | +| title | name | dcat:title | +| description | description | dcat:description | +| datetime (or properties.datetime) | \- | schema:temporalCoverage, dct:temporal | +| bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | +| geometry | \- | geosparql:hasGeometry, geosparql:asWKT | +| assets | distribution | dcat:distribution | +| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | +| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | +| proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | +| gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | +| eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | + +### **Key Properties in Use:** + +| Property | Purpose | +| ----- | ----- | +| `geocr:coordinateReferenceSystem` | Specifies the dataset CRS/projection (e.g., EPSG code) to ensure consistent spatial referencing and interoperability across geospatial tools and standards. | +| `geocr:spatialResolution` | Captures the dataset’s nominal spatial resolution (e.g., ground sampling distance) to support discovery, interoperability, and ML-readiness. | +| `geocr:bandConfiguration (value typed as geocr:BandConfiguration)` | Describes raster band organization and semantics (e.g., band count and ordered band names) to support interoperable use of multi-band imagery. Spectral descriptors are represented separately via geocr:spectralBandMetadata (typed as geocr:SpectralBand). | + +## **Use case 3: Programmatic Metadata Access (OGC APIs)** + +To improve discoverability and enable programmatic access to geospatial metadata, this use case aligns GeoCroissant with the Open Geospatial Consortium (OGC) API – Records standard. OGC API – Records defines a RESTful interface for publishing and querying metadata records in a consistent, interoperable manner, supporting common discovery workflows across catalogs and registries. + +When a GeoCroissant dataset exposes its record-level metadata through an OGC API – Records endpoint (e.g., `/records`, referenced via `geocr:recordEndpoint`), clients can retrieve individual records and apply spatial and temporal filters. The returned records can be expressed as a GeoJSON FeatureCollection, allowing GeoCroissant-style descriptors, such as geometry, bounding boxes, and resolution which can be consumed directly by web clients, spatial dashboards, and registry services for visualization and downstream integration. + +Below is an example JSON response from a `/records` endpoint showing how GeoCroissant-style metadata can be represented in a **GeoJSON FeatureCollection**, making it suitable for direct spatial querying and client-side rendering. + +``` +{ + "@context": { + "@language": "en", + "@vocab": "https://schema.org/", + "cr": "http://mlcommons.org/croissant/", + "dct": "http://purl.org/dc/terms/", + "geocr": "http://mlcommons.org/croissant/geo/", + "sc": "https://schema.org/", + "conformsTo": "dct:conformsTo", + "citeAs": "cr:citeAs", + "recordSet": "cr:recordSet", + "field": "cr:field", + "dataType": { "@id": "cr:dataType", "@type": "@vocab" }, + "source": "cr:source", + "extract": "cr:extract", + "fileSet": "cr:fileSet", + "fileProperty": "cr:fileProperty", + "includes": "cr:includes", + "containedIn": "cr:containedIn", + "references": "cr:references", + "key": "cr:key", + "arrayShape": "cr:arrayShape" + }, + "@type": "Dataset", + "name": "GeoCroissant Example: Programmatic Metadata Access", + "description": "Minimal example showing how a GeoCroissant dataset can advertise a record-query endpoint for programmatic access to record-level metadata.", + "datePublished": "2024-01-01", + "version": "1.0", + "conformsTo": [ + "http://mlcommons.org/croissant/1.1", + "http://mlcommons.org/croissant/geo/1.0" + ], + "citeAs": "https://doi.org/10.0000/example-doi", + "license": "https://creativecommons.org/licenses/by/4.0/", + + "geocr:recordEndpoint": "https://example.org/api/records", + + "spatialCoverage": { + "@type": "Place", + "geo": { + "@type": "GeoShape", + "box": "24.0 -125.0 49.0 -66.0" + } + }, + "temporalCoverage": "2018-01-01/2021-12-31", + "geocr:spatialResolution": { "@type": "QuantitativeValue", "value": 30, "unitText": "m" }, + "geocr:coordinateReferenceSystem": "EPSG:4326", + + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "records_recordset", + "name": "Records", + "description": "Illustrative record-level metadata that may be retrieved from geocr:recordEndpoint (e.g., using bbox/datetime filters).", + "key": { "@id": "records_recordset/recordId" }, + "field": [ + { + "@type": "cr:Field", + "@id": "records_recordset/recordId", + "name": "recordId", + "dataType": "sc:Text" + }, + { + "@type": "cr:Field", + "@id": "records_recordset/spatialCoverage", + "name": "spatialCoverage", + "description": "Record footprint or bounding region expressed using schema.org spatialCoverage.", + "dataType": "sc:Place" + }, + { + "@type": "cr:Field", + "@id": "records_recordset/temporalCoverage", + "name": "temporalCoverage", + "description": "Record temporal interval (ISO 8601 interval string).", + "dataType": "sc:Text" + }, + { + "@type": "cr:Field", + "@id": "records_recordset/spatialResolution", + "name": "geocr:spatialResolution", + "description": "Record-level spatial resolution when it varies across records.", + "dataType": "sc:QuantitativeValue" + }, + { + "@type": "cr:Field", + "@id": "records_recordset/spatialIndex", + "name": "geocr:spatialIndex", + "description": "Optional coarse spatial index token(s) for scalable filtering.", + "dataType": "sc:Text" + } + ], + "data": [ + { + "records_recordset/recordId": "rec-001", + "records_recordset/spatialCoverage": { + "@type": "Place", + "geo": { "@type": "GeoShape", "box": "33.0 -118.5 34.0 -117.0" } + }, + "records_recordset/temporalCoverage": "2019-06-01/2019-06-30", + "records_recordset/spatialResolution": { "@type": "QuantitativeValue", "value": 30, "unitText": "m" }, + "records_recordset/spatialIndex": "h3:8a2a1072b59fff" + } + ] + } + ] +} +``` + +### **Key Properties in Use:** + +| Property | Purpose | +| ----- | ----- | +| `geocr:recordEndpoint` | Declares the OGC API – Records endpoint (e.g., /records) where the dataset’s metadata records can be programmatically retrieved and filtered. | + +## **Use case 4: Search and Discovery \- GeoSPARQL** + +This use case demonstrates querying GeoCroissant metadata using **GeoSPARQL**, a W3C standard vocabulary and SPARQL extension that enables spatial reasoning over RDF data. In this pattern, GeoCroissant datasets express geometry using **GeoSPARQL terms** (e.g., `geosparql:hasGeometry` with geometries serialized via `geosparql:asWKT`), allowing a semantic graph database (e.g., GraphDB) to evaluate spatial predicates such as containment and intersection. + +To complement GeoSPARQL reasoning, GeoCroissant introduces `geocr:spatialIndex` as an **optional indexing hook** (e.g., a DGGS cell identifier, geohash-like token, or other spatial key) that supports efficient coarse filtering and scalable discovery prior to executing exact GeoSPARQL geometry operations. We envisage that GeoSPARQL geometry semantics and the optional `geocr:spatialIndex` enable interoperable spatial querying and improved performance for large GeoCroissant collections in linked-data ecosystems. + +### **Key Properties in Use:** + +| Property | Purpose | +| ----- | ----- | +| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | +| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | +| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | +| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | + +***Note: Refer to Appendix C for examples showing querying in GeoCroissant format using GeoSPARQL.*** + +## **Use case 5: ML Pipeline Integration** + +Given a sample Geo-AI [dataset](https://huggingface.co/datasets/ibm-nasa-geospatial/hls_burn_scars) consisting of image-label pairs, this use-case highlights how data can be loaded to PyTorch using a custom pipeline for ML workflows. + +Example 1: Loading the GeoCroissant + +```py +import mlcroissant as mlc + +jsonld = "geocroissant_ml.json" +dataset = mlc.Dataset(jsonld) + +print(dataset.metadata.to_json()) +``` + +Output- + +``` +{'@context': {'@language': 'en', '@vocab': 'https://schema.org/', 'column': 'ml:column', 'data': {'@id': 'ml:data', '@type': '@json'}, 'dataType': {'@id': 'ml:dataType', '@type': '@vocab'}, 'extract': 'ml:extract', 'field': 'ml:field', 'fileProperty': 'ml:fileProperty', 'format': 'ml:format', 'includes': 'ml:includes', 'isEnumeration': 'ml:isEnumeration', 'jsonPath': 'ml:jsonPath', 'ml': 'http://mlcommons.org/schema/', 'parentField': 'ml:parentField', 'path': 'ml:path', 'recordSet': 'ml:recordSet', 'references': 'ml:references', 'regex': 'ml:regex', 'repeated': 'ml:repeated', 'replace': 'ml:replace', 'sc': 'https://schema.org/', 'separator': 'ml:separator', 'source': 'ml:source', 'subField': 'ml:subField', 'transform': 'ml:transform', 'geocr': 'http://mlcommons.org/croissant/geo/', 'cr': 'http://mlcommons.org/croissant/', 'dct': 'http://purl.org/dc/terms/', 'version': '1.0'}, '@type': 'sc:Dataset', 'name': 'Example_GeoCroissant_Dataset', 'description': 'An example dataset following the GeoCroissant format.', 'url': 'https://example.com/geocroissant', 'distribution': [{'@type': 'sc:FileObject', 'name': 'satellite_image', 'contentUrl': 'https://example.com/image.tif', 'encodingFormat': 'image/tiff', 'sha256': 'your_checksum_here'}]} +``` + +Example 2: The ML workflow for loading dataset using custom dataloader is as follows- + +```py +import mlcroissant as mlc +import torch +from torch.utils.data import Dataset, DataLoader +import rasterio +import numpy as np +from pathlib import Path + +# Step 1: Point to the local Croissant metadata file +url = "geocroissant.json" +# Step 2: Load the dataset metadata +dataset = mlc.Dataset(url) + +# Step 3: Get image paths from Croissant metadata +metadata = dataset.metadata +base_path = Path(metadata.distribution[0].content_url) +image_pattern = metadata.distribution[1].includes[0] + +# Find all image files matching the pattern +image_files = sorted(base_path.glob(image_pattern)) + +# Step 4: Create a PyTorch Dataset +class CroissantDataset(Dataset): + """PyTorch Dataset using Croissant metadata.""" + + def __init__(self, image_paths, split=None): + if split: + self.image_paths = [p for p in image_paths if split in str(p)] + else: + self.image_paths = image_paths + + def __len__(self): + return len(self.image_paths) + + def __getitem__(self, idx): + image_path = self.image_paths[idx] + mask_path = str(image_path).replace("_merged.tif", ".mask.tif") + + # Read the GeoTIFF image + with rasterio.open(image_path) as src: + image = src.read().astype(np.float32) + + # Read the mask + with rasterio.open(mask_path) as src: + mask = src.read(1).astype(np.int64) + + return { + 'image': torch.from_numpy(image), + 'mask': torch.from_numpy(mask) + } + +# Step 5: Create dataset splits +train_data = CroissantDataset(image_files, split="training") +val_data = CroissantDataset(image_files, split="validation") + +# Step 6: Create DataLoaders +train_loader = DataLoader(train_data, batch_size=1, shuffle=False) +val_loader = DataLoader(val_data, batch_size=1, shuffle=False) + +# Step 7: Iterate over the dataset +for i, example in enumerate(train_loader): + if i >= 3: + break + print(example) +``` + +```json +{'image': tensor([[[[0.0304, 0.0135, 0.0114, ..., 0.0149, 0.0180, 0.0198], + [0.0135, 0.0130, 0.0098, ..., 0.0145, 0.0151, 0.0173], + ..., + [0.0378, 0.0597, 0.0653, ..., 0.0233, 0.0200, 0.0179], + [0.0508, 0.0806, 0.0809, ..., 0.0230, 0.0237, 0.0262], + [0.0674, 0.0907, 0.0806, ..., 0.0343, 0.0337, 0.0296]]]]]), 'mask': tensor([[[0, 0, 0, ..., 0, 0, 0], + ..., + [0, 0, 0, ..., 1, 1, 1], + [0, 0, 0, ..., 1, 1, 1]]])} +``` + +## **Use case 6: Responsible GeoAI** + +This use case demonstrates how Responsible AI (RAI) metadata can be used to document the end-to-end lifecycle, provenance, and intended use of GeoAI datasets. Using the HLS Burn Scar dataset as an illustrative example, it shows how the Croissant RAI extension can be integrated within GeoCroissant to capture ethical, quality, and transparency considerations alongside core geospatial descriptors. + +RAI fields such as `rai:dataCollection`, `rai:dataCollectionType`, `rai:dataUseCases`, and `rai:citationInfo` describe how the dataset was produced, the contexts in which it is appropriate to apply, and its source and attribution (See [Croissant RAI specification](http://mlcommons.org/croissant/RAI/1.0) for more details). In GeoAI settings, pairing these RAI descriptors with GeoCroissant-specific annotations (e.g., `geocr:spatialBias` and `geocr:samplingStrategy`) helps make spatial representativeness and sampling decisions explicit, improving auditability, comparability, and reproducibility for applications such as disaster response, environmental monitoring, and land-cover mapping. + +```json +{ + "@context": { + "@language": "en", + "@vocab": "https://schema.org/", + "cr": "http://mlcommons.org/croissant/", + "dct": "http://purl.org/dc/terms/", + "geocr": "http://mlcommons.org/croissant/geo/", + "rai": "http://mlcommons.org/croissant/RAI/", + "sc": "https://schema.org/", + "conformsTo": "dct:conformsTo", + "citeAs": "cr:citeAs", + + "recordSet": "cr:recordSet", + "field": "cr:field", + "dataType": { "@id": "cr:dataType", "@type": "@vocab" }, + "source": "cr:source", + "extract": "cr:extract", + "fileSet": "cr:fileSet", + "fileProperty": "cr:fileProperty", + "includes": "cr:includes", + "containedIn": "cr:containedIn", + "references": "cr:references", + "key": "cr:key" + }, + + "@type": "Dataset", + "name": "GeoCroissant + RAI Example: HLS Burn Scars", + "description": "Minimal GeoCroissant + RAI example showing CRS, spatial/temporal coverage, spatial resolution, ML task, sensor + spectral bands, and Responsible GeoAI annotations (spatial bias, sampling strategy, and RAI fields).", + "datePublished": "2024-01-01", + "version": "1.0", + "conformsTo": [ + "http://mlcommons.org/croissant/1.1", + "http://mlcommons.org/croissant/geo/1.0", + "http://mlcommons.org/croissant/RAI/1.0" + ], + "citeAs": "https://doi.org/10.0000/example-doi", + "license": "https://creativecommons.org/licenses/by/4.0/", + + "spatialCoverage": { + "@type": "Place", + "geo": { "@type": "GeoShape", "box": "24.0 -125.0 49.0 -66.0" } + }, + "temporalCoverage": "2018-01-01/2021-12-31", + "geocr:spatialResolution": { "@type": "QuantitativeValue", "value": 30, "unitText": "m" }, + "geocr:coordinateReferenceSystem": "EPSG:4326", + + "geocr:spatialBias": "Spatial coverage is concentrated over the contiguous United States; high-latitude regions and other global biomes are under-represented.", + "geocr:samplingStrategy": "512×512 chips are sampled by centering windows on burn-scar polygons; scenes are filtered to remove high cloud cover and missing data.", + + "rai:dataCollection": "Chips are generated by co-locating HLS scenes with reference burn polygons and extracting fixed-size windows centered on burn scars.", + "rai:dataBiases": "Potential geographic bias (CONUS focus), temporal bias (2018–2021), and class imbalance between burned and unburned pixels.", + "rai:dataUseCases": ["Training", "Validation", "Testing", "Fine-tuning"], + + "distribution": [ + { + "@type": "cr:FileSet", + "@id": "images", + "name": "Images", + "encodingFormat": "image/tiff", + "includes": "images/**/*.tif" + }, + { + "@type": "cr:FileSet", + "@id": "masks", + "name": "Masks", + "encodingFormat": "image/tiff", + "includes": "masks/**/*.tif" + } + ], + + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "images_recordset", + "name": "Images", + "description": "Image files", + "key": { "@id": "images_recordset/image" }, + "field": [ + { + "@type": "cr:Field", + "@id": "images_recordset/image", + "name": "image", + "dataType": "sc:ImageObject", + "source": { + "fileSet": { "@id": "images" }, + "extract": { "fileProperty": "content" } + }, + "cr:arrayShape": [512, 512, 6] + } + ] + }, + { + "@type": "cr:RecordSet", + "@id": "masks_recordset", + "name": "Masks", + "description": "Mask files", + "key": { "@id": "masks_recordset/mask" }, + "field": [ + { + "@type": "cr:Field", + "@id": "masks_recordset/mask", + "name": "mask", + "dataType": "sc:ImageObject", + "source": { + "fileSet": { "@id": "masks" }, + "extract": { "fileProperty": "content" } + }, + "cr:arrayShape": [512, 512, 1] + } + ] + } + ] +} +``` + +### **Mapped RAI Attributes** + +| Property | Purpose | +| ----- | ----- | +| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | +| `geocr:samplingStrategy` | Describes how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria), enabling reproducible dataset creation and interpretation of training data. | + +## **Use case 7: Support for Time-Series Data** + +Time-series Earth observation (EO) datasets are foundational for GeoAI tasks such as change detection, phenology monitoring, disturbance mapping, and forecasting. Unlike static datasets, time-series collections require explicit metadata for temporal cadence and record ordering, so that downstream systems can reliably align, subset, and batch observations across time. GeoCroissant addresses this by supporting time-series constructs (e.g., `geocr:temporalResolution` and `geocr:timeSeriesIndex`) alongside core geospatial descriptors (coverage, CRS, resolution) and record-level assets. + +Below is an illustrative example showing how GeoCroissant can represent time-series datasets. + +```json +{ + "@context": { + "@language": "en", + "@vocab": "https://schema.org/", + "cr": "http://mlcommons.org/croissant/", + "geocr": "http://mlcommons.org/croissant/geo/", + "dct": "http://purl.org/dc/terms/", + "sc": "https://schema.org/", + "conformsTo": "dct:conformsTo", + "citeAs": "cr:citeAs", + "recordSet": "cr:recordSet", + "field": "cr:field", + "dataType": { "@id": "cr:dataType", "@type": "@vocab" }, + "source": "cr:source", + "extract": "cr:extract", + "fileSet": "cr:fileSet", + "fileProperty": "cr:fileProperty", + "includes": "cr:includes", + "key": "cr:key" + }, + "@type": "Dataset", + "name": "HLS Sentinel-2 Time Series (Example)", + "description": "Monthly multispectral EO time series with an explicit temporal index for ordering.", + "datePublished": "2025-01-27", + "version": "1.0.0", + "conformsTo": [ + "http://mlcommons.org/croissant/1.1", + "http://mlcommons.org/croissant/geo/1.0" + ], + "license": "https://creativecommons.org/licenses/by/4.0/", + + "spatialCoverage": { + "@type": "Place", + "geo": { "@type": "GeoShape", "box": "24.0 -125.0 49.0 -66.0" } + }, + "temporalCoverage": "2018-01-01/2021-12-31", + "geocr:spatialResolution": { "@type": "QuantitativeValue", "value": 30, "unitText": "m" }, + "geocr:coordinateReferenceSystem": "EPSG:4326", + "geocr:temporalResolution": { "@type": "QuantitativeValue", "value": 1, "unitText": "month" }, + + "distribution": [ + { + "@type": "cr:FileSet", + "@id": "timeseries_images", + "name": "Time Series Images", + "encodingFormat": "image/tiff", + "includes": "images/**/*.tif" + } + ], + + "recordSet": [ + { + "@type": "cr:RecordSet", + "@id": "timeseries_recordset", + "name": "Time Series Records", + "description": "Each record links an image to its acquisition timestamp for temporal ordering.", + "key": { "@id": "timeseries_recordset/image" }, + "geocr:timeSeriesIndex": { "@id": "timeseries_recordset/timestamp" }, + "field": [ + { + "@type": "cr:Field", + "@id": "timeseries_recordset/timestamp", + "name": "timestamp", + "description": "Acquisition timestamp used to order the time series.", + "dataType": "sc:DateTime" + }, + { + "@type": "cr:Field", + "@id": "timeseries_recordset/image", + "name": "image", + "description": "Multispectral image for a given time step.", + "dataType": "sc:ImageObject", + "source": { + "fileSet": { "@id": "timeseries_images" }, + "extract": { "fileProperty": "content" } + }, + "cr:arrayShape": [3660, 3660, 13] + } + ] + } + ] +} +``` + +## **Use case 8: Adding custom properties** + +If a required metadata attribute is already defined in an established external vocabulary (e.g., GeoSPARQL, SPASE, Dublin Core Terms), GeoCroissant recommends reusing that term verbatim by declaring the appropriate prefix/IRI mapping in the JSON-LD @context and employing the external property directly (refer to the Croissant 1.1 specification on [adding external vocabularies](https://docs.mlcommons.org/croissant/docs/croissant-spec-1.1.html#using-external-vocabularies)). If no suitable term exists in any recognized vocabulary, the metadata should be expressed in a vocabulary-agnostic manner using sc:additionalProperty with sc:PropertyValue (and sc:QuantitativeValue for numeric values with units), as illustrated below. + +```json +{ + "@type": "sc:Dataset", + "name": "Example", + "additionalProperty": [ + { + "@type": "PropertyValue", + "name": "cloudCoverMedian", + "value": { + "@type": "QuantitativeValue", + "value": 12.3, + "unitText": "%" + } + }, + { + "@type": "PropertyValue", + "name": "tilingScheme", + "value": "MGRS" + } + ] +} +``` + +***Note: Refer to Appendix B (Section 3.3) for example showing definition of custom properties after porting a NASA-UMM metadata model to GeoCroissant.*** + +## **Use case 9: Caching AI-ready transformations of large geospatial data** + +Use case 9 focusses on the scenario where the source data consists of large geospatial datasets held on servers and/or cloud services formats such as NetCDF and Zarr. The scientific user wishes to work with the data in a form that is AI-ready, meaning that any extractions, filtering and transformations should be computed in advance so that the data is optimized for Tensor access on GPUs. The natural solution is to enable a large data cache (O(TBs)) on the platform running the GPUs. Given its cloud-optimized structure, which works on both POSIX file systems and Object Storage, Zarr is chosen as the payload for the AI-ready version of the data, with a Croissant record providing the high-level metadata and entry-point to the Zarr content. + +This approach requires a comprehensive Zarr-to-Croissant mapping that enables auto-generation from Zarr files and additional configuration templates. Extensions are being developed to enable integration of the Zarr payload with the existing *mlcroissant* library. The aim is to allow ML workflows to load datasets from Zarr stores as easily as is currently done with a CSV file, enabling the Data Scientist to focus on the ML training and evaluation whilst the tools provide the data interfaces and transformations at scale. + +Example notebook recipes demonstrating GeoCroissant usage are available on the MLCommons Croissant GitHub repository. + +# **References** + +1. https://docs.mlcommons.org/croissant/docs/croissant-spec.html +2. Riccardo Albertoni, David Browning, Simon J D Cox, Alejandra Gonzalez Beltran, Andrea Perego, and Peter Winstanley. Data catalog vocabulary (DCAT) \- version 3\. https://www.w3.org/TR/vocab-dcat-3/, 01 2024\. +3. schema.org. Schema.org v26.0.https://github.com/schemaorg/schemaorg/tree/main/data/releases/26.0/, 02 2024\. +4. Ramanathan V Guha, Dan Brickley, and Steve Macbeth. Schema. org: evolution of structured data on the web. Communications of the ACM, 59(2):44–51, 2016\. +5. Frictionless Working Group. Data packages [https://specs.frictionlessdata.io/,2024](https://specs.frictionlessdata.io/,2024) +6. W3C Working Group. CSV on the web: A primer. https://www.w3.org/TR/ + tabular-data-primer/, +7. [https://docs.mlcommons.org/croissant/docs/croissant-spec.html](https://docs.mlcommons.org/croissant/docs/croissant-spec.html) +8. [https://www.earthdata.nasa.gov/news/blog/introducing-croissant-format-machine-learning-datasets](https://www.earthdata.nasa.gov/news/blog/introducing-croissant-format-machine-learning-datasets) +9. [https://docs.mlcommons.org/croissant/docs/croissant-rai-spec.html](https://docs.mlcommons.org/croissant/docs/croissant-rai-spec.html) +10. [GeoCroissant- A Metadata Framework for Geospatial ML-ready Datasets](https://www.grss-ieee.org/events/geocroissant-a-metadata-framework-for-geospatial-ml-ready-datasets/) +11. Akhtar, M., Benjelloun, O., Conforti, C., Foschini, L., Giner-Miguelez, J., Gijsbers, P., Goswami, S., Jain, N., Karamousadakis, M., Kuchnik, M. and Krishna, S., 2024\. Croissant: A metadata format for ml-ready datasets. *Advances in Neural Information Processing Systems*, *37*, pp.82133-82148. +12. Jain, N., Akhtar, M., Giner-Miguelez, J., Shinde, R., Vanschoren, J., Vogler, S., Goswami, S., Rao, Y., Santos, T., Oala, L. and Karamousadakis, M., 2024\. A Standardized Machine-readable Dataset Documentation Format for Responsible AI. *arXiv preprint arXiv:2407.16883*. + +## **Appendix A \- Installation** + +The "mlcroissant\[geo\]" is an optional /extra dependency package for mlcroissant that adds geospatial data processing capabilities. When you install "mlcroissant\[geo\]", you get additional functionality specifically designed for working with converters that convert your current metadata into geocroissant metadata format. + +``` +!pip install mlcroissant[geo] + +# Installed through `pip install -e .[geo]` -- while development +``` + +## **Appendix B: User Adoption Survey** + +This appendix summarizes responses from the GeoCroissant user adoption survey and highlights which dataset fields practitioners consider most important for spatial machine learning and GeoAI workflows. + +### **Rating scale** + +* Very important \= 5 +* Important \= 4 +* Neither important nor unimportant \= 3 +* Unimportant \= 2 +* Very unimportant \= 1 + +### **Summary of responses** + +Overall, most spatial machine learning dataset fields received an average rating of **“Important.”** No spatial or non-spatial fields were rated **“Very unimportant.”** Across both spatial and non-spatial metadata, **description** was consistently identified as the most important field. Respondents noted that the description provides critical context required to interpret and responsibly use a dataset, including information on provenance, background, assumptions, and limitations (Refer table below). + +Table: Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. + +| Rank | Top five most important ML fields | Top five most important Geospatial fields | +| ----- | ----- | ----- | +| 1 | Description | Description | +| 2 | License | Sensor (e.g., optical, thermal) | +| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | +| 4 | Name | Distribution (file representation/format) | +| 5 | URL | Model category (e.g., classification) | + +![][image1] +**Figure: Summary of mean importance ratings from the GeoCroissant user adoption survey.** + +Together, these figures report the mean importance (1–5, excluding NA) assigned by respondents to ML and geospatial metadata fields. ML respondents prioritized core reuse and access metadata—especially **license** and **distribution**, followed by **name** and **URL**—while geospatial respondents emphasized GeoAI-critical context, ranking **description**, **sensor**, and **annotation type** highest. Overall, the results indicate that users most value metadata that clarifies dataset usability, legal reuse, and the geospatial/labeling characteristics needed to reliably integrate datasets into spatial ML workflows. + +## **Appendix C \- Examples showing querying on GeoCroissant Dataset** + +*Query 1: Finding GeoCroissant dataset by querying via GeoSPARQL Geometry* + +``` +PREFIX geosparql: +PREFIX geocr: +PREFIX dct: + +SELECT ?dataset ?record ?wkt +WHERE { + ?dataset a geocr:Dataset ; + geocr:recordSet ?record . + + ?record geosparql:hasGeometry ?geom . + ?geom geosparql:asWKT ?wkt . + + FILTER(geof:sfWithin(?geom, "POLYGON((-120 30, -110 30, -110 40, -120 40, -120 30))"^^geosparql:wktLiteral)) +} +``` + +*Query 2: Discovering GeoCroissant Datasets by Exact Bounding Box Match* + + +``` +PREFIX geocr: + +SELECT ?dataset ?record ?bbox +WHERE { + ?dataset a geocr:Dataset ; + geocr:recordSet ?record . + ?record geocr:BoundingBox ?bbox . + FILTER(STR(?bbox) = "[-120.0, 30.0, -110.0, 40.0]") +} +``` + +[image1]: \ No newline at end of file diff --git a/docs/croissant.ttl b/docs/croissant.ttl index c0eabadf7..c84b1e9a7 100644 --- a/docs/croissant.ttl +++ b/docs/croissant.ttl @@ -319,3 +319,10 @@ croissant:BoundingBox a rdf:class ; rdfs:label "Label" ; rdfs:comment "A data type representing a bounding box." ; rdfs:subClassOf schema:Text . + +croissant:arrayShape a rdf:Property ; + rdfs:label "arrayShape" ; + rdfs:comment "Shape of the data tensor/array associated with a field (e.g., [height, width, bands] for imagery)." ; + schema:domainIncludes croissant:Field ; + schema:rangeIncludes schema:Text . + diff --git a/docs/croissant_geo.ttl b/docs/croissant_geo.ttl new file mode 100644 index 000000000..15cfa221f --- /dev/null +++ b/docs/croissant_geo.ttl @@ -0,0 +1,161 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix schema: . +@prefix cr: . +@prefix geocr: . + +##################################################################### +# GeoCroissant vocabulary terms +# Notes: +# - schema:domainIncludes / schema:rangeIncludes provide lightweight typing. +# - Includes only the GeoCroissant terms defined in the specification. +##################################################################### + +# ------------------------- +# GeoCroissant Classes +# ------------------------- + +geocr:BandConfiguration a rdfs:Class ; + rdfs:label "BandConfiguration" ; + rdfs:comment "Structured description of raster band organization and semantics (e.g., band count and ordered band names). Intended to be used as the value of geocr:bandConfiguration." ; + rdfs:subClassOf schema:StructuredValue . + +geocr:SpectralBand a rdfs:Class ; + rdfs:label "SpectralBand" ; + rdfs:comment "Structured per-band spectral metadata entry (e.g., center wavelength and bandwidth). Intended to be used as items within geocr:spectralBandMetadata." ; + rdfs:subClassOf schema:StructuredValue . + +geocr:MultiWavelengthConfiguration a rdfs:Class ; + rdfs:label "MultiWavelengthConfiguration" ; + rdfs:comment "Structured description of multi-wavelength channel configuration for Space Weather / heliophysics datasets (e.g., a list of wavelength channels). Intended to be used as the value of geocr:multiWavelengthConfiguration." ; + rdfs:subClassOf schema:StructuredValue . + +geocr:SolarInstrumentCharacteristics a rdfs:Class ; + rdfs:label "SolarInstrumentCharacteristics" ; + rdfs:comment "Structured description of solar/heliophysics instrument and observatory characteristics for Space Weather datasets (e.g., observatory/platform and instrument identifiers). Intended to be used as the value of geocr:solarInstrumentCharacteristics." ; + rdfs:subClassOf schema:StructuredValue . + +# ------------------------- +# Dataset / Field / RecordSet properties +# ------------------------- + +geocr:coordinateReferenceSystem a rdf:Property ; + rdfs:label "coordinateReferenceSystem" ; + rdfs:comment "Coordinate reference system (CRS) identifier (e.g., EPSG code) used to interpret spatial data in the dataset." ; + schema:domainIncludes schema:Dataset ; + schema:rangeIncludes schema:Text . + +geocr:spatialResolution a rdf:Property ; + rdfs:label "spatialResolution" ; + rdfs:comment "Nominal spatial resolution for the dataset or collection (e.g., '30m' or a QuantitativeValue with units). May be provided at dataset level or at record/collection level when resolution varies." ; + schema:domainIncludes schema:Dataset, cr:RecordSet ; + schema:rangeIncludes schema:Text, schema:QuantitativeValue . + +geocr:bandConfiguration a rdf:Property ; + rdfs:label "bandConfiguration" ; + rdfs:comment "Configuration describing raster band organization and semantics for a dataset or asset (e.g., band ordering and names)." ; + schema:domainIncludes schema:Dataset, cr:Field ; + schema:rangeIncludes geocr:BandConfiguration, schema:Text . + +geocr:spectralBandMetadata a rdf:Property ; + rdfs:label "spectralBandMetadata" ; + rdfs:comment "Per-band spectral metadata for EO imagery (e.g., center wavelength, bandwidth), represented as one or more geocr:SpectralBand entries." ; + schema:domainIncludes schema:Dataset, cr:Field ; + schema:rangeIncludes geocr:SpectralBand, schema:Text . + +geocr:recordEndpoint a rdf:Property ; + rdfs:label "recordEndpoint" ; + rdfs:comment "A service endpoint that provides programmatic access to the dataset's metadata records (e.g., listing, paging, and filtering records)." ; + schema:domainIncludes schema:Dataset ; + schema:rangeIncludes schema:URL, schema:Text . + +geocr:spatialIndex a rdf:Property ; + rdfs:label "spatialIndex" ; + rdfs:comment "Precomputed spatial index token(s) (e.g., DGGS cell ID or geohash-like key) to accelerate coarse spatial filtering and discovery at scale." ; + schema:domainIncludes schema:Dataset, cr:RecordSet ; + schema:rangeIncludes schema:Text . + +geocr:spatialBias a rdf:Property ; + rdfs:label "spatialBias" ; + rdfs:comment "Description of spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation." ; + schema:domainIncludes schema:Dataset ; + schema:rangeIncludes schema:Text . + +geocr:samplingStrategy a rdf:Property ; + rdfs:label "samplingStrategy" ; + rdfs:comment "Description of how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria) to support reproducibility and interpretation." ; + schema:domainIncludes schema:Dataset ; + schema:rangeIncludes schema:Text . + +geocr:temporalResolution a rdf:Property ; + rdfs:label "temporalResolution" ; + rdfs:comment "Temporal cadence of the dataset or collection (e.g., 1 month), typically expressed as a QuantitativeValue (value + unit), or as text. May be provided at dataset level or at record/collection level when cadence varies." ; + schema:domainIncludes schema:Dataset, cr:RecordSet ; + schema:rangeIncludes schema:QuantitativeValue, schema:Text . + +geocr:timeSeriesIndex a rdf:Property ; + rdfs:label "timeSeriesIndex" ; + rdfs:comment "Identifies the record-level field used to order/index observations in a time series (e.g., a timestamp field in a RecordSet)." ; + schema:domainIncludes cr:RecordSet ; + schema:rangeIncludes cr:Field, schema:Text . + +geocr:multiWavelengthConfiguration a rdf:Property ; + rdfs:label "multiWavelengthConfiguration" ; + rdfs:comment "Composite property to group multi-wavelength configuration information for Space Weather / heliophysics datasets; intended to map to SPASE constructs." ; + schema:domainIncludes schema:Dataset ; + schema:rangeIncludes geocr:MultiWavelengthConfiguration, schema:Text . + +geocr:solarInstrumentCharacteristics a rdf:Property ; + rdfs:label "solarInstrumentCharacteristics" ; + rdfs:comment "Composite property to group solar/heliophysics instrument characteristics for Space Weather datasets; intended to map to SPASE constructs." ; + schema:domainIncludes schema:Dataset ; + schema:rangeIncludes geocr:SolarInstrumentCharacteristics, schema:Text . + +# ------------------------- +# Properties of GeoCroissant Classes +# ------------------------- + +# geocr:BandConfiguration fields +geocr:totalBands a rdf:Property ; + rdfs:label "totalBands" ; + rdfs:comment "Total number of bands for an asset or dataset described by geocr:bandConfiguration." ; + schema:domainIncludes geocr:BandConfiguration ; + schema:rangeIncludes schema:Integer . + +geocr:bandNamesList a rdf:Property ; + rdfs:label "bandNamesList" ; + rdfs:comment "Ordered list of band names corresponding to the band stack described by geocr:bandConfiguration." ; + schema:domainIncludes geocr:BandConfiguration ; + schema:rangeIncludes schema:Text . + +# geocr:SpectralBand fields +geocr:centerWavelength a rdf:Property ; + rdfs:label "centerWavelength" ; + rdfs:comment "Center wavelength for a geocr:SpectralBand entry (typically in geocr:spectralBandMetadata), expressed as a QuantitativeValue." ; + schema:domainIncludes geocr:SpectralBand ; + schema:rangeIncludes schema:QuantitativeValue . + +geocr:bandwidth a rdf:Property ; + rdfs:label "bandwidth" ; + rdfs:comment "Spectral bandwidth for a geocr:SpectralBand entry (typically in geocr:spectralBandMetadata), expressed as a QuantitativeValue." ; + schema:domainIncludes geocr:SpectralBand ; + schema:rangeIncludes schema:QuantitativeValue . + +# Space Weather nested fields +geocr:channelList a rdf:Property ; + rdfs:label "channelList" ; + rdfs:comment "List of wavelength channels (e.g., 171Å, 193Å) used within geocr:MultiWavelengthConfiguration." ; + schema:domainIncludes geocr:MultiWavelengthConfiguration ; + schema:rangeIncludes schema:Text . + +geocr:observatory a rdf:Property ; + rdfs:label "observatory" ; + rdfs:comment "Observatory/platform identifier used within geocr:SolarInstrumentCharacteristics (for later mapping to SPASE)." ; + schema:domainIncludes geocr:SolarInstrumentCharacteristics ; + schema:rangeIncludes schema:Text . + +geocr:instrument a rdf:Property ; + rdfs:label "instrument" ; + rdfs:comment "Instrument identifier used within geocr:SolarInstrumentCharacteristics (for later mapping to SPASE)." ; + schema:domainIncludes geocr:SolarInstrumentCharacteristics ; + schema:rangeIncludes schema:Text . From 9d3e99f1c74e687612177a6c474662e011093962 Mon Sep 17 00:00:00 2001 From: Rajat Shinde Date: Tue, 20 Jan 2026 01:21:27 -0600 Subject: [PATCH 2/7] minor formatting update --- docs/croissant-geo-spec.md | 642 ++++++++++++++++++++----------------- 1 file changed, 348 insertions(+), 294 deletions(-) diff --git a/docs/croissant-geo-spec.md b/docs/croissant-geo-spec.md index 1aff122cc..76044ba9e 100644 --- a/docs/croissant-geo-spec.md +++ b/docs/croissant-geo-spec.md @@ -6,55 +6,54 @@ Status: Release Candidate Published: 01/20/2025 -[http://mlcommons.org/croissant/geo/1.0](http://mlcommons.org/croissant/geo/1.0) + Authors: -* Rajat Shinde \- NASA Office of Data Science and Informatics \- University of Alabama in Huntsville, US -* Manil Maskey \- NASA, US -* Ag Stephens \- STFC Centre for Environmental Data Analysis (UK) -* Harsh Shinde \- Individual Researcher -* Joseph Edgerton \- UVA -* Tejasri N \- IIT Hyderabad, India -* Douglas Fils \- San Diego SuperComputing Center, US -* Edenna Chen \- Massachusetts Institute of Technology, US -* Claus Weiland \- Senckenberg \- Leibniz Institution for Biodiversity and Earth System Research -* Pedram Ghamisi \- Helmholtz-Zentrum Dresden-Rossendorf (HZDR), Germany | Lancaster University, UK -* Gerald Fenoy \- GeoLabs, France -* Yuhan Douglas Rao \- National Oceanic and Atmospheric Administration -* Omar Benjelloun \- Google -* Elena Simperl \- King’s College London & Open Data Institute, UK - +- Rajat Shinde - NASA Office of Data Science and Informatics - University of Alabama in Huntsville, US\ +- Manil Maskey - NASA, US\ +- Ag Stephens - STFC Centre for Environmental Data Analysis (UK)\ +- Harsh Shinde - Individual Researcher\ +- Joseph Edgerton - UVA\ +- Tejasri N - IIT Hyderabad, India\ +- Douglas Fils - San Diego SuperComputing Center, US\ +- Edenna Chen - Massachusetts Institute of Technology, US\ +- Claus Weiland - Senckenberg - Leibniz Institution for Biodiversity and Earth System Research\ +- Pedram Ghamisi - Helmholtz-Zentrum Dresden-Rossendorf (HZDR), Germany \| Lancaster University, UK\ +- Gerald Fenoy - GeoLabs, France\ +- Yuhan Douglas Rao - National Oceanic and Atmospheric Administration\ +- Omar Benjelloun - Google\ +- Elena Simperl - King’s College London & Open Data Institute, UK Contributors *(in alphabetical order)*: -* Anna Boser \- UCSB, US -* Armin Mehrabian -* Ben Lewis \- Harvard University -* Brianna R Pagan \- Development Seed -* Christine Kirkpatrick \- San Diego Super Computing Center, US -* Ed Parsons \- Google -* Gilles Quentin Hacheme \- Microsoft AI /GeoAI Africa -* Gobe Hobona \- Open Geospatial Consortium -* Harsha Vardhan Madiraju \- Open Geospatial Consortium -* Iksha Gurung \- NASA Office of Data Science and Informatics \- University of Alabama in Huntsville, US -* Jim Antonoissee \- National Geospatial-Intelligence Agency, US -* Jon Marokhovsky \- Clark University -* Konstantin Klemmer -* Luis Oala -* Samapriya Roy \- SpatialBytes and Desert Research Institute, US -* Scott Simmons \- Open Geospatial Consortium -* Sidharth Subramaniam \- Terrafloww Labs, India -* Simon Ilyushchenko \- Google -* Siri Jodha Khalsa \- IEEE Geosciences and Remote Sensing Society Standards Committee -* Slava Tykhonov \- CODATA -* Ying-Jung Chen +- Anna Boser - UCSB, US\ +- Armin Mehrabian\ +- Ben Lewis - Harvard University\ +- Brianna R Pagan - Development Seed\ +- Christine Kirkpatrick - San Diego Super Computing Center, US\ +- Ed Parsons - Google\ +- Gilles Quentin Hacheme - Microsoft AI /GeoAI Africa\ +- Gobe Hobona - Open Geospatial Consortium\ +- Harsha Vardhan Madiraju - Open Geospatial Consortium\ +- Iksha Gurung - NASA Office of Data Science and Informatics - University of Alabama in Huntsville, US\ +- Jim Antonoissee - National Geospatial-Intelligence Agency, US\ +- Jon Marokhovsky - Clark University\ +- Konstantin Klemmer\ +- Luis Oala\ +- Samapriya Roy - SpatialBytes and Desert Research Institute, US\ +- Scott Simmons - Open Geospatial Consortium\ +- Sidharth Subramaniam - Terrafloww Labs, India\ +- Simon Ilyushchenko - Google\ +- Siri Jodha Khalsa - IEEE Geosciences and Remote Sensing Society Standards Committee\ +- Slava Tykhonov - CODATA\ +- Ying-Jung Chen Acknowledgements -* MLCommons GeoCroissant Working Group -* MLCommons Croissant Working Group -* Open Geospatial Consortium (OGC) GeoAI Domain Working Group +- MLCommons GeoCroissant Working Group\ +- MLCommons Croissant Working Group\ +- Open Geospatial Consortium (OGC) GeoAI Domain Working Group # **Introduction & overview** @@ -68,25 +67,29 @@ Efforts to standardize metadata documentation have led to the development of fra Similar to non-geospatial aspects of the Croissant metadata standard, the GeoCroissant extension builds upon the schema.org/Dataset vocabulary. -The GeoCroissant vocabulary is defined in its own namespace, identified by the IRI: - **http://mlcommons.org/croissant/geo/** +The GeoCroissant vocabulary is defined in its own namespace, identified by the IRI:\ +**http://mlcommons.org/croissant/geo/** This namespace IRI is generally abbreviated using the prefix: **geocr** In addition, this vocabulary relies on the following namespaces: -| Prefix | IRI | Description | -| ----- | ----- | ----- | -| sc | [http://schema.org/](http://schema.org/) | The schema.org namespace | -| cr | [http://mlcommons.org/croissant/](http://mlcommons.org/croissant/) | MLCommons Croissant base namespace | -| geocr | [http://mlcommons.org/croissant/geo/](http://mlcommons.org/croissant/geo/) | GeoCroissant extension namespace | ++----------------------+---------------------------------------+------------------------------------+ +| Prefix | IRI | Description | ++======================+=======================================+====================================+ +| sc | | The schema.org namespace | ++----------------------+---------------------------------------+------------------------------------+ +| cr | | MLCommons Croissant base namespace | ++----------------------+---------------------------------------+------------------------------------+ +| geocr | | GeoCroissant extension namespace | ++----------------------+---------------------------------------+------------------------------------+ -The GeoCroissant specification is versioned, and the version is included in the URI of this specification: - **http://mlcommons.org/croissant/geo/1.0** +The GeoCroissant specification is versioned, and the version is included in the URI of this specification:\ +**http://mlcommons.org/croissant/geo/1.0** Croissant datasets that conform to the GeoCroissant specification must declare both their base Croissant conformance (e.g., Croissant 1.0 or 1.1) and, in addition, GeoCroissant conformance at the dataset level by including the following property: -```json +``` json "dct:conformsTo": [ "http://mlcommons.org/croissant/1.1", "http://mlcommons.org/croissant/geo/1.0" @@ -97,34 +100,33 @@ Note that while the GeoCroissant specification is versioned, the geocr namespace ***Note: Refer to Appendix A for instructions on installing GeoCroissant.*** -## **Why metadata is important\!** +## **Why metadata is important!** Metadata plays a critical role in making data meaningful and actionable. Without it, datasets can be challenging to interpret, leading to misunderstandings or underutilization. Metadata provides context, ensuring that users understand the origin, purpose, and structure of the data. It also enables efficient search and discovery, saving time and resources. By standardizing metadata, organizations can ensure consistency, improve data sharing, and foster collaboration across different platforms and systems. ## **Need for metadata in ML ready datasets & How Croissant helps** - Datasets are the foundation of Machine Learning (ML). However, the lack of standardization in how ML datasets are described and structured has created significant challenges for researchers and practitioners. Without clear and consistent descriptions, exploring, understanding, and utilizing datasets effectively becomes difficult. This has led to a situation where only a tiny fraction of popular datasets are widely used, while many others remain underutilized. To address these challenges, the Croissant metadata format has been introduced. Croissant simplifies using data in ML models by providing a standardized vocabulary based on [schema.org](http://schema.org) for describing dataset attributes. This standardization streamlines the way data is loaded across popular ML frameworks like PyTorch, TensorFlow, and JAX, enabling seamless interchange of datasets between different frameworks tackles key issues such as discoverability, portability, reproducibility, and responsible AI (RAI) practices via the [Croissant RAI extension](https://mlcommons.org/croissant/RAI/1.0). Croissant simplifies working with datasets in machine learning by providing detailed metadata that allows ML platforms to load datasets seamlessly. Users can integrate Croissant datasets into model training or evaluation with just a few lines of code. It is also easy to incorporate Croissant into tools commonly used by ML practitioners, such as those for data preprocessing, analysis, or labeling. Beyond enabling cross-platform compatibility, Croissant enhances dataset discovery. When publishers create Croissant metadata and set up compatible repositories, search engines can help users find and use datasets from various sources effortlessly. Additionally, publishers can create or modify Croissant descriptions using a visual editor or a Python library, making the process user-friendly. -# **Geospatial Artificial Intelligence \- GeoAI** +# **Geospatial Artificial Intelligence - GeoAI** Geospatial Artificial Intelligence (GeoAI) refers to the application of AI techniques to geospatial data for advanced, location-based analysis, mapping, and decision-making. GeoAI leverages diverse data streams from satellites, airborne platforms, in-situ sensors, and ground observations, resulting in rich, high-volume datasets with complex spatio-temporal structures. -As the volume and resolution of Earth data continue to grow, GeoAI enables new frontiers in applications such as climate modeling, disaster response, urban planning, and crop yield forecasting. The credibility and performance of AI models in these domains depend heavily on well-prepared, context-aware datasets. +As the volume and resolution of Earth data continue to grow, GeoAI enables new frontiers in applications such as climate modeling, disaster response, urban planning, and crop yield forecasting. The credibility and performance of AI models in these domains depend heavily on well-prepared, context-aware datasets. Several considerations are critical in the development of AI-ready geospatial datasets: -1. **Importance of Location:** Accurate spatial information is fundamental, as geolocation errors or coarse annotations can directly compromise model predictions and reduce reliability in downstream tasks. -2. **Sampling Strategy:** With petabyte-scale datasets, careful sampling is essential to avoid class imbalance and ensure fair representation of diverse regions and phenomena. -3. **Data Lifecycle:** Many GeoAI applications are time-sensitive; stale or temporally mismatched data can reduce model relevance and generalizability. -4. **Cloud-Based Access:** Centralized, cloud-optimized storage and access enable efficient training, evaluation, and validation of large-scale datasets, and support collaborative workflows and scalable computation. -5. **End-to-End AI Workflow Integration:** Metadata-rich, modular formats like GeoCroissant allow seamless dataset ingestion into modern AI workflows, improving scalability and automation across the model lifecycle. +1. **Importance of Location:** Accurate spatial information is fundamental, as geolocation errors or coarse annotations can directly compromise model predictions and reduce reliability in downstream tasks.\ +2. **Sampling Strategy:** With petabyte-scale datasets, careful sampling is essential to avoid class imbalance and ensure fair representation of diverse regions and phenomena.\ +3. **Data Lifecycle:** Many GeoAI applications are time-sensitive; stale or temporally mismatched data can reduce model relevance and generalizability.\ +4. **Cloud-Based Access:** Centralized, cloud-optimized storage and access enable efficient training, evaluation, and validation of large-scale datasets, and support collaborative workflows and scalable computation.\ +5. **End-to-End AI Workflow Integration:** Metadata-rich, modular formats like GeoCroissant allow seamless dataset ingestion into modern AI workflows, improving scalability and automation across the model lifecycle. While this specification emphasizes structural and semantic consistency, it also aligns with emerging practices in **Responsible AI** by promoting transparency, reproducibility, and ethical use of geospatial data in AI applications. -## **Croissant and Geo-AI datasets** +## **Croissant and Geo-AI datasets** Modern Earth observation systems, such as NASA’s satellite fleet, generate massive volumes of high-resolution, multi-modal geospatial data daily. Analyzing this data manually is infeasible and AI and machine learning are essential for extracting insights at scale. However, turning raw geospatial data into AI-ready form requires rich, structured metadata. @@ -132,13 +134,19 @@ While the Croissant format introduces a strong foundation for ML dataset metadat The table below summarizes representative geospatial dataset types, the complexities common to Earth observation (EO) data, and the areas where Croissant core does not prescribe geospatial conventions (e.g., CRS, resolution, modality, and band semantics). GeoCroissant addresses these gaps by extending Croissant with standardized, interoperable metadata constructs that improve discoverability, interoperability, and ML-readiness for scalable and responsible GeoAI workflows. -| Types of Geospatial Datasets | Issues in GeoAI datasets as compared to “generic” datasets | How does GeoCroissant (and Croissant) address these issues? | -| ----- | ----- | ----- | -| EO imagery (multi-band; optical/SAR) | Band semantics and modality-specific acquisition parameters | Standardize sensor/band descriptors and ML task metadata (Interoperability, ML workflow) | -| Spatiotemporal datasets (time series, in-situ, simulations) | Time indexing \+ spatiotemporal coverage consistency | Consistent temporal modeling and time-series support (Time-series support, Discovery) | -| Complex geo formats (NetCDF/HDF5/Zarr) | Nested variables, chunking, multiple assets per logical sample | Clear-mapping from raw containers to AI-ready datasets | -| Mixed geometry data (vector, raster, point clouds) | Heterogeneous geometry types and spatial reference handling | Uniform spatial semantics and discovery/query support | -| Human-labeled / crowdsourced GeoAI datasets | Sampling choices and spatial representativeness affect outcomes | Explicit provenance and spatial bias/sampling documentation based on Croissant RAI | ++-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ +| Types of Geospatial Datasets | Issues in GeoAI datasets as compared to “generic” datasets | How does GeoCroissant (and Croissant) address these issues? | ++=============================================================+=================================================================+==========================================================================================+ +| EO imagery (multi-band; optical/SAR) | Band semantics and modality-specific acquisition parameters | Standardize sensor/band descriptors and ML task metadata (Interoperability, ML workflow) | ++-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ +| Spatiotemporal datasets (time series, in-situ, simulations) | Time indexing + spatiotemporal coverage consistency | Consistent temporal modeling and time-series support (Time-series support, Discovery) | ++-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ +| Complex geo formats (NetCDF/HDF5/Zarr) | Nested variables, chunking, multiple assets per logical sample | Clear-mapping from raw containers to AI-ready datasets | ++-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ +| Mixed geometry data (vector, raster, point clouds) | Heterogeneous geometry types and spatial reference handling | Uniform spatial semantics and discovery/query support | ++-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ +| Human-labeled / crowdsourced GeoAI datasets | Sampling choices and spatial representativeness affect outcomes | Explicit provenance and spatial bias/sampling documentation based on Croissant RAI | ++-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ ## **GeoCroissant** @@ -148,9 +156,9 @@ Below is an illustrative example of GeoCroissant metadata for a representative G ### **Sample GeoCroissant Metadata** -Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging Face: [https://huggingface.co/datasets/ibm-nasa-geospatial/hls\_burn\_scars](https://huggingface.co/datasets/ibm-nasa-geospatial/hls_burn_scars)). +Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging Face: ). -``` +``` { "@context": { "@language": "en", @@ -304,34 +312,46 @@ Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging # **GeoCroissant Properties** -The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). - -| GeoCroissant Use Case | GeoCroissant Properties | External Vocabulary Properties | Croissant Core Properties | Schema.org Properties | -| ----- | ----- | ----- | ----- | ----- | -| **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox proj:epsg, stac:gsd | | sc: GeospatialGeometry, sc:spatialCoverage | -| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType, spase:Observatory, spase:Iinstrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | -| **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | -| **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | -| **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | -| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI\_EOTask (OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | -| **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | -| **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | -| **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | -| **Use case 9: Caching AI-ready transformations of large geospatial data** | \- | | cr:transform, cr:extract, cr:FileSet / cr:FileObject | sc:encodingFormat, sc:contentUrl | +The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). + ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| GeoCroissant Use Case | GeoCroissant Properties | External Vocabulary Properties | Croissant Core Properties | Schema.org Properties | ++===========================================================================+========================================================================================================================================+=================================================================================+======================================================+===========================================================================+ +| **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg, \ | | sc: GeospatialGeometry, sc:spatialCoverage | +| | | stac:gsd | | | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType, spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI_EOTask (OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| **Use case 9: Caching AI-ready transformations of large geospatial data** | \- | | cr:transform, cr:extract, cr:FileSet / cr:FileObject | sc:encodingFormat, sc:contentUrl | ++---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ The concepts which cannot be cleanly expressed using existing, widely adopted vocabularies are introduced as GeoCroissant (geocr:) properties. Below, we provide concise definitions and illustrative examples for each GeoCroissant property introduced in this specification grouped by specific geospatial metadata. ### **Spatial Metadata** -**`geocr:coordinateReferenceSystem`** -Coordinate Reference System (CRS)/projection used to interpret spatial data. Applicable to datasets requiring explicit spatial referencing and interoperability across geospatial tools and standards. -Expected data type: `sc:Text` -Domain: `sc:Dataset` -Range: `sc:Text` -Cardinality: ONE -Example: +**`geocr:coordinateReferenceSystem`**\ +Coordinate Reference System (CRS)/projection used to interpret spatial data. Applicable to datasets requiring explicit spatial referencing and interoperability across geospatial tools and standards.\ +Expected data type: `sc:Text`\ +Domain: `sc:Dataset`\ +Range: `sc:Text`\ +Cardinality: ONE\ +Example: -``` +``` { "@type": "Dataset", "name": "Example dataset", @@ -339,16 +359,16 @@ Example: } ``` -**`geocr:spatialResolution`** -Nominal spatial resolution (ground sampling distance) represented by one pixel on the ground. Applicable when consumers need consistent resolution metadata for discovery, comparison, and ML-readiness; may be defined at dataset level or per record when resolution varies. -Expected data type: `sc:Text` or `sc:QuantitativeValue` -Domain: `sc:Dataset`, `cr:RecordSet` (or data-level) -Range: `sc:Text`, `sc:QuantitativeValue` +**`geocr:spatialResolution`**\ +Nominal spatial resolution (ground sampling distance) represented by one pixel on the ground. Applicable when consumers need consistent resolution metadata for discovery, comparison, and ML-readiness; may be defined at dataset level or per record when resolution varies.\ +Expected data type: `sc:Text` or `sc:QuantitativeValue`\ +Domain: `sc:Dataset`, `cr:RecordSet` (or data-level)\ +Range: `sc:Text`, `sc:QuantitativeValue`\ Cardinality: ONE -Example: Dataset-level +Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset (dataset-level resolution)", @@ -358,7 +378,7 @@ Example: Dataset-level Example: Data-level (spatial resolution varies per record, for eg. [Harmonized Landsat and Sentinel-2 Product](https://www.earthdata.nasa.gov/data/projects/hls/spectral-bands)) -``` +``` { "@type": "Dataset", "name": "Example dataset (data-level resolution)", @@ -384,16 +404,16 @@ Example: Data-level (spatial resolution varies per record, for eg. [Harmonized L } ``` -**`geocr:spatialIndex`** -Precomputed spatial index token(s) to support scalable, coarse spatial filtering (e.g., DGGS/H3/geohash-like identifiers). Applicable for large catalogs where indexing enables faster spatial discovery prior to exact geometry operations. -Expected data type: `sc:Text` -Domain: `sc:Dataset`, `cr:RecordSet` (or record-level) -Range: `sc:Text` +**`geocr:spatialIndex`**\ +Precomputed spatial index token(s) to support scalable, coarse spatial filtering (e.g., DGGS/H3/geohash-like identifiers). Applicable for large catalogs where indexing enables faster spatial discovery prior to exact geometry operations.\ +Expected data type: `sc:Text`\ +Domain: `sc:Dataset`, `cr:RecordSet` (or record-level)\ +Range: `sc:Text`\ Cardinality: MANY Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset (dataset-level spatial index)", @@ -403,7 +423,7 @@ Example: Dataset-level Example: Record-level -``` +``` { "@type": "Dataset", "name": "Example dataset (data-level spatial index)", @@ -431,16 +451,16 @@ Example: Record-level ### **Spectral and Band Semantics Metadata** -**`geocr:bandConfiguration`** -Band organization and semantics (e.g., band count, ordering, and names) for raster datasets. Applicable for multi-band EO datasets to ensure consistent interpretation of channels across workflows and standards. -Expected data type: `geocr:BandConfiguration` -Domain: `sc:Dataset`, `cr:Field` -Range: `geocr:BandConfiguration` +**`geocr:bandConfiguration`**\ +Band organization and semantics (e.g., band count, ordering, and names) for raster datasets. Applicable for multi-band EO datasets to ensure consistent interpretation of channels across workflows and standards.\ +Expected data type: `geocr:BandConfiguration`\ +Domain: `sc:Dataset`, `cr:Field`\ +Range: `geocr:BandConfiguration`\ Cardinality: ONE Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset (dataset-level band configuration)", @@ -454,7 +474,7 @@ Example: Dataset-level Example: Data-level -``` +``` { "@type": "Dataset", "name": "Example dataset (field-level band configuration)", @@ -492,34 +512,34 @@ Example: Data-level } ``` -**`geocr:totalBands`** -Number of bands in the raster asset. -Expected data type: `sc:Integer` -Domain: `geocr:BandConfiguration` -Range: `sc:Integer` +**`geocr:totalBands`**\ +Number of bands in the raster asset.\ +Expected data type: `sc:Integer`\ +Domain: `geocr:BandConfiguration`\ +Range: `sc:Integer`\ Cardinality: ONE Example: `"geocr:totalBands": 6` -**`geocr:bandNameList`** -Ordered list of band names corresponding to the raster band stack. -Expected data type: `sc:Text` -Domain: `geocr:BandConfiguration` -Range: `sc:Text` +**`geocr:bandNameList`**\ +Ordered list of band names corresponding to the raster band stack.\ +Expected data type: `sc:Text`\ +Domain: `geocr:BandConfiguration`\ +Range: `sc:Text`\ Cardinality: MANY Example: `"geocr:bandNameList": ["Blue", "Green", "Red", "NIR", "SW1", "SW2"]` -**`geocr:spectralBandMetadata`** -Per-band spectral descriptors (e.g., center wavelength, bandwidth), enabling interoperable description of EO spectral characteristics. Applicable when downstream users/models require band physics/semantics beyond names alone. -Expected data type: `geocr:SpectralBand` -Domain: `sc:Dataset`, `cr:Field` -Range: `geocr:SpectralBand` +**`geocr:spectralBandMetadata`**\ +Per-band spectral descriptors (e.g., center wavelength, bandwidth), enabling interoperable description of EO spectral characteristics. Applicable when downstream users/models require band physics/semantics beyond names alone.\ +Expected data type: `geocr:SpectralBand`\ +Domain: `sc:Dataset`, `cr:Field`\ +Range: `geocr:SpectralBand`\ Cardinality: MANY Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset (dataset-level spectral band metadata)", @@ -541,7 +561,7 @@ Example: Dataset-level Example: Data-level -``` +``` { "@type": "Dataset", "name": "Example dataset (field-level spectral band metadata)", @@ -576,39 +596,39 @@ Example: Data-level } ``` -**`geocr:centerWavelength`** -Center wavelength for a spectral band entry. -Expected data type: `sc:QuantitativeValue` -Domain: `geocr:SpectralBand` -Range: `sc:QuantitativeValue` +**`geocr:centerWavelength`**\ +Center wavelength for a spectral band entry.\ +Expected data type: `sc:QuantitativeValue`\ +Domain: `geocr:SpectralBand`\ +Range: `sc:QuantitativeValue`\ Cardinality: ONE Example: `"geocr:centerWavelength": { "@type": "QuantitativeValue", "value": 490, "unitText": "nm" }` -**`geocr:bandwidth`** -Spectral bandwidth (e.g., full-width at half-maximum) for a spectral band entry. -Expected data type: `sc:QuantitativeValue` -Domain: `geocr:SpectralBand` -Range: `sc:QuantitativeValue` +**`geocr:bandwidth`**\ +Spectral bandwidth (e.g., full-width at half-maximum) for a spectral band entry.\ +Expected data type: `sc:QuantitativeValue`\ +Domain: `geocr:SpectralBand`\ +Range: `sc:QuantitativeValue`\ Cardinality: ZERO or ONE Example: `"geocr:bandwidth": { "@type": "QuantitativeValue", "value": 98, "unitText": "nm" }` ### **Programmatic Metadata Access** -**`geocr:recordEndpoint`** +**`geocr:recordEndpoint`**\ A URL that points to a service where the dataset’s metadata records can be queried and retrieved programmatically. This is useful when GeoCroissant metadata is maintained or served dynamically (e.g., a catalog or registry) and clients need to discover and access record-level metadata at scale. In practice, a user can start from the GeoCroissant JSON-LD, follow `geocr:recordEndpoint`, and then use that endpoint to list records, page through results, and apply supported filters (such as spatial, temporal, or keyword constraints) to obtain the specific records relevant to their workflow. For example, users can retrieve all records within a region by appending the dataset’s bounding box values as a query parameter to the `geocr:recordEndpoint`, e.g., `.../api/records?bbox=-125,24,-66,49`. Similarly, records within a temporal window can be requested by passing the dataset’s temporal range, e.g., `.../api/records?datetime=2018-01-01/2021-12-31`. -Expected data type: `sc:Text`, `sc:URL` -Domain: `sc:Dataset` -Range: `sc:Text`, `sc:URL` +Expected data type: `sc:Text`, `sc:URL`\ +Domain: `sc:Dataset`\ +Range: `sc:Text`, `sc:URL`\ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset with an API records endpoint", @@ -618,16 +638,16 @@ Example: Dataset-level ### **Responsible GeoAI** -**`geocr:spatialBias`** -Spatial representativeness limitations that may affect model generalization and evaluation (e.g., geographic concentration, under-sampled regions/biomes). Applicable for responsible reporting and risk-aware model use. -Expected data type: `sc:Text` -Domain: `sc:Dataset` -Range: `sc:Text` +**`geocr:spatialBias`**\ +Spatial representativeness limitations that may affect model generalization and evaluation (e.g., geographic concentration, under-sampled regions/biomes). Applicable for responsible reporting and risk-aware model use.\ +Expected data type: `sc:Text`\ +Domain: `sc:Dataset`\ +Range: `sc:Text`\ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset (spatial bias)", @@ -635,38 +655,38 @@ Example: Dataset-level } ``` -**`geocr:samplingStrategy`** -Description of how samples were selected or constructed (e.g., windowing/chipping strategy, filtering criteria), improving transparency and reproducibility. Applicable for documenting dataset construction choices that influence downstream performance. -Expected data type: `sc:Text` -Domain: `sc:Dataset` -Range: `sc:Text` +**`geocr:samplingStrategy`**\ +Description of how samples were selected or constructed (e.g., windowing/chipping strategy, filtering criteria), improving transparency and reproducibility. Applicable for documenting dataset construction choices that influence downstream performance.\ +Expected data type: `sc:Text`\ +Domain: `sc:Dataset`\ +Range: `sc:Text`\ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset (sampling strategy)", "geocr:samplingStrategy": "512×512 chips centered on burn polygons; cloudy scenes removed." } ``` ### **Temporal Metadata** -**`geocr:temporalResolution`** -Temporal cadence of the collection (e.g., 1 month), enabling consistent time-series interpretation, alignment, and sampling. Applicable to time-series EO and spatiotemporal datasets; can be dataset-level or record-level when cadence varies. -Expected data type: `sc:Text` or `sc:QuantitativeValue` -Domain: `sc:Dataset`, `cr:RecordSet` (or record-level) -Range: `sc:Text`, `sc:QuantitativeValue` -Cardinality: ZERO or ONE +**`geocr:temporalResolution`**\ +Temporal cadence of the collection (e.g., 1 month), enabling consistent time-series interpretation, alignment, and sampling. Applicable to time-series EO and spatiotemporal datasets; can be dataset-level or record-level when cadence varies.\ +Expected data type: `sc:Text` or `sc:QuantitativeValue`\ +Domain: `sc:Dataset`, `cr:RecordSet` (or record-level)\ +Range: `sc:Text`, `sc:QuantitativeValue`\ +Cardinality: ZERO or ONE\ Example: `"geocr:temporalResolution": { "@type":"QuantitativeValue","value":1,"unitText":"month" }` Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset (dataset-level temporal resolution)", "geocr:temporalResolution": { "@type": "QuantitativeValue", "value": 1, "unitText": "month" } } ``` Example: Data-level -``` +``` { "@type": "Dataset", "name": "Example dataset (record-level temporal resolution)", @@ -692,16 +712,16 @@ Example: Data-level } ``` -**`geocr:timeSeriesIndex`** -Identifies the record-level field used to order/index the time series (e.g., a timestamp field), enabling deterministic sorting and slicing of temporal sequences. Applicable to RecordSets representing ordered temporal observations. -Expected data type: `sc:Text` -Domain: `cr:RecordSet` -Range: `sc:Text` +**`geocr:timeSeriesIndex`**\ +Identifies the record-level field used to order/index the time series (e.g., a timestamp field), enabling deterministic sorting and slicing of temporal sequences. Applicable to RecordSets representing ordered temporal observations.\ +Expected data type: `sc:Text`\ +Domain: `cr:RecordSet`\ +Range: `sc:Text`\ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example dataset", @@ -733,16 +753,16 @@ Example: Dataset-level ### **Space Weather Metadata** -**`geocr:multiWavelengthConfiguration`** -Composite wrapper for multi-wavelength configuration to simplify authoring and later mapping to SPASE constructs. Applicable to Space Weather/heliophysics datasets with multiple wavelength channels. -Expected data type: `geocr:MultiWavelengthConfiguration` -Domain: `sc:Dataset` -Range: `geocr:MultiWavelengthConfiguration` +**`geocr:multiWavelengthConfiguration`**\ +Composite wrapper for multi-wavelength configuration to simplify authoring and later mapping to SPASE constructs. Applicable to Space Weather/heliophysics datasets with multiple wavelength channels.\ +Expected data type: `geocr:MultiWavelengthConfiguration`\ +Domain: `sc:Dataset`\ +Range: `geocr:MultiWavelengthConfiguration`\ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example Space Weather dataset (multi-wavelength configuration)", @@ -753,16 +773,16 @@ Example: Dataset-level } ``` -**`geocr:solarInstrumentCharacteristics`** -Composite wrapper for solar/heliophysics instrument characterization to simplify authoring and later mapping to SPASE constructs. Applicable to Space Weather datasets requiring instrument-specific descriptors. -Expected data type: `geocr:SolarInstrumentCharacteristics` -Domain: `sc:Dataset` -Range: `geocr:SolarInstrumentCharacteristics` -Cardinality: ZERO or ONE - +**`geocr:solarInstrumentCharacteristics`**\ +Composite wrapper for solar/heliophysics instrument characterization to simplify authoring and later mapping to SPASE constructs. Applicable to Space Weather datasets requiring instrument-specific descriptors.\ +Expected data type: `geocr:SolarInstrumentCharacteristics`\ +Domain: `sc:Dataset`\ +Range: `geocr:SolarInstrumentCharacteristics`\ +Cardinality: ZERO or ONE + Example: Dataset-level -``` +``` { "@type": "Dataset", "name": "Example Space Weather dataset (solar instrument characteristics)", @@ -774,33 +794,33 @@ Example: Dataset-level } ``` -**`geocr:observatory`** -Name or identifier of the observatory/platform associated with a solar/heliophysics measurement. -Expected data type: `sc:Text` -Domain: `geocr:SolarInstrumentCharacteristics` -Range: `sc:Text` -Cardinality: ZERO or ONE +**`geocr:observatory`**\ +Name or identifier of the observatory/platform associated with a solar/heliophysics measurement.\ +Expected data type: `sc:Text`\ +Domain: `geocr:SolarInstrumentCharacteristics`\ +Range: `sc:Text`\ +Cardinality: ZERO or ONE\ Example: `"geocr:observatory": "SDO"` -**`geocr:instrument`** -Name or identifier of the instrument producing the measurement. -Expected data type: `sc:Text` -Domain: `geocr:SolarInstrumentCharacteristics` -Range: `sc:Text` -Cardinality: ZERO or ONE +**`geocr:instrument`**\ +Name or identifier of the instrument producing the measurement.\ +Expected data type: `sc:Text`\ +Domain: `geocr:SolarInstrumentCharacteristics`\ +Range: `sc:Text`\ +Cardinality: ZERO or ONE\ Example: `"geocr:instrument": "AIA"` -**`geocr:channelList`** -Composite wrapper to capture the wavelength channels used in a Space Weather/heliophysics dataset, to support mapping to SPASE constructs. -Expected data type: `sc:Text` -Domain: `geocr:MultiWavelengthConfiguration` -Range: `sc:Text` -Cardinality: ZERO or ONE +**`geocr:channelList`**\ +Composite wrapper to capture the wavelength channels used in a Space Weather/heliophysics dataset, to support mapping to SPASE constructs.\ +Expected data type: `sc:Text`\ +Domain: `geocr:MultiWavelengthConfiguration`\ +Range: `sc:Text`\ +Cardinality: ZERO or ONE\ Example: `"geocr:channelList": ["171Å", "193Å"]` # **Use cases** -This section provides an overview of the various use cases that would be served by the vocabulary. Generally speaking, we distinguish between metadata attributes at dataset level, akin to existing data cards and similar formats, and at record level (e.g. extracting information from the lexical and semantic content of records in a dataset using them as record-level annotations), which are needed to respond to use cases around fairness or safety that require a more granular view of the dataset life cycle. We consider records to be the atomic units of the dataset, e.g. sentence, conversations, images, videos, etc. Ultimately, these record-level annotations will also be aggregated at a dataset-level metadata indicating descriptions such as, e.g. coverage of concepts, topics and level of adversariality for safety, and extracting insights for context-specific bias present in the dataset. +This section provides an overview of the various use cases that would be served by the vocabulary. Generally speaking, we distinguish between metadata attributes at dataset level, akin to existing data cards and similar formats, and at record level (e.g. extracting information from the lexical and semantic content of records in a dataset using them as record-level annotations), which are needed to respond to use cases around fairness or safety that require a more granular view of the dataset life cycle. We consider records to be the atomic units of the dataset, e.g. sentence, conversations, images, videos, etc. Ultimately, these record-level annotations will also be aggregated at a dataset-level metadata indicating descriptions such as, e.g. coverage of concepts, topics and level of adversariality for safety, and extracting insights for context-specific bias present in the dataset. ## **Use case 1: Space Weather Datasets** @@ -812,10 +832,13 @@ Furthermore, the use case identifies opportunities to support multiple data form ### **Key Properties in Use:** -| GeoCroissant Property | Notes | -| ----- | ----- | -| `geocr:multiWavelengthConfiguration` | Structured GeoCroissant property (typed as `geocr:MultiWavelengthConfiguration`) that captures the set of wavelength channels (e.g., via `geocr:channelList`) to simplify authoring and support subsequent mapping to SPASE | ++----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| GeoCroissant Property | Notes | ++========================================+=================================================================================================================================================================================================================================================================+ +| `geocr:multiWavelengthConfiguration` | Structured GeoCroissant property (typed as `geocr:MultiWavelengthConfiguration`) that captures the set of wavelength channels (e.g., via `geocr:channelList`) to simplify authoring and support subsequent mapping to SPASE | ++----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | `geocr:solarInstrumentCharacteristics` | Structured GeoCroissant property (typed as `geocr:SolarInstrumentCharacteristics`) that captures observatory/platform and instrument identifiers (e.g., `geocr:observatory`, `geocr:instrument`) to simplify authoring and support subsequent mapping to SPASE. | ++----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 2: Interoperability with other standards** @@ -823,29 +846,47 @@ This use case addresses the need for interoperability between the GeoCroissant m The table below demonstrates a mapping between commonly used metadata fields in STAC, GeoCroissant, and GeoDCAT. This mapping enables metadata interoperability, facilitates automated format conversion, and supports integration with existing data catalogs, search engines, and metadata brokers. -| STAC field | GeoCroissant field | External vocabulary field | -| ----- | ----- | ----- | -| id | @id | N/A | -| type | @type | N/A | -| title | name | dcat:title | -| description | description | dcat:description | -| datetime (or properties.datetime) | \- | schema:temporalCoverage, dct:temporal | -| bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | -| geometry | \- | geosparql:hasGeometry, geosparql:asWKT | -| assets | distribution | dcat:distribution | -| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | -| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | -| proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | -| gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | -| eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| STAC field | GeoCroissant field | External vocabulary field | ++===================================+===========================================================+======================================================+ +| id | @id | N/A | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| type | @type | N/A | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| title | name | dcat:title | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| description | description | dcat:description | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| datetime (or properties.datetime) | \- | schema:temporalCoverage, dct:temporal | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| geometry | \- | geosparql:hasGeometry, geosparql:asWKT | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| assets | distribution | dcat:distribution | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | ++-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ ### **Key Properties in Use:** -| Property | Purpose | -| ----- | ----- | -| `geocr:coordinateReferenceSystem` | Specifies the dataset CRS/projection (e.g., EPSG code) to ensure consistent spatial referencing and interoperability across geospatial tools and standards. | -| `geocr:spatialResolution` | Captures the dataset’s nominal spatial resolution (e.g., ground sampling distance) to support discovery, interoperability, and ML-readiness. | ++--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | ++====================================================================+==============================================================================================================================================================================================================================================================+ +| `geocr:coordinateReferenceSystem` | Specifies the dataset CRS/projection (e.g., EPSG code) to ensure consistent spatial referencing and interoperability across geospatial tools and standards. | ++--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `geocr:spatialResolution` | Captures the dataset’s nominal spatial resolution (e.g., ground sampling distance) to support discovery, interoperability, and ML-readiness. | ++--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | `geocr:bandConfiguration (value typed as geocr:BandConfiguration)` | Describes raster band organization and semantics (e.g., band count and ordered band names) to support interoperable use of multi-band imagery. Spectral descriptors are represented separately via geocr:spectralBandMetadata (typed as geocr:SpectralBand). | ++--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 3: Programmatic Metadata Access (OGC APIs)** @@ -855,7 +896,7 @@ When a GeoCroissant dataset exposes its record-level metadata through an OGC API Below is an example JSON response from a `/records` endpoint showing how GeoCroissant-style metadata can be represented in a **GeoJSON FeatureCollection**, making it suitable for direct spatial querying and client-side rendering. -``` +``` { "@context": { "@language": "en", @@ -966,11 +1007,13 @@ Below is an example JSON response from a `/records` endpoint showing how GeoCroi ### **Key Properties in Use:** -| Property | Purpose | -| ----- | ----- | -| `geocr:recordEndpoint` | Declares the OGC API – Records endpoint (e.g., /records) where the dataset’s metadata records can be programmatically retrieved and filtered. | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | ++===================================+===============================================================================================================================================+ +| `geocr:recordEndpoint` | Declares the OGC API – Records endpoint (e.g., /records) where the dataset’s metadata records can be programmatically retrieved and filtered. | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ -## **Use case 4: Search and Discovery \- GeoSPARQL** +## **Use case 4: Search and Discovery - GeoSPARQL** This use case demonstrates querying GeoCroissant metadata using **GeoSPARQL**, a W3C standard vocabulary and SPARQL extension that enables spatial reasoning over RDF data. In this pattern, GeoCroissant datasets express geometry using **GeoSPARQL terms** (e.g., `geosparql:hasGeometry` with geometries serialized via `geosparql:asWKT`), allowing a semantic graph database (e.g., GraphDB) to evaluate spatial predicates such as containment and intersection. @@ -978,22 +1021,27 @@ To complement GeoSPARQL reasoning, GeoCroissant introduces `geocr:spatialIndex` ### **Key Properties in Use:** -| Property | Purpose | -| ----- | ----- | -| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | -| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | -| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | -| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | ++===================================+=====================================================================================================================================================+ +| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -***Note: Refer to Appendix C for examples showing querying in GeoCroissant format using GeoSPARQL.*** +***Note: Refer to Appendix C for examples showing querying in GeoCroissant format using GeoSPARQL.*** ## **Use case 5: ML Pipeline Integration** -Given a sample Geo-AI [dataset](https://huggingface.co/datasets/ibm-nasa-geospatial/hls_burn_scars) consisting of image-label pairs, this use-case highlights how data can be loaded to PyTorch using a custom pipeline for ML workflows. +Given a sample Geo-AI [dataset](https://huggingface.co/datasets/ibm-nasa-geospatial/hls_burn_scars) consisting of image-label pairs, this use-case highlights how data can be loaded to PyTorch using a custom pipeline for ML workflows. -Example 1: Loading the GeoCroissant +Example 1: Loading the GeoCroissant -```py +``` py import mlcroissant as mlc jsonld = "geocroissant_ml.json" @@ -1004,13 +1052,13 @@ print(dataset.metadata.to_json()) Output- -``` +``` {'@context': {'@language': 'en', '@vocab': 'https://schema.org/', 'column': 'ml:column', 'data': {'@id': 'ml:data', '@type': '@json'}, 'dataType': {'@id': 'ml:dataType', '@type': '@vocab'}, 'extract': 'ml:extract', 'field': 'ml:field', 'fileProperty': 'ml:fileProperty', 'format': 'ml:format', 'includes': 'ml:includes', 'isEnumeration': 'ml:isEnumeration', 'jsonPath': 'ml:jsonPath', 'ml': 'http://mlcommons.org/schema/', 'parentField': 'ml:parentField', 'path': 'ml:path', 'recordSet': 'ml:recordSet', 'references': 'ml:references', 'regex': 'ml:regex', 'repeated': 'ml:repeated', 'replace': 'ml:replace', 'sc': 'https://schema.org/', 'separator': 'ml:separator', 'source': 'ml:source', 'subField': 'ml:subField', 'transform': 'ml:transform', 'geocr': 'http://mlcommons.org/croissant/geo/', 'cr': 'http://mlcommons.org/croissant/', 'dct': 'http://purl.org/dc/terms/', 'version': '1.0'}, '@type': 'sc:Dataset', 'name': 'Example_GeoCroissant_Dataset', 'description': 'An example dataset following the GeoCroissant format.', 'url': 'https://example.com/geocroissant', 'distribution': [{'@type': 'sc:FileObject', 'name': 'satellite_image', 'contentUrl': 'https://example.com/image.tif', 'encodingFormat': 'image/tiff', 'sha256': 'your_checksum_here'}]} ``` Example 2: The ML workflow for loading dataset using custom dataloader is as follows- -```py +``` py import mlcroissant as mlc import torch from torch.utils.data import Dataset, DataLoader @@ -1076,7 +1124,7 @@ for i, example in enumerate(train_loader): print(example) ``` -```json +``` json {'image': tensor([[[[0.0304, 0.0135, 0.0114, ..., 0.0149, 0.0180, 0.0198], [0.0135, 0.0130, 0.0098, ..., 0.0145, 0.0151, 0.0173], ..., @@ -1094,7 +1142,7 @@ This use case demonstrates how Responsible AI (RAI) metadata can be used to docu RAI fields such as `rai:dataCollection`, `rai:dataCollectionType`, `rai:dataUseCases`, and `rai:citationInfo` describe how the dataset was produced, the contexts in which it is appropriate to apply, and its source and attribution (See [Croissant RAI specification](http://mlcommons.org/croissant/RAI/1.0) for more details). In GeoAI settings, pairing these RAI descriptors with GeoCroissant-specific annotations (e.g., `geocr:spatialBias` and `geocr:samplingStrategy`) helps make spatial representativeness and sampling decisions explicit, improving auditability, comparability, and reproducibility for applications such as disaster response, environmental monitoring, and land-cover mapping. -```json +``` json { "@context": { "@language": "en", @@ -1212,18 +1260,21 @@ RAI fields such as `rai:dataCollection`, `rai:dataCollectionType`, `rai:dataUseC ### **Mapped RAI Attributes** -| Property | Purpose | -| ----- | ----- | -| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | -| `geocr:samplingStrategy` | Describes how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria), enabling reproducible dataset creation and interpretation of training data. | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | ++===================================+=====================================================================================================================================================================================+ +| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `geocr:samplingStrategy` | Describes how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria), enabling reproducible dataset creation and interpretation of training data. | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 7: Support for Time-Series Data** -Time-series Earth observation (EO) datasets are foundational for GeoAI tasks such as change detection, phenology monitoring, disturbance mapping, and forecasting. Unlike static datasets, time-series collections require explicit metadata for temporal cadence and record ordering, so that downstream systems can reliably align, subset, and batch observations across time. GeoCroissant addresses this by supporting time-series constructs (e.g., `geocr:temporalResolution` and `geocr:timeSeriesIndex`) alongside core geospatial descriptors (coverage, CRS, resolution) and record-level assets. +Time-series Earth observation (EO) datasets are foundational for GeoAI tasks such as change detection, phenology monitoring, disturbance mapping, and forecasting. Unlike static datasets, time-series collections require explicit metadata for temporal cadence and record ordering, so that downstream systems can reliably align, subset, and batch observations across time. GeoCroissant addresses this by supporting time-series constructs (e.g., `geocr:temporalResolution` and `geocr:timeSeriesIndex`) alongside core geospatial descriptors (coverage, CRS, resolution) and record-level assets. Below is an illustrative example showing how GeoCroissant can represent time-series datasets. -```json +``` json { "@context": { "@language": "en", @@ -1312,7 +1363,7 @@ Below is an illustrative example showing how GeoCroissant can represent time-ser If a required metadata attribute is already defined in an established external vocabulary (e.g., GeoSPARQL, SPASE, Dublin Core Terms), GeoCroissant recommends reusing that term verbatim by declaring the appropriate prefix/IRI mapping in the JSON-LD @context and employing the external property directly (refer to the Croissant 1.1 specification on [adding external vocabularies](https://docs.mlcommons.org/croissant/docs/croissant-spec-1.1.html#using-external-vocabularies)). If no suitable term exists in any recognized vocabulary, the metadata should be expressed in a vocabulary-agnostic manner using sc:additionalProperty with sc:PropertyValue (and sc:QuantitativeValue for numeric values with units), as illustrated below. -```json +``` json { "@type": "sc:Dataset", "name": "Example", @@ -1347,25 +1398,25 @@ Example notebook recipes demonstrating GeoCroissant usage are available on the M # **References** -1. https://docs.mlcommons.org/croissant/docs/croissant-spec.html -2. Riccardo Albertoni, David Browning, Simon J D Cox, Alejandra Gonzalez Beltran, Andrea Perego, and Peter Winstanley. Data catalog vocabulary (DCAT) \- version 3\. https://www.w3.org/TR/vocab-dcat-3/, 01 2024\. -3. schema.org. Schema.org v26.0.https://github.com/schemaorg/schemaorg/tree/main/data/releases/26.0/, 02 2024\. -4. Ramanathan V Guha, Dan Brickley, and Steve Macbeth. Schema. org: evolution of structured data on the web. Communications of the ACM, 59(2):44–51, 2016\. -5. Frictionless Working Group. Data packages [https://specs.frictionlessdata.io/,2024](https://specs.frictionlessdata.io/,2024) -6. W3C Working Group. CSV on the web: A primer. https://www.w3.org/TR/ - tabular-data-primer/, -7. [https://docs.mlcommons.org/croissant/docs/croissant-spec.html](https://docs.mlcommons.org/croissant/docs/croissant-spec.html) -8. [https://www.earthdata.nasa.gov/news/blog/introducing-croissant-format-machine-learning-datasets](https://www.earthdata.nasa.gov/news/blog/introducing-croissant-format-machine-learning-datasets) -9. [https://docs.mlcommons.org/croissant/docs/croissant-rai-spec.html](https://docs.mlcommons.org/croissant/docs/croissant-rai-spec.html) -10. [GeoCroissant- A Metadata Framework for Geospatial ML-ready Datasets](https://www.grss-ieee.org/events/geocroissant-a-metadata-framework-for-geospatial-ml-ready-datasets/) -11. Akhtar, M., Benjelloun, O., Conforti, C., Foschini, L., Giner-Miguelez, J., Gijsbers, P., Goswami, S., Jain, N., Karamousadakis, M., Kuchnik, M. and Krishna, S., 2024\. Croissant: A metadata format for ml-ready datasets. *Advances in Neural Information Processing Systems*, *37*, pp.82133-82148. -12. Jain, N., Akhtar, M., Giner-Miguelez, J., Shinde, R., Vanschoren, J., Vogler, S., Goswami, S., Rao, Y., Santos, T., Oala, L. and Karamousadakis, M., 2024\. A Standardized Machine-readable Dataset Documentation Format for Responsible AI. *arXiv preprint arXiv:2407.16883*. - -## **Appendix A \- Installation** +1. https://docs.mlcommons.org/croissant/docs/croissant-spec.html\ +2. Riccardo Albertoni, David Browning, Simon J D Cox, Alejandra Gonzalez Beltran, Andrea Perego, and Peter Winstanley. Data catalog vocabulary (DCAT) - version 3. https://www.w3.org/TR/vocab-dcat-3/, 01 2024.\ +3. schema.org. Schema.org v26.0.https://github.com/schemaorg/schemaorg/tree/main/data/releases/26.0/, 02 2024.\ +4. Ramanathan V Guha, Dan Brickley, and Steve Macbeth. Schema. org: evolution of structured data on the web. Communications of the ACM, 59(2):44–51, 2016.\ +5. Frictionless Working Group. Data packages \ +6. W3C Working Group. CSV on the web: A primer. https://www.w3.org/TR/\ + tabular-data-primer/,\ +7. \ +8. \ +9. \ +10. [GeoCroissant- A Metadata Framework for Geospatial ML-ready Datasets](https://www.grss-ieee.org/events/geocroissant-a-metadata-framework-for-geospatial-ml-ready-datasets/)\ +11. Akhtar, M., Benjelloun, O., Conforti, C., Foschini, L., Giner-Miguelez, J., Gijsbers, P., Goswami, S., Jain, N., Karamousadakis, M., Kuchnik, M. and Krishna, S., 2024. Croissant: A metadata format for ml-ready datasets. *Advances in Neural Information Processing Systems*, *37*, pp.82133-82148.\ +12. Jain, N., Akhtar, M., Giner-Miguelez, J., Shinde, R., Vanschoren, J., Vogler, S., Goswami, S., Rao, Y., Santos, T., Oala, L. and Karamousadakis, M., 2024. A Standardized Machine-readable Dataset Documentation Format for Responsible AI. *arXiv preprint arXiv:2407.16883*. + +## **Appendix A - Installation** The "mlcroissant\[geo\]" is an optional /extra dependency package for mlcroissant that adds geospatial data processing capabilities. When you install "mlcroissant\[geo\]", you get additional functionality specifically designed for working with converters that convert your current metadata into geocroissant metadata format. -``` +``` !pip install mlcroissant[geo] # Installed through `pip install -e .[geo]` -- while development @@ -1377,38 +1428,44 @@ This appendix summarizes responses from the GeoCroissant user adoption survey an ### **Rating scale** -* Very important \= 5 -* Important \= 4 -* Neither important nor unimportant \= 3 -* Unimportant \= 2 -* Very unimportant \= 1 +- Very important = 5\ +- Important = 4\ +- Neither important nor unimportant = 3\ +- Unimportant = 2\ +- Very unimportant = 1 ### **Summary of responses** Overall, most spatial machine learning dataset fields received an average rating of **“Important.”** No spatial or non-spatial fields were rated **“Very unimportant.”** Across both spatial and non-spatial metadata, **description** was consistently identified as the most important field. Respondents noted that the description provides critical context required to interpret and responsibly use a dataset, including information on provenance, background, assumptions, and limitations (Refer table below). -Table: Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. - -| Rank | Top five most important ML fields | Top five most important Geospatial fields | -| ----- | ----- | ----- | -| 1 | Description | Description | -| 2 | License | Sensor (e.g., optical, thermal) | -| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | -| 4 | Name | Distribution (file representation/format) | -| 5 | URL | Model category (e.g., classification) | - -![][image1] ++----------------------+-------------------------------------------+-------------------------------------------+ +| Rank | Top five most important ML fields | Top five most important Geospatial fields | ++======================+===========================================+===========================================+ +| 1 | Description | Description | ++----------------------+-------------------------------------------+-------------------------------------------+ +| 2 | License | Sensor (e.g., optical, thermal) | ++----------------------+-------------------------------------------+-------------------------------------------+ +| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | ++----------------------+-------------------------------------------+-------------------------------------------+ +| 4 | Name | Distribution (file representation/format) | ++----------------------+-------------------------------------------+-------------------------------------------+ +| 5 | URL | Model category (e.g., classification) | ++----------------------+-------------------------------------------+-------------------------------------------+ + +: Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. + +![](data:image/png;base64,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)\ **Figure: Summary of mean importance ratings from the GeoCroissant user adoption survey.** Together, these figures report the mean importance (1–5, excluding NA) assigned by respondents to ML and geospatial metadata fields. ML respondents prioritized core reuse and access metadata—especially **license** and **distribution**, followed by **name** and **URL**—while geospatial respondents emphasized GeoAI-critical context, ranking **description**, **sensor**, and **annotation type** highest. Overall, the results indicate that users most value metadata that clarifies dataset usability, legal reuse, and the geospatial/labeling characteristics needed to reliably integrate datasets into spatial ML workflows. -## **Appendix C \- Examples showing querying on GeoCroissant Dataset** +## **Appendix C - Examples showing querying on GeoCroissant Dataset** *Query 1: Finding GeoCroissant dataset by querying via GeoSPARQL Geometry* -``` +``` PREFIX geosparql: -PREFIX geocr: +PREFIX geocr: PREFIX dct: SELECT ?dataset ?record ?wkt @@ -1423,11 +1480,10 @@ WHERE { } ``` -*Query 2: Discovering GeoCroissant Datasets by Exact Bounding Box Match* - +*Query 2: Discovering GeoCroissant Datasets by Exact Bounding Box Match* -``` -PREFIX geocr: +``` +PREFIX geocr: SELECT ?dataset ?record ?bbox WHERE { @@ -1436,6 +1492,4 @@ WHERE { ?record geocr:BoundingBox ?bbox . FILTER(STR(?bbox) = "[-120.0, 30.0, -110.0, 40.0]") } -``` - -[image1]: \ No newline at end of file +``` \ No newline at end of file From 485267b294c52d8fb5a60014944b69da81f26d23 Mon Sep 17 00:00:00 2001 From: Rajat Shinde Date: Tue, 20 Jan 2026 01:22:42 -0600 Subject: [PATCH 3/7] minor formatting update --- docs/croissant-geo-spec.md | 94 +++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/docs/croissant-geo-spec.md b/docs/croissant-geo-spec.md index 76044ba9e..1e1b7c460 100644 --- a/docs/croissant-geo-spec.md +++ b/docs/croissant-geo-spec.md @@ -74,15 +74,15 @@ This namespace IRI is generally abbreviated using the prefix: **geocr** In addition, this vocabulary relies on the following namespaces: -+----------------------+---------------------------------------+------------------------------------+ -| Prefix | IRI | Description | -+======================+=======================================+====================================+ -| sc | | The schema.org namespace | -+----------------------+---------------------------------------+------------------------------------+ -| cr | | MLCommons Croissant base namespace | -+----------------------+---------------------------------------+------------------------------------+ -| geocr | | GeoCroissant extension namespace | -+----------------------+---------------------------------------+------------------------------------+ ++----------------+---------------------------------------+------------------------------------+ +| Prefix | IRI | Description | ++================+=======================================+====================================+ +| sc | | The schema.org namespace | ++----------------+---------------------------------------+------------------------------------+ +| cr | | MLCommons Croissant base namespace | ++----------------+---------------------------------------+------------------------------------+ +| geocr | | GeoCroissant extension namespace | ++----------------+---------------------------------------+------------------------------------+ The GeoCroissant specification is versioned, and the version is included in the URI of this specification:\ **http://mlcommons.org/croissant/geo/1.0** @@ -315,8 +315,8 @@ Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). +---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| GeoCroissant Use Case | GeoCroissant Properties | External Vocabulary Properties | Croissant Core Properties | Schema.org Properties | -+===========================================================================+========================================================================================================================================+=================================================================================+======================================================+===========================================================================+ +| # GeoCroissant Use Case | # GeoCroissant Properties | # External Vocabulary Properties | # Croissant Core Properties | # Schema.org Properties | +| | | | | | | **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg, \ | | sc: GeospatialGeometry, sc:spatialCoverage | | | | stac:gsd | | | +---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ @@ -1007,11 +1007,11 @@ Below is an example JSON response from a `/records` endpoint showing how GeoCroi ### **Key Properties in Use:** -+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ -| Property | Purpose | -+===================================+===============================================================================================================================================+ -| `geocr:recordEndpoint` | Declares the OGC API – Records endpoint (e.g., /records) where the dataset’s metadata records can be programmatically retrieved and filtered. | -+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ ++------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | ++========================+===============================================================================================================================================+ +| `geocr:recordEndpoint` | Declares the OGC API – Records endpoint (e.g., /records) where the dataset’s metadata records can be programmatically retrieved and filtered. | ++------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 4: Search and Discovery - GeoSPARQL** @@ -1021,17 +1021,17 @@ To complement GeoSPARQL reasoning, GeoCroissant introduces `geocr:spatialIndex` ### **Key Properties in Use:** -+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| Property | Purpose | -+===================================+=====================================================================================================================================================+ -| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | -+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | -+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | -+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | -+-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ ++-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | ++=========================+=====================================================================================================================================================+ +| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | ++-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | ++-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | ++-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | ++-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ ***Note: Refer to Appendix C for examples showing querying in GeoCroissant format using GeoSPARQL.*** @@ -1260,13 +1260,13 @@ RAI fields such as `rai:dataCollection`, `rai:dataCollectionType`, `rai:dataUseC ### **Mapped RAI Attributes** -+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Property | Purpose | -+===================================+=====================================================================================================================================================================================+ -| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | -+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| `geocr:samplingStrategy` | Describes how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria), enabling reproducible dataset creation and interpretation of training data. | -+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | ++==========================+=====================================================================================================================================================================================+ +| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | ++--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `geocr:samplingStrategy` | Describes how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria), enabling reproducible dataset creation and interpretation of training data. | ++--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 7: Support for Time-Series Data** @@ -1438,19 +1438,19 @@ This appendix summarizes responses from the GeoCroissant user adoption survey an Overall, most spatial machine learning dataset fields received an average rating of **“Important.”** No spatial or non-spatial fields were rated **“Very unimportant.”** Across both spatial and non-spatial metadata, **description** was consistently identified as the most important field. Respondents noted that the description provides critical context required to interpret and responsibly use a dataset, including information on provenance, background, assumptions, and limitations (Refer table below). -+----------------------+-------------------------------------------+-------------------------------------------+ -| Rank | Top five most important ML fields | Top five most important Geospatial fields | -+======================+===========================================+===========================================+ -| 1 | Description | Description | -+----------------------+-------------------------------------------+-------------------------------------------+ -| 2 | License | Sensor (e.g., optical, thermal) | -+----------------------+-------------------------------------------+-------------------------------------------+ -| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | -+----------------------+-------------------------------------------+-------------------------------------------+ -| 4 | Name | Distribution (file representation/format) | -+----------------------+-------------------------------------------+-------------------------------------------+ -| 5 | URL | Model category (e.g., classification) | -+----------------------+-------------------------------------------+-------------------------------------------+ ++---------------+-------------------------------------------+-------------------------------------------+ +| Rank | Top five most important ML fields | Top five most important Geospatial fields | ++===============+===========================================+===========================================+ +| 1 | Description | Description | ++---------------+-------------------------------------------+-------------------------------------------+ +| 2 | License | Sensor (e.g., optical, thermal) | ++---------------+-------------------------------------------+-------------------------------------------+ +| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | ++---------------+-------------------------------------------+-------------------------------------------+ +| 4 | Name | Distribution (file representation/format) | ++---------------+-------------------------------------------+-------------------------------------------+ +| 5 | URL | Model category (e.g., classification) | ++---------------+-------------------------------------------+-------------------------------------------+ : Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. From 88d05c63767583b6f4ccd6c443db11511664c094 Mon Sep 17 00:00:00 2001 From: Rajat Shinde Date: Tue, 20 Jan 2026 01:55:53 -0600 Subject: [PATCH 4/7] minor formatting updates --- docs/croissant-geo-spec.md | 306 +++++++++++++++---------------------- 1 file changed, 124 insertions(+), 182 deletions(-) diff --git a/docs/croissant-geo-spec.md b/docs/croissant-geo-spec.md index 1e1b7c460..0572fb8c3 100644 --- a/docs/croissant-geo-spec.md +++ b/docs/croissant-geo-spec.md @@ -10,49 +10,49 @@ Published: 01/20/2025 Authors: -- Rajat Shinde - NASA Office of Data Science and Informatics - University of Alabama in Huntsville, US\ -- Manil Maskey - NASA, US\ -- Ag Stephens - STFC Centre for Environmental Data Analysis (UK)\ -- Harsh Shinde - Individual Researcher\ -- Joseph Edgerton - UVA\ -- Tejasri N - IIT Hyderabad, India\ -- Douglas Fils - San Diego SuperComputing Center, US\ -- Edenna Chen - Massachusetts Institute of Technology, US\ -- Claus Weiland - Senckenberg - Leibniz Institution for Biodiversity and Earth System Research\ -- Pedram Ghamisi - Helmholtz-Zentrum Dresden-Rossendorf (HZDR), Germany \| Lancaster University, UK\ -- Gerald Fenoy - GeoLabs, France\ -- Yuhan Douglas Rao - National Oceanic and Atmospheric Administration\ -- Omar Benjelloun - Google\ +- Rajat Shinde - NASA Office of Data Science and Informatics - University of Alabama in Huntsville, US +- Manil Maskey - NASA, US +- Ag Stephens - STFC Centre for Environmental Data Analysis (UK) +- Harsh Shinde - Independent Researcher, India +- Joseph Edgerton - UVA +- Tejasri N - IIT Hyderabad, India +- Douglas Fils - San Diego SuperComputing Center, US +- Edenna Chen - Massachusetts Institute of Technology, US +- Claus Weiland - Senckenberg - Leibniz Institution for Biodiversity and Earth System Research +- Pedram Ghamisi - Helmholtz-Zentrum Dresden-Rossendorf (HZDR), Germany \| Lancaster University, UK +- Gerald Fenoy - GeoLabs, France +- Yuhan Douglas Rao - National Oceanic and Atmospheric Administration +- Omar Benjelloun - Google - Elena Simperl - King’s College London & Open Data Institute, UK Contributors *(in alphabetical order)*: -- Anna Boser - UCSB, US\ -- Armin Mehrabian\ -- Ben Lewis - Harvard University\ -- Brianna R Pagan - Development Seed\ -- Christine Kirkpatrick - San Diego Super Computing Center, US\ -- Ed Parsons - Google\ -- Gilles Quentin Hacheme - Microsoft AI /GeoAI Africa\ -- Gobe Hobona - Open Geospatial Consortium\ -- Harsha Vardhan Madiraju - Open Geospatial Consortium\ -- Iksha Gurung - NASA Office of Data Science and Informatics - University of Alabama in Huntsville, US\ -- Jim Antonoissee - National Geospatial-Intelligence Agency, US\ -- Jon Marokhovsky - Clark University\ -- Konstantin Klemmer\ -- Luis Oala\ -- Samapriya Roy - SpatialBytes and Desert Research Institute, US\ -- Scott Simmons - Open Geospatial Consortium\ -- Sidharth Subramaniam - Terrafloww Labs, India\ -- Simon Ilyushchenko - Google\ -- Siri Jodha Khalsa - IEEE Geosciences and Remote Sensing Society Standards Committee\ -- Slava Tykhonov - CODATA\ +- Anna Boser - UCSB, US +- Armin Mehrabian +- Ben Lewis - Harvard University +- Brianna R Pagan - Development Seed +- Christine Kirkpatrick - San Diego Super Computing Center, US +- Ed Parsons - Google +- Gilles Quentin Hacheme - Microsoft AI /GeoAI Africa +- Gobe Hobona - Open Geospatial Consortium +- Harsha Vardhan Madiraju - Open Geospatial Consortium +- Iksha Gurung - NASA Office of Data Science and Informatics - University of Alabama in Huntsville, US +- Jim Antonoissee - National Geospatial-Intelligence Agency, US +- Jon Marokhovsky - Clark University +- Konstantin Klemmer +- Luis Oala +- Samapriya Roy - SpatialBytes and Desert Research Institute, US +- Scott Simmons - Open Geospatial Consortium +- Sidharth Subramaniam - Terrafloww Labs, India +- Simon Ilyushchenko - Google +- Siri Jodha Khalsa - IEEE Geosciences and Remote Sensing Society Standards Committee +- Slava Tykhonov - CODATA - Ying-Jung Chen Acknowledgements -- MLCommons GeoCroissant Working Group\ -- MLCommons Croissant Working Group\ +- MLCommons GeoCroissant Working Group +- MLCommons Croissant Working Group - Open Geospatial Consortium (OGC) GeoAI Domain Working Group # **Introduction & overview** @@ -74,15 +74,11 @@ This namespace IRI is generally abbreviated using the prefix: **geocr** In addition, this vocabulary relies on the following namespaces: -+----------------+---------------------------------------+------------------------------------+ -| Prefix | IRI | Description | -+================+=======================================+====================================+ -| sc | | The schema.org namespace | -+----------------+---------------------------------------+------------------------------------+ -| cr | | MLCommons Croissant base namespace | -+----------------+---------------------------------------+------------------------------------+ -| geocr | | GeoCroissant extension namespace | -+----------------+---------------------------------------+------------------------------------+ +| Prefix | IRI | Description | +|---|---|---| +| sc | | The schema.org namespace | +| cr | | MLCommons Croissant base namespace | +| geocr | | GeoCroissant extension namespace | The GeoCroissant specification is versioned, and the version is included in the URI of this specification:\ **http://mlcommons.org/croissant/geo/1.0** @@ -118,10 +114,10 @@ As the volume and resolution of Earth data continue to grow, GeoAI enables new f Several considerations are critical in the development of AI-ready geospatial datasets: -1. **Importance of Location:** Accurate spatial information is fundamental, as geolocation errors or coarse annotations can directly compromise model predictions and reduce reliability in downstream tasks.\ -2. **Sampling Strategy:** With petabyte-scale datasets, careful sampling is essential to avoid class imbalance and ensure fair representation of diverse regions and phenomena.\ -3. **Data Lifecycle:** Many GeoAI applications are time-sensitive; stale or temporally mismatched data can reduce model relevance and generalizability.\ -4. **Cloud-Based Access:** Centralized, cloud-optimized storage and access enable efficient training, evaluation, and validation of large-scale datasets, and support collaborative workflows and scalable computation.\ +1. **Importance of Location:** Accurate spatial information is fundamental, as geolocation errors or coarse annotations can directly compromise model predictions and reduce reliability in downstream tasks. +2. **Sampling Strategy:** With petabyte-scale datasets, careful sampling is essential to avoid class imbalance and ensure fair representation of diverse regions and phenomena. +3. **Data Lifecycle:** Many GeoAI applications are time-sensitive; stale or temporally mismatched data can reduce model relevance and generalizability. +4. **Cloud-Based Access:** Centralized, cloud-optimized storage and access enable efficient training, evaluation, and validation of large-scale datasets, and support collaborative workflows and scalable computation. 5. **End-to-End AI Workflow Integration:** Metadata-rich, modular formats like GeoCroissant allow seamless dataset ingestion into modern AI workflows, improving scalability and automation across the model lifecycle. While this specification emphasizes structural and semantic consistency, it also aligns with emerging practices in **Responsible AI** by promoting transparency, reproducibility, and ethical use of geospatial data in AI applications. @@ -134,19 +130,13 @@ While the Croissant format introduces a strong foundation for ML dataset metadat The table below summarizes representative geospatial dataset types, the complexities common to Earth observation (EO) data, and the areas where Croissant core does not prescribe geospatial conventions (e.g., CRS, resolution, modality, and band semantics). GeoCroissant addresses these gaps by extending Croissant with standardized, interoperable metadata constructs that improve discoverability, interoperability, and ML-readiness for scalable and responsible GeoAI workflows. -+-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Types of Geospatial Datasets | Issues in GeoAI datasets as compared to “generic” datasets | How does GeoCroissant (and Croissant) address these issues? | -+=============================================================+=================================================================+==========================================================================================+ -| EO imagery (multi-band; optical/SAR) | Band semantics and modality-specific acquisition parameters | Standardize sensor/band descriptors and ML task metadata (Interoperability, ML workflow) | -+-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Spatiotemporal datasets (time series, in-situ, simulations) | Time indexing + spatiotemporal coverage consistency | Consistent temporal modeling and time-series support (Time-series support, Discovery) | -+-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Complex geo formats (NetCDF/HDF5/Zarr) | Nested variables, chunking, multiple assets per logical sample | Clear-mapping from raw containers to AI-ready datasets | -+-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Mixed geometry data (vector, raster, point clouds) | Heterogeneous geometry types and spatial reference handling | Uniform spatial semantics and discovery/query support | -+-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Human-labeled / crowdsourced GeoAI datasets | Sampling choices and spatial representativeness affect outcomes | Explicit provenance and spatial bias/sampling documentation based on Croissant RAI | -+-------------------------------------------------------------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------+ +| Types of Geospatial Datasets | Issues in GeoAI datasets as compared to “generic” datasets | How does GeoCroissant (and Croissant) address these issues? | +|---|---|---| +| EO imagery (multi-band; optical/SAR) | Band semantics and modality-specific acquisition parameters | Standardize sensor/band descriptors and ML task metadata (Interoperability, ML workflow) | +| Spatiotemporal datasets (time series, in-situ, simulations) | Time indexing + spatiotemporal coverage consistency | Consistent temporal modeling and time-series support (Time-series support, Discovery) | +| Complex geo formats (NetCDF/HDF5/Zarr) | Nested variables, chunking, multiple assets per logical sample | Clear-mapping from raw containers to AI-ready datasets | +| Mixed geometry data (vector, raster, point clouds) | Heterogeneous geometry types and spatial reference handling | Uniform spatial semantics and discovery/query support | +| Human-labeled / crowdsourced GeoAI datasets | Sampling choices and spatial representativeness affect outcomes | Explicit provenance and spatial bias/sampling documentation based on Croissant RAI | ## **GeoCroissant** @@ -314,30 +304,19 @@ Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| # GeoCroissant Use Case | # GeoCroissant Properties | # External Vocabulary Properties | # Croissant Core Properties | # Schema.org Properties | -| | | | | | -| **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg, \ | | sc: GeospatialGeometry, sc:spatialCoverage | -| | | stac:gsd | | | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType, spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI_EOTask (OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ -| **Use case 9: Caching AI-ready transformations of large geospatial data** | \- | | cr:transform, cr:extract, cr:FileSet / cr:FileObject | sc:encodingFormat, sc:contentUrl | -+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------+---------------------------------------------------------------------------+ +| # GeoCroissant Use Case | # GeoCroissant Properties | # External Vocabulary Properties | # Croissant Core Properties | # Schema.org Properties | +|---|---|---|---|---| +| **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg,\ +| | | stac:gsd | | sc: GeospatialGeometry, sc:spatialCoverage | +| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics \(with geocr:channelList, geocr:observatory, geocr:instrument\) | spase:MeasurementType,\spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | +| **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | +| **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | +| **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | +| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI_EOTask\(OGC Training DML\) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | +| **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | +| **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | +| **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | +| **Use case 9: Caching AI-ready transformations of large geospatial data** | \- | | cr:transform, cr:extract, cr:FileSet / cr:FileObject | sc:encodingFormat, sc:contentUrl | The concepts which cannot be cleanly expressed using existing, widely adopted vocabularies are introduced as GeoCroissant (geocr:) properties. Below, we provide concise definitions and illustrative examples for each GeoCroissant property introduced in this specification grouped by specific geospatial metadata. @@ -665,7 +644,7 @@ Cardinality: ZERO or ONE Example: Dataset-level ``` -{ "@type": "Dataset", "name": "Example dataset (sampling strategy)", "geocr:samplingStrategy": "512×512 chips centered on burn polygons; cloudy scenes removed." } +{ "@type": "Dataset", "name": "Example dataset (sampling strategy)", "geocr:samplingStrategy": "512×512 chips centered on burn polygons; cloudy scenes removed."} ``` ### **Temporal Metadata** @@ -681,7 +660,7 @@ Example: `"geocr:temporalResolution": { "@type":"QuantitativeValue","value":1,"u Example: Dataset-level ``` -{ "@type": "Dataset", "name": "Example dataset (dataset-level temporal resolution)", "geocr:temporalResolution": { "@type": "QuantitativeValue", "value": 1, "unitText": "month" } } +{ "@type": "Dataset", "name": "Example dataset (dataset-level temporal resolution)", "geocr:temporalResolution": { "@type": "QuantitativeValue", "value": 1, "unitText": "month" }} ``` Example: Data-level @@ -826,19 +805,16 @@ This section provides an overview of the various use cases that would be served This use case demonstrates the integration of space weather datasets into the GeoCroissant format through automated metadata conversion workflows. Specifically, it explores the use of large language models (LLMs) and custom parsing logic to convert metadata from the Space Physics Archive Search and Extract (SPASE) standard into Croissant-compliant metadata. The datasets, derived from NASA’s GOES satellite missions, include both single CSV files and ZIP archives containing multiple CSVs with associated SPASE XML metadata. -A proof-of-concept tool named **SPASECroissant Oven** was developed to automate this process. It builds Croissant metadata layers—including description, distribution, and recordSet—by leveraging LLMs to infer spase:MeasurementType, data types, and column descriptors. The tool also demonstrates the feasibility of integrating SPASE-specific metadata elements (e.g., NumericalData, Observatory, and InstrumentTypes) into the GeoCroissant structure, enabling richer scientific documentation. +A proof-of-concept tool named **SPASECroissant Oven** was developed to automate this process. It builds Croissant metadata layers, including description, distribution, and recordSet by leveraging LLMs to infer spase:MeasurementType, data types, and column descriptors. The tool also demonstrates the feasibility of integrating SPASE-specific metadata elements (e.g., NumericalData, Observatory, and InstrumentTypes) into the GeoCroissant structure, enabling richer scientific documentation. Furthermore, the use case identifies opportunities to support multiple data formats (e.g., NetCDF), incorporate "loose" or contextual metadata via descriptive fields, and handle varied file extractions. These explorations suggest a path toward broader interoperability between GeoCroissant and existing domain-specific metadata standards, while supporting automated tooling for scalable metadata generation. ### **Key Properties in Use:** -+----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| GeoCroissant Property | Notes | -+========================================+=================================================================================================================================================================================================================================================================+ -| `geocr:multiWavelengthConfiguration` | Structured GeoCroissant property (typed as `geocr:MultiWavelengthConfiguration`) that captures the set of wavelength channels (e.g., via `geocr:channelList`) to simplify authoring and support subsequent mapping to SPASE | -+----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| GeoCroissant Property | Notes | +|---|---| +| `geocr:multiWavelengthConfiguration` | Structured GeoCroissant property (typed as `geocr:MultiWavelengthConfiguration`) that captures the set of wavelength channels (e.g., via `geocr:channelList`) to simplify authoring and support subsequent mapping to SPASE | | `geocr:solarInstrumentCharacteristics` | Structured GeoCroissant property (typed as `geocr:SolarInstrumentCharacteristics`) that captures observatory/platform and instrument identifiers (e.g., `geocr:observatory`, `geocr:instrument`) to simplify authoring and support subsequent mapping to SPASE. | -+----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 2: Interoperability with other standards** @@ -846,47 +822,29 @@ This use case addresses the need for interoperability between the GeoCroissant m The table below demonstrates a mapping between commonly used metadata fields in STAC, GeoCroissant, and GeoDCAT. This mapping enables metadata interoperability, facilitates automated format conversion, and supports integration with existing data catalogs, search engines, and metadata brokers. -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| STAC field | GeoCroissant field | External vocabulary field | -+===================================+===========================================================+======================================================+ -| id | @id | N/A | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| type | @type | N/A | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| title | name | dcat:title | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| description | description | dcat:description | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| datetime (or properties.datetime) | \- | schema:temporalCoverage, dct:temporal | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| geometry | \- | geosparql:hasGeometry, geosparql:asWKT | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| assets | distribution | dcat:distribution | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ -| eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | -+-----------------------------------+-----------------------------------------------------------+------------------------------------------------------+ +| STAC field | GeoCroissant field | External vocabulary field | +|---|---|---| +| id | @id | N/A | +| type | @type | N/A | +| title | name | dcat:title | +| description | description | dcat:description | +| datetime (or properties.datetime) | \- | schema:temporalCoverage, dct:temporal | +| bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | +| geometry | \- | geosparql:hasGeometry, geosparql:asWKT | +| assets | distribution | dcat:distribution | +| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | +| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | +| proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | +| gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | +| eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | ### **Key Properties in Use:** -+--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Property | Purpose | -+====================================================================+==============================================================================================================================================================================================================================================================+ -| `geocr:coordinateReferenceSystem` | Specifies the dataset CRS/projection (e.g., EPSG code) to ensure consistent spatial referencing and interoperability across geospatial tools and standards. | -+--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| `geocr:spatialResolution` | Captures the dataset’s nominal spatial resolution (e.g., ground sampling distance) to support discovery, interoperability, and ML-readiness. | -+--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | +|---|---| +| `geocr:coordinateReferenceSystem` | Specifies the dataset CRS/projection (e.g., EPSG code) to ensure consistent spatial referencing and interoperability across geospatial tools and standards. | +| `geocr:spatialResolution` | Captures the dataset’s nominal spatial resolution (e.g., ground sampling distance) to support discovery, interoperability, and ML-readiness. | | `geocr:bandConfiguration (value typed as geocr:BandConfiguration)` | Describes raster band organization and semantics (e.g., band count and ordered band names) to support interoperable use of multi-band imagery. Spectral descriptors are represented separately via geocr:spectralBandMetadata (typed as geocr:SpectralBand). | -+--------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 3: Programmatic Metadata Access (OGC APIs)** @@ -1007,11 +965,9 @@ Below is an example JSON response from a `/records` endpoint showing how GeoCroi ### **Key Properties in Use:** -+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ -| Property | Purpose | -+========================+===============================================================================================================================================+ +| Property | Purpose | +|---|---| | `geocr:recordEndpoint` | Declares the OGC API – Records endpoint (e.g., /records) where the dataset’s metadata records can be programmatically retrieved and filtered. | -+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 4: Search and Discovery - GeoSPARQL** @@ -1021,17 +977,12 @@ To complement GeoSPARQL reasoning, GeoCroissant introduces `geocr:spatialIndex` ### **Key Properties in Use:** -+-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| Property | Purpose | -+=========================+=====================================================================================================================================================+ -| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | -+-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | -+-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | -+-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ -| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | -+-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | +|---|---| +| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | +| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | +| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | +| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | ***Note: Refer to Appendix C for examples showing querying in GeoCroissant format using GeoSPARQL.*** @@ -1260,13 +1211,10 @@ RAI fields such as `rai:dataCollection`, `rai:dataCollectionType`, `rai:dataUseC ### **Mapped RAI Attributes** -+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Property | Purpose | -+==========================+=====================================================================================================================================================================================+ -| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | -+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Property | Purpose | +|---|---| +| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | | `geocr:samplingStrategy` | Describes how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria), enabling reproducible dataset creation and interpretation of training data. | -+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## **Use case 7: Support for Time-Series Data** @@ -1398,18 +1346,17 @@ Example notebook recipes demonstrating GeoCroissant usage are available on the M # **References** -1. https://docs.mlcommons.org/croissant/docs/croissant-spec.html\ -2. Riccardo Albertoni, David Browning, Simon J D Cox, Alejandra Gonzalez Beltran, Andrea Perego, and Peter Winstanley. Data catalog vocabulary (DCAT) - version 3. https://www.w3.org/TR/vocab-dcat-3/, 01 2024.\ -3. schema.org. Schema.org v26.0.https://github.com/schemaorg/schemaorg/tree/main/data/releases/26.0/, 02 2024.\ -4. Ramanathan V Guha, Dan Brickley, and Steve Macbeth. Schema. org: evolution of structured data on the web. Communications of the ACM, 59(2):44–51, 2016.\ -5. Frictionless Working Group. Data packages \ -6. W3C Working Group. CSV on the web: A primer. https://www.w3.org/TR/\ - tabular-data-primer/,\ -7. \ -8. \ -9. \ -10. [GeoCroissant- A Metadata Framework for Geospatial ML-ready Datasets](https://www.grss-ieee.org/events/geocroissant-a-metadata-framework-for-geospatial-ml-ready-datasets/)\ -11. Akhtar, M., Benjelloun, O., Conforti, C., Foschini, L., Giner-Miguelez, J., Gijsbers, P., Goswami, S., Jain, N., Karamousadakis, M., Kuchnik, M. and Krishna, S., 2024. Croissant: A metadata format for ml-ready datasets. *Advances in Neural Information Processing Systems*, *37*, pp.82133-82148.\ +1. https://docs.mlcommons.org/croissant/docs/croissant-spec.html +2. Riccardo Albertoni, David Browning, Simon J D Cox, Alejandra Gonzalez Beltran, Andrea Perego, and Peter Winstanley. Data catalog vocabulary (DCAT) - version 3. https://www.w3.org/TR/vocab-dcat-3/, 01 2024. +3. schema.org. Schema.org v26.0.https://github.com/schemaorg/schemaorg/tree/main/data/releases/26.0/, 02 2024. +4. Ramanathan V Guha, Dan Brickley, and Steve Macbeth. Schema. org: evolution of structured data on the web. Communications of the ACM, 59(2):44–51, 2016. +5. Frictionless Working Group. Data packages +6. W3C Working Group. CSV on the web: A primer. https://www.w3.org/TR/tabular-data-primer/, +7. +8. +9. +10. [GeoCroissant- A Metadata Framework for Geospatial ML-ready Datasets](https://www.grss-ieee.org/events/geocroissant-a-metadata-framework-for-geospatial-ml-ready-datasets/) +11. Akhtar, M., Benjelloun, O., Conforti, C., Foschini, L., Giner-Miguelez, J., Gijsbers, P., Goswami, S., Jain, N., Karamousadakis, M., Kuchnik, M. and Krishna, S., 2024. Croissant: A metadata format for ml-ready datasets. *Advances in Neural Information Processing Systems*, *37*, pp.82133-82148. 12. Jain, N., Akhtar, M., Giner-Miguelez, J., Shinde, R., Vanschoren, J., Vogler, S., Goswami, S., Rao, Y., Santos, T., Oala, L. and Karamousadakis, M., 2024. A Standardized Machine-readable Dataset Documentation Format for Responsible AI. *arXiv preprint arXiv:2407.16883*. ## **Appendix A - Installation** @@ -1428,36 +1375,31 @@ This appendix summarizes responses from the GeoCroissant user adoption survey an ### **Rating scale** -- Very important = 5\ -- Important = 4\ -- Neither important nor unimportant = 3\ -- Unimportant = 2\ +- Very important = 5 +- Important = 4 +- Neither important nor unimportant = 3 +- Unimportant = 2 - Very unimportant = 1 ### **Summary of responses** Overall, most spatial machine learning dataset fields received an average rating of **“Important.”** No spatial or non-spatial fields were rated **“Very unimportant.”** Across both spatial and non-spatial metadata, **description** was consistently identified as the most important field. Respondents noted that the description provides critical context required to interpret and responsibly use a dataset, including information on provenance, background, assumptions, and limitations (Refer table below). -+---------------+-------------------------------------------+-------------------------------------------+ -| Rank | Top five most important ML fields | Top five most important Geospatial fields | -+===============+===========================================+===========================================+ -| 1 | Description | Description | -+---------------+-------------------------------------------+-------------------------------------------+ -| 2 | License | Sensor (e.g., optical, thermal) | -+---------------+-------------------------------------------+-------------------------------------------+ -| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | -+---------------+-------------------------------------------+-------------------------------------------+ -| 4 | Name | Distribution (file representation/format) | -+---------------+-------------------------------------------+-------------------------------------------+ -| 5 | URL | Model category (e.g., classification) | -+---------------+-------------------------------------------+-------------------------------------------+ + +| Rank | Top five most important ML fields | Top five most important Geospatial fields | +|---:|---|---| +| 1 | Description | Description | +| 2 | License | Sensor (e.g., optical, thermal) | +| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | +| 4 | Name | Distribution (file representation/format) | +| 5 | URL | Model category (e.g., classification) | : Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. ![](data:image/png;base64,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)\ **Figure: Summary of mean importance ratings from the GeoCroissant user adoption survey.** -Together, these figures report the mean importance (1–5, excluding NA) assigned by respondents to ML and geospatial metadata fields. ML respondents prioritized core reuse and access metadata—especially **license** and **distribution**, followed by **name** and **URL**—while geospatial respondents emphasized GeoAI-critical context, ranking **description**, **sensor**, and **annotation type** highest. Overall, the results indicate that users most value metadata that clarifies dataset usability, legal reuse, and the geospatial/labeling characteristics needed to reliably integrate datasets into spatial ML workflows. +Together, these figures report the mean importance (1–5, excluding NA) assigned by respondents to ML and geospatial metadata fields. ML respondents prioritized core reuse and access metadata, especially **license** and **distribution**, followed by **name** and **URL**, while geospatial respondents emphasized GeoAI-critical context, ranking **description**, **sensor**, and **annotation type** highest. Overall, the results indicate that users most value metadata that clarifies dataset usability, legal reuse, and the geospatial/labeling characteristics needed to reliably integrate datasets into spatial ML workflows. ## **Appendix C - Examples showing querying on GeoCroissant Dataset** From e287eac125fed97000ce63f29d4f6e4e32e61773 Mon Sep 17 00:00:00 2001 From: Rajat Shinde Date: Tue, 20 Jan 2026 02:06:20 -0600 Subject: [PATCH 5/7] minor formatting updates for code blocks --- docs/croissant-geo-spec.md | 176 ++++++++++++++++++------------------- 1 file changed, 87 insertions(+), 89 deletions(-) diff --git a/docs/croissant-geo-spec.md b/docs/croissant-geo-spec.md index 0572fb8c3..86d47442b 100644 --- a/docs/croissant-geo-spec.md +++ b/docs/croissant-geo-spec.md @@ -74,11 +74,11 @@ This namespace IRI is generally abbreviated using the prefix: **geocr** In addition, this vocabulary relies on the following namespaces: -| Prefix | IRI | Description | -|---|---|---| -| sc | | The schema.org namespace | -| cr | | MLCommons Croissant base namespace | -| geocr | | GeoCroissant extension namespace | +| Prefix | IRI | Description | +|------------------------|------------------------|------------------------| +| sc | | The schema.org namespace | +| cr | | MLCommons Croissant base namespace | +| geocr | | GeoCroissant extension namespace | The GeoCroissant specification is versioned, and the version is included in the URI of this specification:\ **http://mlcommons.org/croissant/geo/1.0** @@ -130,13 +130,13 @@ While the Croissant format introduces a strong foundation for ML dataset metadat The table below summarizes representative geospatial dataset types, the complexities common to Earth observation (EO) data, and the areas where Croissant core does not prescribe geospatial conventions (e.g., CRS, resolution, modality, and band semantics). GeoCroissant addresses these gaps by extending Croissant with standardized, interoperable metadata constructs that improve discoverability, interoperability, and ML-readiness for scalable and responsible GeoAI workflows. -| Types of Geospatial Datasets | Issues in GeoAI datasets as compared to “generic” datasets | How does GeoCroissant (and Croissant) address these issues? | -|---|---|---| -| EO imagery (multi-band; optical/SAR) | Band semantics and modality-specific acquisition parameters | Standardize sensor/band descriptors and ML task metadata (Interoperability, ML workflow) | -| Spatiotemporal datasets (time series, in-situ, simulations) | Time indexing + spatiotemporal coverage consistency | Consistent temporal modeling and time-series support (Time-series support, Discovery) | -| Complex geo formats (NetCDF/HDF5/Zarr) | Nested variables, chunking, multiple assets per logical sample | Clear-mapping from raw containers to AI-ready datasets | -| Mixed geometry data (vector, raster, point clouds) | Heterogeneous geometry types and spatial reference handling | Uniform spatial semantics and discovery/query support | -| Human-labeled / crowdsourced GeoAI datasets | Sampling choices and spatial representativeness affect outcomes | Explicit provenance and spatial bias/sampling documentation based on Croissant RAI | +| Types of Geospatial Datasets | Issues in GeoAI datasets as compared to “generic” datasets | How does GeoCroissant (and Croissant) address these issues? | +|------------------------|------------------------|------------------------| +| EO imagery (multi-band; optical/SAR) | Band semantics and modality-specific acquisition parameters | Standardize sensor/band descriptors and ML task metadata (Interoperability, ML workflow) | +| Spatiotemporal datasets (time series, in-situ, simulations) | Time indexing + spatiotemporal coverage consistency | Consistent temporal modeling and time-series support (Time-series support, Discovery) | +| Complex geo formats (NetCDF/HDF5/Zarr) | Nested variables, chunking, multiple assets per logical sample | Clear-mapping from raw containers to AI-ready datasets | +| Mixed geometry data (vector, raster, point clouds) | Heterogeneous geometry types and spatial reference handling | Uniform spatial semantics and discovery/query support | +| Human-labeled / crowdsourced GeoAI datasets | Sampling choices and spatial representativeness affect outcomes | Explicit provenance and spatial bias/sampling documentation based on Croissant RAI | ## **GeoCroissant** @@ -148,7 +148,7 @@ Below is an illustrative example of GeoCroissant metadata for a representative G Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging Face: ). -``` +``` json { "@context": { "@language": "en", @@ -304,19 +304,18 @@ Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). -| # GeoCroissant Use Case | # GeoCroissant Properties | # External Vocabulary Properties | # Croissant Core Properties | # Schema.org Properties | -|---|---|---|---|---| -| **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg,\ -| | | stac:gsd | | sc: GeospatialGeometry, sc:spatialCoverage | -| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics \(with geocr:channelList, geocr:observatory, geocr:instrument\) | spase:MeasurementType,\spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | -| **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | -| **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | -| **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | -| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI_EOTask\(OGC Training DML\) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | -| **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | -| **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | -| **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | -| **Use case 9: Caching AI-ready transformations of large geospatial data** | \- | | cr:transform, cr:extract, cr:FileSet / cr:FileObject | sc:encodingFormat, sc:contentUrl | +| \# GeoCroissant Use Case | \# GeoCroissant Properties | \# External Vocabulary Properties | \# Croissant Core Properties | \# Schema.org Properties | +|---------------|---------------|---------------|---------------|---------------| +| **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg,\\ | | | +| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType,\spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | +| **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | +| **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | +| **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | +| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI_EOTask(OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | +| **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | +| **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | +| **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | +| **Use case 9: Caching AI-ready transformations of large geospatial data** | \- | | cr:transform, cr:extract, cr:FileSet / cr:FileObject | sc:encodingFormat, sc:contentUrl | The concepts which cannot be cleanly expressed using existing, widely adopted vocabularies are introduced as GeoCroissant (geocr:) properties. Below, we provide concise definitions and illustrative examples for each GeoCroissant property introduced in this specification grouped by specific geospatial metadata. @@ -330,7 +329,7 @@ Range: `sc:Text`\ Cardinality: ONE\ Example: -``` +``` json { "@type": "Dataset", "name": "Example dataset", @@ -347,7 +346,7 @@ Cardinality: ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (dataset-level resolution)", @@ -357,7 +356,7 @@ Example: Dataset-level Example: Data-level (spatial resolution varies per record, for eg. [Harmonized Landsat and Sentinel-2 Product](https://www.earthdata.nasa.gov/data/projects/hls/spectral-bands)) -``` +``` json { "@type": "Dataset", "name": "Example dataset (data-level resolution)", @@ -392,7 +391,7 @@ Cardinality: MANY Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (dataset-level spatial index)", @@ -402,7 +401,7 @@ Example: Dataset-level Example: Record-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (data-level spatial index)", @@ -439,7 +438,7 @@ Cardinality: ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (dataset-level band configuration)", @@ -453,7 +452,7 @@ Example: Dataset-level Example: Data-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (field-level band configuration)", @@ -518,7 +517,7 @@ Cardinality: MANY Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (dataset-level spectral band metadata)", @@ -540,7 +539,7 @@ Example: Dataset-level Example: Data-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (field-level spectral band metadata)", @@ -607,7 +606,7 @@ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset with an API records endpoint", @@ -626,7 +625,7 @@ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (spatial bias)", @@ -643,7 +642,7 @@ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (sampling strategy)", "geocr:samplingStrategy": "512×512 chips centered on burn polygons; cloudy scenes removed."} ``` @@ -659,13 +658,13 @@ Example: `"geocr:temporalResolution": { "@type":"QuantitativeValue","value":1,"u Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (dataset-level temporal resolution)", "geocr:temporalResolution": { "@type": "QuantitativeValue", "value": 1, "unitText": "month" }} ``` Example: Data-level -``` +``` json { "@type": "Dataset", "name": "Example dataset (record-level temporal resolution)", @@ -700,7 +699,7 @@ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example dataset", @@ -741,7 +740,7 @@ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example Space Weather dataset (multi-wavelength configuration)", @@ -761,7 +760,7 @@ Cardinality: ZERO or ONE Example: Dataset-level -``` +``` json { "@type": "Dataset", "name": "Example Space Weather dataset (solar instrument characteristics)", @@ -811,9 +810,9 @@ Furthermore, the use case identifies opportunities to support multiple data form ### **Key Properties in Use:** -| GeoCroissant Property | Notes | -|---|---| -| `geocr:multiWavelengthConfiguration` | Structured GeoCroissant property (typed as `geocr:MultiWavelengthConfiguration`) that captures the set of wavelength channels (e.g., via `geocr:channelList`) to simplify authoring and support subsequent mapping to SPASE | +| GeoCroissant Property | Notes | +|------------------------------------|------------------------------------| +| `geocr:multiWavelengthConfiguration` | Structured GeoCroissant property (typed as `geocr:MultiWavelengthConfiguration`) that captures the set of wavelength channels (e.g., via `geocr:channelList`) to simplify authoring and support subsequent mapping to SPASE | | `geocr:solarInstrumentCharacteristics` | Structured GeoCroissant property (typed as `geocr:SolarInstrumentCharacteristics`) that captures observatory/platform and instrument identifiers (e.g., `geocr:observatory`, `geocr:instrument`) to simplify authoring and support subsequent mapping to SPASE. | ## **Use case 2: Interoperability with other standards** @@ -822,28 +821,28 @@ This use case addresses the need for interoperability between the GeoCroissant m The table below demonstrates a mapping between commonly used metadata fields in STAC, GeoCroissant, and GeoDCAT. This mapping enables metadata interoperability, facilitates automated format conversion, and supports integration with existing data catalogs, search engines, and metadata brokers. -| STAC field | GeoCroissant field | External vocabulary field | -|---|---|---| -| id | @id | N/A | -| type | @type | N/A | -| title | name | dcat:title | -| description | description | dcat:description | -| datetime (or properties.datetime) | \- | schema:temporalCoverage, dct:temporal | -| bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | -| geometry | \- | geosparql:hasGeometry, geosparql:asWKT | -| assets | distribution | dcat:distribution | -| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | -| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | -| proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | -| gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | -| eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | +| STAC field | GeoCroissant field | External vocabulary field | +|------------------------|------------------------|------------------------| +| id | @id | N/A | +| type | @type | N/A | +| title | name | dcat:title | +| description | description | dcat:description | +| datetime (or properties.datetime) | \- | schema:temporalCoverage, dct:temporal | +| bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | +| geometry | \- | geosparql:hasGeometry, geosparql:asWKT | +| assets | distribution | dcat:distribution | +| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | +| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | +| proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | +| gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | +| eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | ### **Key Properties in Use:** -| Property | Purpose | -|---|---| -| `geocr:coordinateReferenceSystem` | Specifies the dataset CRS/projection (e.g., EPSG code) to ensure consistent spatial referencing and interoperability across geospatial tools and standards. | -| `geocr:spatialResolution` | Captures the dataset’s nominal spatial resolution (e.g., ground sampling distance) to support discovery, interoperability, and ML-readiness. | +| Property | Purpose | +|------------------------------------|------------------------------------| +| `geocr:coordinateReferenceSystem` | Specifies the dataset CRS/projection (e.g., EPSG code) to ensure consistent spatial referencing and interoperability across geospatial tools and standards. | +| `geocr:spatialResolution` | Captures the dataset’s nominal spatial resolution (e.g., ground sampling distance) to support discovery, interoperability, and ML-readiness. | | `geocr:bandConfiguration (value typed as geocr:BandConfiguration)` | Describes raster band organization and semantics (e.g., band count and ordered band names) to support interoperable use of multi-band imagery. Spectral descriptors are represented separately via geocr:spectralBandMetadata (typed as geocr:SpectralBand). | ## **Use case 3: Programmatic Metadata Access (OGC APIs)** @@ -854,7 +853,7 @@ When a GeoCroissant dataset exposes its record-level metadata through an OGC API Below is an example JSON response from a `/records` endpoint showing how GeoCroissant-style metadata can be represented in a **GeoJSON FeatureCollection**, making it suitable for direct spatial querying and client-side rendering. -``` +``` json { "@context": { "@language": "en", @@ -965,8 +964,8 @@ Below is an example JSON response from a `/records` endpoint showing how GeoCroi ### **Key Properties in Use:** -| Property | Purpose | -|---|---| +| Property | Purpose | +|------------------------------------|------------------------------------| | `geocr:recordEndpoint` | Declares the OGC API – Records endpoint (e.g., /records) where the dataset’s metadata records can be programmatically retrieved and filtered. | ## **Use case 4: Search and Discovery - GeoSPARQL** @@ -977,12 +976,12 @@ To complement GeoSPARQL reasoning, GeoCroissant introduces `geocr:spatialIndex` ### **Key Properties in Use:** -| Property | Purpose | -|---|---| -| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | -| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | -| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | -| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | +| Property | Purpose | +|------------------------------------|------------------------------------| +| `geocr:spatialIndex` | Stores precomputed spatial index tokens (e.g., DGGS/H3/geohash-like keys) for scalable coarse spatial filtering prior to exact geometry operations. | +| `geosparql:hasGeometry` | Links a dataset/record to a GeoSPARQL geometry node to enable spatial predicates (e.g., intersects, within). | +| `geosparql:asWKT` | Encodes geometry as WKT (typed literal) for standardized GeoSPARQL queries. | +| `cr:recordSet` | Exposes record-level (atomic) metadata entries that can be individually queried and filtered. | ***Note: Refer to Appendix C for examples showing querying in GeoCroissant format using GeoSPARQL.*** @@ -1003,7 +1002,7 @@ print(dataset.metadata.to_json()) Output- -``` +``` json {'@context': {'@language': 'en', '@vocab': 'https://schema.org/', 'column': 'ml:column', 'data': {'@id': 'ml:data', '@type': '@json'}, 'dataType': {'@id': 'ml:dataType', '@type': '@vocab'}, 'extract': 'ml:extract', 'field': 'ml:field', 'fileProperty': 'ml:fileProperty', 'format': 'ml:format', 'includes': 'ml:includes', 'isEnumeration': 'ml:isEnumeration', 'jsonPath': 'ml:jsonPath', 'ml': 'http://mlcommons.org/schema/', 'parentField': 'ml:parentField', 'path': 'ml:path', 'recordSet': 'ml:recordSet', 'references': 'ml:references', 'regex': 'ml:regex', 'repeated': 'ml:repeated', 'replace': 'ml:replace', 'sc': 'https://schema.org/', 'separator': 'ml:separator', 'source': 'ml:source', 'subField': 'ml:subField', 'transform': 'ml:transform', 'geocr': 'http://mlcommons.org/croissant/geo/', 'cr': 'http://mlcommons.org/croissant/', 'dct': 'http://purl.org/dc/terms/', 'version': '1.0'}, '@type': 'sc:Dataset', 'name': 'Example_GeoCroissant_Dataset', 'description': 'An example dataset following the GeoCroissant format.', 'url': 'https://example.com/geocroissant', 'distribution': [{'@type': 'sc:FileObject', 'name': 'satellite_image', 'contentUrl': 'https://example.com/image.tif', 'encodingFormat': 'image/tiff', 'sha256': 'your_checksum_here'}]} ``` @@ -1211,9 +1210,9 @@ RAI fields such as `rai:dataCollection`, `rai:dataCollectionType`, `rai:dataUseC ### **Mapped RAI Attributes** -| Property | Purpose | -|---|---| -| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | +| Property | Purpose | +|------------------------------------|------------------------------------| +| `geocr:spatialBias` | Documents spatial representativeness limitations (e.g., geographic concentration, under-sampled regions/biomes) that may affect model generalization and evaluation. | | `geocr:samplingStrategy` | Describes how samples were selected or constructed (e.g., chip/windowing strategy, filtering criteria), enabling reproducible dataset creation and interpretation of training data. | ## **Use case 7: Support for Time-Series Data** @@ -1363,7 +1362,7 @@ Example notebook recipes demonstrating GeoCroissant usage are available on the M The "mlcroissant\[geo\]" is an optional /extra dependency package for mlcroissant that adds geospatial data processing capabilities. When you install "mlcroissant\[geo\]", you get additional functionality specifically designed for working with converters that convert your current metadata into geocroissant metadata format. -``` +``` shell !pip install mlcroissant[geo] # Installed through `pip install -e .[geo]` -- while development @@ -1385,14 +1384,13 @@ This appendix summarizes responses from the GeoCroissant user adoption survey an Overall, most spatial machine learning dataset fields received an average rating of **“Important.”** No spatial or non-spatial fields were rated **“Very unimportant.”** Across both spatial and non-spatial metadata, **description** was consistently identified as the most important field. Respondents noted that the description provides critical context required to interpret and responsibly use a dataset, including information on provenance, background, assumptions, and limitations (Refer table below). - -| Rank | Top five most important ML fields | Top five most important Geospatial fields | -|---:|---|---| -| 1 | Description | Description | -| 2 | License | Sensor (e.g., optical, thermal) | -| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | -| 4 | Name | Distribution (file representation/format) | -| 5 | URL | Model category (e.g., classification) | +| Rank | Top five most important ML fields | Top five most important Geospatial fields | +|----------------------------:|----------------------|----------------------| +| 1 | Description | Description | +| 2 | License | Sensor (e.g., optical, thermal) | +| 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | +| 4 | Name | Distribution (file representation/format) | +| 5 | URL | Model category (e.g., classification) | : Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. @@ -1405,7 +1403,7 @@ Together, these figures report the mean importance (1–5, excluding NA) assigne *Query 1: Finding GeoCroissant dataset by querying via GeoSPARQL Geometry* -``` +``` sql PREFIX geosparql: PREFIX geocr: PREFIX dct: @@ -1424,7 +1422,7 @@ WHERE { *Query 2: Discovering GeoCroissant Datasets by Exact Bounding Box Match* -``` +``` sql PREFIX geocr: SELECT ?dataset ?record ?bbox From f64aa95c10afbff57598d12de910e13c57a83f6f Mon Sep 17 00:00:00 2001 From: Rajat Shinde Date: Tue, 20 Jan 2026 02:25:22 -0600 Subject: [PATCH 6/7] minor formatting, update figures --- docs/croissant-geo-spec.md | 15 +++++++++------ docs/images/croissant-geo-user_survey1.png | Bin 0 -> 45771 bytes docs/images/croissant-geo-user_survey2.png | Bin 0 -> 52858 bytes 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 docs/images/croissant-geo-user_survey1.png create mode 100644 docs/images/croissant-geo-user_survey2.png diff --git a/docs/croissant-geo-spec.md b/docs/croissant-geo-spec.md index 86d47442b..9f8f61dd1 100644 --- a/docs/croissant-geo-spec.md +++ b/docs/croissant-geo-spec.md @@ -304,14 +304,14 @@ Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). -| \# GeoCroissant Use Case | \# GeoCroissant Properties | \# External Vocabulary Properties | \# Croissant Core Properties | \# Schema.org Properties | +| GeoCroissant Use Case | GeoCroissant Properties | External Vocabulary Properties | Croissant Core Properties | Schema.org Properties | |---------------|---------------|---------------|---------------|---------------| | **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg,\\ | | | -| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType,\spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | +| **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType, spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | | **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | | **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | | **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | -| **Use case 5: ML Pipeline Integration** | \- | tdml-ai/: AI_EOTask(OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | +| **Use case 5: ML Pipeline Integration** | \- | tdml-ai: AI_EOTask(OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | | **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | | **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | | **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | @@ -831,8 +831,8 @@ The table below demonstrates a mapping between commonly used metadata fields in | bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | | geometry | \- | geosparql:hasGeometry, geosparql:asWKT | | assets | distribution | dcat:distribution | -| assets\[\\].href | distribution\[\].contentUrl | schema:contentUrl | -| assets\[\\].type | distribution\[\].encodingFormat | schema:encodingFormat | +| assets\[\\].href | distribution\[ \].contentUrl | schema:contentUrl | +| assets\[\\].type | distribution\[ \].encodingFormat | schema:encodingFormat | | proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | | gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | | eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | @@ -1394,7 +1394,10 @@ Overall, most spatial machine learning dataset fields received an average rating : Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. -![](data:image/png;base64,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)\ +![Survey of Geo-AI datasets properties based on geospatial and ML fields.](images/croissant-geo-user_survey1.png 'GeoCroissant Survey 1') + +![Survey of Geo-AI datasets properties based on geospatial and ML fields.](images/croissant-geo-user_survey2.png 'GeoCroissant Survey 2') + **Figure: Summary of mean importance ratings from the GeoCroissant user adoption survey.** Together, these figures report the mean importance (1–5, excluding NA) assigned by respondents to ML and geospatial metadata fields. ML respondents prioritized core reuse and access metadata, especially **license** and **distribution**, followed by **name** and **URL**, while geospatial respondents emphasized GeoAI-critical context, ranking **description**, **sensor**, and **annotation type** highest. Overall, the results indicate that users most value metadata that clarifies dataset usability, legal reuse, and the geospatial/labeling characteristics needed to reliably integrate datasets into spatial ML workflows. diff --git a/docs/images/croissant-geo-user_survey1.png b/docs/images/croissant-geo-user_survey1.png new file mode 100644 index 0000000000000000000000000000000000000000..55c1b9851d189b6bb01f137d8fd8107308a1d777 GIT binary patch literal 45771 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
    CbUgFF{;MVpqnn2>D7jwLL)tA;BXK}= zT_!dOgocuaYVI(js}`m;f`N9LRelhHQ0lOfs&YdoP0D)w7(zjt)(DK3=JC`f5S4sf zvOv2$mB_PaU$uJ(lubniik794asSwD-sjr(5Vw+Sv9CsvtP*SjM%6$EPsu}~8*>E^ zpA=J>0jAFpWy;lCf;YMgsX>+-H{xFrfE&13;erS7n37O7Y4^+;?s<3*Vy}J0dEXfq z_d;&@rx4WodE7@X6B=)XsfQn|!5dnRs-nklza94S^7Zqh?hXnfAM@1CO#a3bfq_)c zjF9XlZ%7m?LJMsDx-YfVrhT zJ(GyB%EF<$jt)CcXR#Npbo6)-Gd4OIOUjH}u;R~VmA}akG7zHKK~N4$O*^_X<%2En zBhuPR@$QWqH8clV1A0K&@Tjd{>Y11ny?P~krV&x0hiyS2# zI+Mu7Myw(;GX?vm41rbJ{!MYW+saV?yQ`H$(j2yJ`yFr9GCTHPc1se?EKj)nzz%4{ zP`zdcwQVqX zsaxL1VfGrb{d$lCpFgHpYki2!YCfHdOB*c;Vk)*ds{P3M8zuzWIFAB&xFqX|Fj@8U z9a;(SLIjV(#2Bn~lyox8G*Wvq_K4fW?sC0;(TX?phC7xN7oTa}vs+gdh1djTo`_w4 zE_6D6D|%%cs33kVEfFDtVVB7_WD!XOUH}G#wF(9eu5VH|9p8u}_NTkF+rHgjeE*p< zLypTNEZV+3N_Qw!Be)fwDdCE#JbB{8$I8lQ8=^QtsCI?nd*6I{tQXIp*Ntud@-{WH zDjGT{mra1+jseYW1 zaqI5g*RNjPm>5j@`9F1{x071$^#1ViuFFt@Q|P2d+R?L^!xAQ18Krus9bg= z@$mDHkvmz*Ep)^c#wh6Nxk%zz3V@w2tG_QEG0c)$%^RaLd(%E||5C)RC4 z2E=Rk9xldW2e;fb(M;*(lP63T+DIqz&VQH9CdfzrkFYy|f;`X-rL3F~i3_3)>qU&Z z$u0A_Aa2a%;)$dReoE^&I$d^5KK>tL3Q)<5-o158C%BQJii zrj6h+utdoo`!=hnk#s~iM4>h#TE;lWbaOUpSFX&w1~WDW>U)Ol z*sl8@u?`n zS%6?CU)qe{{Kzc9D1`ovv-pwwCksGy_*8CBfMnRCv-4tLUeJntMaMx&07>nRfWXdO zIiQu%MX0Dw8G77IT0F}8Q7n69fT_!a_q9|r&7d55Vvi0&kqG+FTemW>YD8rukm^mr z&SO)jPR8lUx^w6J365XF2H52gMY4H}VbiQXzP{ z3$Lfj=MB0;ox_6hNu)is$hCI%NJy%$>KZxhZ6Qic<#3kR(EDP@!dRk=Q8!v!*Houg^Fu` zwyB;oEC`MgUSY{rs5ekY&lxR7YsU@5pyC+Q+eO_SdA-bV;TkBHBc_mMRv^?uF_IJf zD9xnDuM>FCbHS<(g@l;4hGBxIyk(wMjd}^!Z(e>rIVn5sdW57gj3CTRa9-ylWT8ne zwwOI~w|#0y$gyL`C^CVcsi}Yu9M%q{1LX)0uAoiMW09kE%9JStP)C8aSVEBI+8ME0 zp}v6DVm#CVX1KQKk3vlV`+Dxvw2GtZBbWrVugZsvJQ~pbz__g*Pd?akJCeE2&M4fF zdvw@*OpS#Xw}FSj3{V3CLsd`Q67cC-)JGYuIdk@b&A|4vPk!&EJwTfnfsyESwn(!U zhZT1LYxyH_HQCIRK%7^@8m5t>iQ13bu%M)flAAq?U2atEL#qak>(C@WwM;v*vuSkaX*ViZX}Z7O*!eKoe@@&p*8C*hc67yzj9 zP#s%56{Iy#UJ&B=Dx6StFK=(;5fk=4fQ)l|a}yMoKe#Rm9`6)|gIhzn#QjeQv4aSQ zq1ieUys(YoVcLp zxn;5j&RQTTs%vb728{DKP(?Yz(aos4_-jc*Kb;m*oFMeYWKBY>+s)^Z!(j657}W9p*FduM9d{0(@zk!)QQvsA1=@;=VXkO* zw5bOUFqy5Xu~E?j#Fi;%^(bxu(KE8Mg(10n9}Jvi`O4J&dw)tc2??%Q#J&yOVwhwk zG}$2dnj^MjFcwBna^~RQ_V7g?&1%OeD9o^yetd&Oc6tIt0TP-7BC?904auFdy$7d` zG>)3{;jmXDKcfe~vpH{_wY5^e9$cVzY>MGBT|kqC%H85(taVZRG;}tUBZO599V#U4 zUo9e6b`yI^wZdTT9KP1WH$J$oRm5pCk%4?C`$BB&j9B4x+bTP*px`^gUmV;TJ zA+C+TANRODYevuE;-WM%k&?YVlh)mgz!mfe7|_Azj5xd1%8W>J@ODmo<2##w&z2V# z9jb9DSIH#c2<tz@?(nSYO}TQWjEN`5L6sPj|NIW-2^_k4Qbz zbU51~MLL6rcd3JWU>ogD#7hBo!w0t$;=5h5gE}Xf&RH#dPcbdS|5xYQvR5MBr z9Ru|u7&lK0hgsx(Ccn}IT{qgb@9!$ofwaT(q(eXURhz5*vE#WJ9bUnhvJ7cg9$M{- z<3FUMtK$tL>OC}t6N+um-S8&j{P_kqza3W+5{TmE*Lw5_tXsYrB`@v2yvMk}7cnz} zxNMu3jDp~Em7#g&7(uWsNEE?;kt;w2Ifcv@Z+hIM!O=>amXEUR=}XF*ShZ2XXYUYn z!u`x#md-KD>VR~1A6@CJq1rf&(p^bw(&2Vueq{U>Q36Nl$71i@n=49p;A8Unf)>Y| zydRw$oGyzGd8uB{H8=#Y+TY6i3|Rdmt!lq|DRmW9{ZZuvHQ#If4S|X{n94nPub{u5 z7)&KKm5E424N7l*>^2>1P|HbErjS(jRPT_-xqjHY2m}7Mp1z5B(u+S0gB<#TDh23- z1@P-{gNCZ7Zr-xx4EUwueU@QPM#i}$kiv77mq+l}-c30xHe`DFR=wVym}?KQozV-F zQ*pn0^v*-PvdfX)7TVE;y3tBNc@TMdY%>>v#=v^kIhUL-~ z_XKDi$kW;hfp+(jfpQ|={Y=gTI%oqNDB2%}c@ecnkc^IW4A_sY}pD7vNPUScp~@ zj-bMryNPkTf)$*=Rn$-PL~NY3n>V*%n!%`!r4iwfB~tcxiRPtX>8DSBhVWp=Y58IG`sR4KYl!M@}%&EDq6bjq@=xHf>f<=Z3nC> z8vI3PR-b~(zIOGhFzE}i9XcUQ-+<2sK8O2gt}`>+rx_X-rxujjyH_t423oiZCVQ|< z#v9WtMW8q!R=4};YT^|xf(~(~XlpYz4n^FxBn=nOAEHwF^P7avvGzte_UX{RF&m-_14dO z2?`u{)}_Gp?Pb!O2tj;@Q}a{_Yt1`1E0zf9xu_0sGruHrfSrQy; z&n;9S5$?rJwx3Ler%9yg5J+GAo7bOQ{K(&3?J~wcg@@L*>w)l}MdI~+lq`h?OQhW7 zFHX78Cpo8*p6K1qxzKaPH-R%O&-8l77S*8SyvW zsNX9AN__r-(Y}Xv29gju6lm~qTH5vR`v1xuCpklPUs@SXru6ZpA3o?;k!3*rSUvIF zv6)tjbam$L0OqC|C^%EbDFzKgi_BF^@eM=o%zF3iB{Yn0wYP0O)hqF4*($bh@ zx0#mFLmg7dg`W`oT&*zZ=uv^!WPY;Sik&-SiKvTaDHE1MR1H1g<%<_3306rF1;U;& zefsU_Xtg{rC_FMu5_Gtgm{r*r*#aL9IEN`#XicKFySmO;=6wsn1wNAAp28$Xz-s+q zCKjvV6{j&_e}cRtuG6bR^DtcSNpp$=@YHn-xE=px#5TbzePgW_@GJNXaLMl74>&_H z#C@Zo(U;x<+mP82+mW|WImSBz6f*vgPjbBaY1%VoyK&`v`Y{e@;1zKQs?%|-En`OA!q z;z-!3RI;_R<2-E>cNau1zB{0VKzf8In{hY4Qv>bVwF??Q*Pci=5a zDK=u_m!e1~J{Q)p1hkjH@*EyCF!9mR$Hk8_9y(e8dnrJTm=c|xn2?|@EBh7znlfp^ zgb7>?VeRKSL)kErgiyaik%aporru-XFQ#70M#EpWV_|^yhY_m72C4W+WPRpgHS%qKDZej zO^(2D4<@T+?LOS~{32KGeg5J#PW zWC+Vgn+euUHBPohJpC6p8IyjwM8+mG?@`~ux~9OPLWHQNr;+tw(g;BzcVs@;>l|nz ze`@f!H8ZJr)edbZZxFtEULi4@f@BQ+2mfG08Zl~=Fy-&topMl9p%p-{ym@mWI2oa( z5j`#uQiz3?Z2nDLXj$DEpgRT5$tsA$Oj`9={t;%j@$YQk>({F(t;q8e+(F7C?!-G@wW)U4noXZ=oaAiGJfxq(@h&XRaG-*!skTO7(T9nJH^!`dd$rB0rUy)B|ox_>*`^(<7P+t}nI#;{cF`H9U7qK@D(a8mh za;50MSPy(wpvRF)N^kBv$B;}a1d@8HcmFzYHtlh1{rsu(3New#pdbUcVb0X@cm_W# z=N3p#CZRmQZ73}dj^tzcq>}@D&HyCmG-6K7qVP6h#BGCXk^+3#(|9qq)Sjjf!&E7yRIWI6*X(I)1I|*>L$wZd(@{Kfsk-Q zDk%?-s+^gdLJ>>^5N!un2W=G4M+fIKYl43{G1hcZ2+W200>yfsBAQORfA(sFa(A5r z;siiW-U&Xcpx7fZ&P=N1pLbKtov0Ix_~( z69vNjmkzn!!G+$y*aQ-tq*>VeU}dyb|L*wH+Ug+x0`UM@vm)-eYN5C-k#funMV0H#3#n~!!!JXmuACwr65-a_k+7> z{v4Ht%1lcXSrqn%HDG|?*JPb5wl{sszMRYNcnjH(F)(soVsa%BDhaJ$;wU;+$L&Z3 zaiCiT5TK-7I$;Jf6OcEyE2e%&Y_oLV7fx87=g=op4~EM-Hw?M&KUwJZ8kXF=kGz%u zAL{>Dj*q){Up@NZ;mf&bN?Ejo868STP#L)raoG{qLJc-kYX@WHZhib0iHjjsKtkYhl&toVtK}8J) z?EcPI_`#o(zw;jjjA{rSRjTL^5C-DYtg4CN*i?6Gd!3qE<@%7LBZxzcinvvurH`D1 z8l8!`FvfF*U5UjLVU&A_#0AME^;^>Df{KengcA~Z6RoDA;EkW(E=H5M%l!aZyy&u1 zT;ZLS+7~-J49QK7ZtUXnuur3_&hpXcckR*h-7_a*@Sd+-^ELg9yIpY{Ju2e%h$Wk{ zV~-bj&%53uKWE8p<-&8a=g!KGGV)!R>~*)_g|1yCW_5S!I2lu)@|*a^%X23sR-59# zJ?-?dq#<*-zkhnsnd{q7voUfOhAb?YI~}ED?Uba6lO`=dmU!^syG?@kfLjsy-lGjs zoOBZ?@^8(ck_YgmYO*m|(JOS4d)TWAJAV8@hZQSl@+fDnCVvAp;MG-8+B1c$UohMK z9v(H(9iL1)gtOAYL8kT!Y)9FL4}yff5a?CVM8bv(l7xna$L+>KQ^2=`(sCM%-50DF zj2d0R#z|x)9l0(pthoxIiGTg91@!r`B)GYGy z=i=gmHq#sZRD1vp03_f|gqFzA;Vl?9JzGK;P!n$mqX*#uHesjgdRraL7DA8V>SIlv zIVr5HDuJA|)oyZ!UBB)FWT^B*JOQZMLA}9|OgP>waq!quxxMGr=NegAUGnyxk1!99KD{UD19@NYTERpkls{U9qQGUi zTSK}IAD%T09&fjGD{P>)g~f2w5J>MKLmu804jIQte!dMhHbPW>7uV(ZwTBGZvUcr* z+#!AY*5lkl({*^qIzon#84xm>eGYcsDti>&1lkykH@9}WRo`zK;$x03rRzEQ(f+gs zVBSDp@KxNgdOBR<3_a;q^lj5z?W`_;6rZEu3(sWL^B}tKVMv{7-lFhK(iSWy4a$2N ze*U~rUhreHeY(xs%v^go0O~99uRm7Z;i#l2UEwYq8a4B<5^Sf~XS;U&wwl)i{C4Tm z!Ry~WW!whB@+Tzk3qV$GYAOSRa%nr}s>+C?N0(p>Fg+YhoR^}gJPxYW<#gY4p1RUi z6%~P0>!w3iZw{RlFdI00vr15tRt>FE%JtKZ;6B1+yTUIO6`?~?1P*i)NqnUxNuGSv zZnK1>q?ni$Mn-CsHRKgk8W3y(=>Ka!OZVfJ-QiWg_QO{Tn4O7IK zTy6q-mxs9iB{e)}eEng-I7Z70gQFi@xQEU?C{^;++8QxF2Nbfv9H|;J4jI4?@C7Vp z(jaSoLvnz52Q)Qrs=LXB`cs-4+w;RRE2Mf`e6H#?i})WTfir=C2*1hxMGzI73!^b$ zME4c|@mH3UV2o{ZA!Iou>3a-VG(;s2Mj2)f{Gv|v#xL_Y3ZwY=HUj+io64)G?4WO< zpK>4ml7jlEq1I)xZN7Y2q&~ClV~`DqCwM*WWP7cTJM@_UXCc6cqMF>p#O?aEv)|j^ zJ9nf@`w6UXiv9vb1!skQfNL67ggX_n?M6;GA?Q9TN}=QVq=^$d6>HvnA&vg0s;ckQ zI&{wN%)J7x*U-?wfuDX2Y*|q8Nd+hk3m@?!j&-u@X59Vt*J{S1zWbdp(050VuLzBa z$t@~^`ygVi?8A`-%hfnIvMlt+ac1|zU-L96`vA>D^Px!t#;ociE`ByFte$4R z{)}c=IzpAn45H=|0FNd4<1QFQlY@}yCt`*fZS3vX)3Tz_?o2I6Xoy|C;BDlzL*35^ zu5m97zv+|R&G-+(9~NoTIQFsgH|x4w_;CxboVoFbF+fu9hs)gS=fC_BUkQ7W8r8`8 zwf#zh)CKsjXtU%0HNXECU-fT%gfDBOB{;uTyFtjecK;6UXMth>}>s0NhcxH`*dUQwY0>d<=b*HGtCedVzOfm z>OYa+;VaeUAO3mZE7OJQj%xntDV?Qyd^O3(65T?KFwJ>!OK~OCStsBSgZ*XR(6{_p;Sj?=zsWU9RI~{xTj+N zfaK1v7wO(pNFopsN$xstd*^R%?#lR))H~+vB+rg*uq_;wztd)0-lniVlyfyAf{E(0 zFg4MWfDvi-(mVF}=xMss{0`FFcl*BYcYvyfd=DJ#$Z^q_s7#)GIHw-$g5Hfm2yL*f zEV*GXWaq3ul#=q|MQQLfdNj==217Z}%#gDttjl}!=mWQ-!VdpGHfkMGns#)Wbu<0n zKJ73r+{2DbCkz*xGt+kHjyh_j-A#`L3!FsU0jrO~&s@u3EdsTtd_HkyUE3M z==OYZv-!Q{{4)2i07V1xq3ZV18MdR&x7%<}-?u3sqFQep$-S=WeeU$M)w}$}yKQT0 zu9XlIqDvk>-k<*)0fh|>{g$s@H*2Qt%Mgvl;UOEetTT9mB(^sx)X@WLkH1J?U}Zs zDQ8qTb-6G;1P^if@ppT4TYLse8@Lh_h@f>L+0^k@iI-CG)c{b8a0k=V zF4NN!U%PZ2qo&qyeN$9H7lEV$c`&8rAO%&#`#xuou<+(-V6hTyYfdlm*U`**=g)(G zum+*&A2~U9;^Lh7Dynwg7Ff?iAA_gZZBY0D>r-P>voSd(HFwt0@YJ6E3O6(N%X)$4 za);E_*>-Vd6&@NUJT*F73K?`x6jBthIDTQ6V9#x2_yBCwv3-%KjvH8d2bGrhBXGf7 zTHUev5gsEE`(ZjrzThl7bs9ZT) z179DO>VCd`kG2vs9E#DQWly}#rab09me$tQ$xp#q00qD@2Xp0OoHMvTM_AiN_9Uq; z=XVHv9d(Y*M}<=p)*qbRKN3NUVD<)z9GAa6fG5Sg*Olo9Uib7*nh!e+uL?x1DY~Gv z-0mB}AEJ94%Yq$19x0AVBzIENt-I~C*4A-u)@_D*ZMLxqPw+3@I#pnNni4x^j2kDb zq_oi9|3%8g$E7t#BT|yk6un`RS@U7H)vwMRp+Y18O{=U64I5u)Y^eik|t0CXBIN_7rfHnjXnIA&hkaJwc?{*tp}`>ldub8jYt89kmQ>ry5~lp*oL$Lzu&Y z@JvKbAs8plt=VTiCM6Gw+sNkrFfx|N;wdTF2Ad=C%a{d88jS{hlis`uUeIr(npy#2 zS&PDnt!Dh%!J&q7gUxK&@8}lF?P5WAV`3aYP$RmE9G_?ZclNBMk{1!QV!X|$ zup^+4*X4U*_<&3pzayQe{{Ht@)yF$EA37m*Ab2{s3iU7TQQ_Tf{2s^9(1J(iA79;7 z_-;cr!Y_|rn|?5`|MEWT)S!y@9P#h{5t9St*)3pRLYBU61Q0XGd~Z*M%9-t_(FM>b zYB-Q{+P@89lmu_))@1XIZ2=Umu5r&d7RBpAGz{_~J%qe-hbt=`m*=Kwt z80OKu%=`lDUtV60>j;?g@V0K~>F#LINwppKnnU)6j=p~Fu-+raj!oQyn;t;N@w#~~+# zDdW+?qjK$l7KrYtsjugmmvVU2)z+qGW*RJC&h#2p=f*LUF9rtY;b@AsOqXZBqrf3V z?ue=#_Y;wx9K~#Ep3|io6piQk{?tR9X=nr^#yRrm7xLGmEJHg*%K(XL-U`oVitLbM z2E`=3!L6HIA7m==VhH(p{`~U2dx4vWuW*2CT4`hi^)1|)oSEwCZfq0abp%a-NDA%g zC{bZ(*usn7n1K<)DxW%)@Aci2jIH#Jy&%vl7xBChH!b0;&&=%Ey*qh@5`n*}1~Y+l z&aE`GkceR2f)s@cWJ9F8?{{k61roH2R zgr%bxrSb|VCuHqfKYxEMdwx>p(D()f2*FyYIdsF)`KHs~xngI-%H4vQR$<5o+k3n( zoRZL9h0sOSaxhL*2cY0RUk(JrnDk2B$bHLC^)#ZN$MF|BhQ)?cMLju`EOsFy7Jl75Q zu#8L1ZtU=QGfvPyG43jE)D&#H2>$^MxV2cU^q;b#?-1ky&B8a)^$QI;gf#w;xxuzL zDpZ3_3=Lx;38)+P$O6`b?>@Cw38IEGhE9jX7Vxq9kGw%oRR_pnDjL2$n%VEA{)<_@ zPYuZR5oQQ;h2doSIN=?gJVEXPbHmrKu(yezzu+u(c9RZk zD~QU2Dv;?~Pym=BNNv&RnRk$@#kGbfkXcJ4{#I2jbj_;x^hppl0XcJHaS;Y6837zp z|Jk!MeAK^LV)t1po%RVZfS+@0o44qz!a}qPQ{CE{QBoGIKKxOj@<@VZzBgUN^XItF zLK71;YM+d%LAlLU1E7GM7Xk*`49-^m$YpXQKwa4Wgw6E4*SO&j*&PV5A&8tHs{xNF zyV7@JZ(?v8zL4)MQkQT#6`~O6zSWr+< zZ*of3i^cDALXwl0e(FRa-PLcsdn?8e*$Cdy1n2$1mST(xpQgY0WiZjRg2A#%2%+Ql zba8!})`#=JrHWMxb>niFKn+<@Fu7xet_|gWOmk*i1Uw(6p*KEoL7m>FO~NYy&vDwz zL{BNVy__5*;0`L{^>ua)RW3Ah$H^9j#R>>0!<&aMGc!}6`52`u!LUL3$oiCLiF5Q3 zgGHbLei~A-0VO~?%{_^;MRjoNC&->&Y#H02)AzGN@$5i*Y`<5CRbDlC(M7N4A9mQ; zArR7QT5n|)yD3-MHb~a%{Q04_L8%-1cH73RRONs;4mS?+B?|r*oEQ;M(<-mC$;M`d zzP_BnynVA6{C6de$W&rIy~-4N7EP}BCQ!8Cyg6NzL@J;!Lq+(Nk_+= z3)uF)Moptk#QRObbt#-ctb1|_3h&FyQQGN>&o(m)<3F`D2g-WUpCJC^(DM8AvDm3h zx=X-@s60%YPZ?;%L=Y({#6Kge{nyZ2*zVO1V{`iZjSF1h?Ci{gO$gY z(;Du~0SS!pd$ewqpi_E z+=_rCbv^||u$7k1{u-K)Fc7465w=Xgccd4N1x)*MLBwyRnUW|BIzr559D!>mVo@ngxNe*`(2YY3)&31Quz}U&%f< zpAZ6Xuw4$5u%9R9m z*d!o&CWB9yzRbN5UzJteb9fEfZ%R)hhO)DTk)Vhs@jVe4rs;iR=ZZIoP1mo#zzpA6 z;#>x$OE%Z(ZQK~i-9ZiEr9d=$T|$Ncy-c58$S9DE^K&_nIYiyo_QE-Xdbj!0WB_%p zGR3yBl?5Uue0xeh3?8Qd%qc`u#(O3%B%au6>sH@yuQSmrWo4o9n(=NI3;X{4;HC_| zp@JZZb1a!LYQ%_|H(qqurZP;WKzJ|jJP9C~CJDwPKFn{~REB=uT=&SmyrjJ1Ka!6t3R5|)PPM{ zaPSvW1Ow5@EnDUa$_tP&RFvz4>r9?x4wxs9@4@q1>TV$eCvZYo^FSk@wMZxBMc45j zs2aYPX>>SIx6g-X<|Dy5+^SYi&mEMfHmtVYqJIUX}?%>C#zU1g(gfrt9rgTMJHhX{V+S`D7jV?dE6Cyj zsPR{nY~^pG4p)$ur-Bkfu@dwM@N$I{XHo)p1WeO3)W5Vx#V4sgC_ScOyCm1Hf3&M;jgjoVnXo1h4>qQv06rY3t+@5 zL>?%o4@^g?A=Io1x5IIY!6{PdxsOs25g_M2vv|wPmf1VD@?KGW#V~UYEQh^DS4=2z z-)<6p`%ZLkZ`-v?gjGrHL^07rDND$t&%5>L<;!cFJ}6*TOKGrgfvt>jv%h?~1+Oid zgrrUDp7Dxli-<)}u{ePTCW~BYd;8!iHfO@a!}sn@>S=a1vw})8Jv;krW8;}g8~c3i zA%RF96VF$QA8J$KWa7y!Sh%p|C51vfF-8oAg6Oa0M`II4eIN3U-mW2kixeEXZb9YG9xxo(yyI4s-OtftJ?R$jd5AI<`h~^HIRU zMOKxTW)&157MmxX4{y%kTVy!gh%H6V)!o}KJlIO3NsB2opdhnnW;j0$*?siW-EKsA zG3Ck3-Cg6JkZb{^mf-G_g8G<~$R+a~_%Mw#+LQLBn?+{6H-7euh={yhYoj%;0Yqd) zA*UajQs};dcFjp1>j!#=L_KkB(*6LoE0&xn8)*tljn@-!OEaI~l!kkI&jDS# z{IONwP-K;BvZOrB9v$qj!E6N!i*Tk-qxT`(=TNVr*T2aAonIOALsR~5gCk%q{}sg2 b@oWFC;(0$OuWS%dnYnWo&Az6&X3zftJF8pz literal 0 HcmV?d00001 diff --git a/docs/images/croissant-geo-user_survey2.png b/docs/images/croissant-geo-user_survey2.png new file mode 100644 index 0000000000000000000000000000000000000000..223b0002cce6d74354cba4349f69fd26b84bed27 GIT binary patch literal 52858 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 mX8#}krT Date: Mon, 2 Feb 2026 16:17:56 -0600 Subject: [PATCH 7/7] Add license information --- docs/croissant-geo-spec.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/docs/croissant-geo-spec.md b/docs/croissant-geo-spec.md index 9f8f61dd1..1dfec9580 100644 --- a/docs/croissant-geo-spec.md +++ b/docs/croissant-geo-spec.md @@ -2,9 +2,7 @@ Version 1.0 -Status: Release Candidate - -Published: 01/20/2025 +Published: 01/29/2026 @@ -55,6 +53,10 @@ Acknowledgements - MLCommons Croissant Working Group - Open Geospatial Consortium (OGC) GeoAI Domain Working Group +[GeoCroissant](http://mlcommons.org/croissant/geo/1.0), [Croissant](https://mlcommons.org/croissant/1.1) © 2024–2026 by [MLCommons Association and contributors](https://mlcommons.org) is licensed under [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0/). + +Note: The CC BY-ND license was selected to facilitate widespread adoption and use of the Croissant specification while maintaining a canonical reference version. However, this license can raise questions around what downstream uses are permissible. MLCommons wants to assure all prospective users that they are free to remix and adapt the Croissant specification for their internal use. If users want to distribute something they have created based on or that adds to the specification, they can as long as the Croissant specification is referenced through a link (i.e., not incorporated directly) and the specification itself isn't changed. Remember to include the attribution. Don’t hesitate to reach out if you have any questions. + # **Introduction & overview** Croissant \[1\] is a metadata standard designed to describe datasets in a structured, machine-actionable way, improving how data is discovered, understood, and consumed by automated tools and AI/ML pipelines. Building on this foundation, GeoCroissant extends Croissant with GeoAI-specific concepts, including spatial and temporal extent, coordinate reference systems, tiling and grids, and geospatial assets to better support GeoAI and Earth observation (EO) workflows, where interoperability and precise geospatial context are essential. @@ -304,14 +306,14 @@ Sample GeoCroissant Metadata for the HLS Burn Scars GeoAI-ready dataset (Hugging The following table situates GeoCroissant terms within the broader metadata ecosystem by showing, for each use case, how GeoCroissant properties align with and complement existing vocabularies and standards (e.g., schema.org, Croissant core, and domain-specific ontologies). -| GeoCroissant Use Case | GeoCroissant Properties | External Vocabulary Properties | Croissant Core Properties | Schema.org Properties | +| GeoCroissant Use Case | GeoCroissant Properties | External Vocabulary Properties | Croissant Core Properties | Schema.org Properties | |---------------|---------------|---------------|---------------|---------------| | **Generic Geospatial Datasets** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration, geocr:spectralBandMetadata | dcat:bbox, stac:bbox, proj:epsg,\\ | | | | **Use case 1: SpaceWeather Datasets** | geocr:multiWavelengthConfiguration, geocr:solarInstrumentCharacteristics (with geocr:channelList, geocr:observatory, geocr:instrument) | spase:MeasurementType, spase:Observatory, spase:Instrument, spase:NumericalData | cr:description, cr:distribution, cr:Field | sc:description, sc:encodingFormat | | **Use case 2: Interoperability with other standards** | geocr:coordinateReferenceSystem, geocr:spatialResolution, geocr:bandConfiguration | dct:temporal (when mapping STAC datetime, etc.) | cr:distribution, cr:Field | sc:spatialCoverage, sc:temporalCoverage, sc:contentUrl, sc:encodingFormat | | **Use case 3: Programmatic Metadata Access** | geocr:recordEndpoint | FeatureCollection, Feature, geometry, bbox | cr:distribution, cr:description | sc:url, sc:locationCreated | | **Use case 4: Search and Discovery (GeoSPARQL)** | geocr:spatialIndex | geosparql:hasGeometry, geosparql:asWKT | cr:recordSet | — | -| **Use case 5: ML Pipeline Integration** | \- | tdml-ai: AI_EOTask(OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | +| **Use case 5: ML Pipeline Integration** | \- | tdml-ai: AI_EOTask(OGC Training DML) | cr:FileObject, cr:RecordSet, cr:Field | sc:encodingFormat, sc:name | | **Use case 6: Responsible GeoAI** | geocr:spatialBias, geocr:samplingStrategy | rai:dataCollection, rai:dataBiases, rai:annotatorDemographics, rai:dataUseCases | cr:description, cr:distribution | sc:creator, sc:license, sc:description | | **Use case 7: Time-Series Support** | geocr:temporalResolution, geocr:timeSeriesIndex | \- | cr:RecordSet, cr:Field | sc:temporalCoverage, sc:datePublished | | **Use case 8: Adding custom properties** | \- | | | sc:additionalProperty | @@ -831,8 +833,8 @@ The table below demonstrates a mapping between commonly used metadata fields in | bbox | \- | schema:spatialCoverage (schema:GeoShape) / dcat:bbox | | geometry | \- | geosparql:hasGeometry, geosparql:asWKT | | assets | distribution | dcat:distribution | -| assets\[\\].href | distribution\[ \].contentUrl | schema:contentUrl | -| assets\[\\].type | distribution\[ \].encodingFormat | schema:encodingFormat | +| assets\[\\].href | distribution\[ \].contentUrl | schema:contentUrl | +| assets\[\\].type | distribution\[ \].encodingFormat | schema:encodingFormat | | proj:epsg | geocr:coordinateReferenceSystem | proj:epsg | | gsd (or properties.gsd) | geocr:spatialResolution | stac:gsd | | eo:bands (or band list in assets) | geocr:bandConfiguration and/or geocr:spectralBandMetadata | STAC EO extension (eo:bands) | @@ -1385,7 +1387,7 @@ This appendix summarizes responses from the GeoCroissant user adoption survey an Overall, most spatial machine learning dataset fields received an average rating of **“Important.”** No spatial or non-spatial fields were rated **“Very unimportant.”** Across both spatial and non-spatial metadata, **description** was consistently identified as the most important field. Respondents noted that the description provides critical context required to interpret and responsibly use a dataset, including information on provenance, background, assumptions, and limitations (Refer table below). | Rank | Top five most important ML fields | Top five most important Geospatial fields | -|----------------------------:|----------------------|----------------------| +|---------------------------:|----------------------|----------------------| | 1 | Description | Description | | 2 | License | Sensor (e.g., optical, thermal) | | 3 | Distribution (file representation/format) | Annotation type (e.g., mask, bbox) | @@ -1394,9 +1396,9 @@ Overall, most spatial machine learning dataset fields received an average rating : Top five metadata fields ranked by survey respondents for machine learning and geospatial dataset description in GeoCroissant. -![Survey of Geo-AI datasets properties based on geospatial and ML fields.](images/croissant-geo-user_survey1.png 'GeoCroissant Survey 1') +![Survey of Geo-AI datasets properties based on geospatial and ML fields.](images/croissant-geo-user_survey1.png "GeoCroissant Survey 1") -![Survey of Geo-AI datasets properties based on geospatial and ML fields.](images/croissant-geo-user_survey2.png 'GeoCroissant Survey 2') +![Survey of Geo-AI datasets properties based on geospatial and ML fields.](images/croissant-geo-user_survey2.png "GeoCroissant Survey 2") **Figure: Summary of mean importance ratings from the GeoCroissant user adoption survey.** @@ -1435,4 +1437,6 @@ WHERE { ?record geocr:BoundingBox ?bbox . FILTER(STR(?bbox) = "[-120.0, 30.0, -110.0, 40.0]") } -``` \ No newline at end of file +``` + +[GeoCroissant](http://mlcommons.org/croissant/geo/1.0), [Croissant](https://mlcommons.org/croissant/1.1) © 2024-2026 by [MLCommons Association and contributors](https://mlcommons.org) is licensed under [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0/). ![CC](https://mirrors.creativecommons.org/presskit/icons/cc.svg) ![BY](https://mirrors.creativecommons.org/presskit/icons/by.svg) ![ND](https://mirrors.creativecommons.org/presskit/icons/nd.svg) \ No newline at end of file