Skip to content

Astro Dynamic STAC Blueprint Generic badge

An opinionated framework that extends the STAC Specification.

Overview

As Astro Dynamic has been building the Data Sphere platform, it has adopted the STAC Specification as the standard format for all meta data. It's a well made open specification, designed to be light weight, flexible, and extensible, able to adapt to the growing needs and applications of the geospatial sector. Additionally, it is in an easy to use format, that is being widely adopted by much of the industry. The benefits of STAC have been clear to see, but there are some areas where we feel there could be alterations, but arguably contradict some of ideals of the specification. Therefore, we decided to create our own optional "flavour" of the specification to use with Data Sphere.

Justification

With STAC's flexible and open nature, users are encouraged to structure their catalogs and collections as they see fit, as well as only being required to include some fields the specification identifies. Whilst this is beneficial in making STAC very flexible, it does make variance between different providers significant. For example, the structure of collections and catalogs can differ significantly, with some being grouped by instrument whilst others are grouped by year only. This works fine if a STAC catalog is only used internally and the method of organisation is well defined. However, for data discoverability and presenting data to end users, this can be confusing as there is no common user experience between providers.

This can also be applied to the fields of an item, collection or catalog. Since there are only a few fields required by the specification, the meta data content can vary greatly between items in different catalogs, sometimes from the same provider. Granted that sometimes this data is not always available to the provider, it still leaves users with ambiguity of whether the data they will be getting, contains the meta data they may require.

For Astro Dynamic specifically, while building Data Sphere, our biggest problem was missing fields (which we consider to be key), items not conforming to STAC Schemas, and the plethora of methods to organise catalogs. This led to it becoming increasingly more challenging to present a consistent user experience.

Goal

To address the challenges, we built a Blueprint for our items, collections and catalogs to follow. Our goal was to make introduce more rigidity to the specification, whilst maintaining some of its core benefits. We use the word Blueprint instead of Specification since we are bringing together elements from the STAC Core and STAC Extensions, rather than creating anything new. It was important to us that we don't use the word specification loosely and diminish the hard work of the creators of STAC.

With our goal of adding rigidity and structure in mind, the AD STAC Blueprint aims to provide :

  • Stricter naming conventions
  • Adherence to STAC best practices
  • Common organisation structure to catalogs
  • Extensions as requirements

We also want this Blueprint to be optional to follow. That is, to contribute data products to Data Sphere, you will not be required to comply with the Blueprint. It is still in its early stages and will be growing with our capabilities and with the feedback of the community. The Blueprint will be used across Data Sphere to help with decisions regarding quality assurance (see the Quality Award Standard), as well as providing a cohesive user experience when searching datasets. This will be done automatically, requiring you to do no work at all.

As such, this Blueprints serves as a reference point for contributors, to see how their products will be represented when included on Data Sphere, and what meta data is most important to our users.

Blueprint

The Blueprint directly references the STAC Specification, with us defining changes made rather than defining a complete list of fields. You MUST read the STAC Specification as well as the Blueprint for correct implementation.

Catalog Organisation

Note

The catalog organisation is still being developed and is very likely to change. We would appreciate any feedback on the catalog organisation as it is a key area for us.

Each organisations STAC Catalog will be organised by a common method to make traversal easier for people and machines. The root of every organisation will be a catalog containing sub-catalogs or collections. Collections will be sorted by common data amongst Items. The structure will differ by what fields an organisation has available to them, but it should follow this hierarchy.

  1. Constellation
  2. Mission
  3. Platform
  4. Gregorian Calendar Year
  5. Gregorian Calendar Month

A mission is flexible in it's definition, although it should follow the rough guide set out in the STAC specification. However, a mission MUST always be a collection of related tasks performed by one or more platforms. If a mission only has one platform, (and will only have one platform in future) then a sub-collection for the platform does not need to be made, and calendar month/year collections can be sub-catalogs of the mission collection.

STAC Organisation Hierarchy

This tree diagram shows how an organisation's catalog could be organised using the hierarchy provided above.

Item

The Item has been extended to include the Electro-Optical or SAR Extension, View Extension, and Projection Extension. We have also made many of the link relations requirements now instead of optional to clearly establish where the item belongs.

This defines the type a link relation should be as well of how it is grouped. For instance, an Item's parent MUST be a Collection and not a Catalog.

Link Relation Type
Parent Collection
Child None
Root Catalog
Grouped By Parent Collection

Change Table

Field Change
Properties Object : title Required
Links Object : rel : self Required
Links Object : rel : root Required
Links Object : rel : parent Required
Links Object : rel : collection Required
Links Object : rel : preview Required. Must be PNG/JPEG. Can be Tiff if PNG/JPEG not available.
Assets Object : title Required
Assets Object : type Required
Assets Object : roles Required. Must be a standard role. "overview" reserved for .tiff media types.
Extension : EO Required if Optical Imagery. Version 1.1.0 or higher.
Extension : EO : cloud_cover Required
Extension : EO : Band Object Required
Extension : EO : name Required
Extension : EO : common_name Required. Must follow the list of common names given in EO extension.
Extension : View Required. Version 1.0.0 or higher.
Extension : View : off_nadir Required
Extension : View : azimuth Required
Extension : View : incidence_angle Required
Extension : Proj Required. Version 1.1.0 or higher.
Extension : Proj : epsg / wkt2 / projjson At least One Required.
Extension : Proj : shape Required
Extension : Proj : transform Required
Extension : SAR Required if SAR Imagery. Version 1.0.0 or higher
Extension : SAR : instrument_mode Required
Extension : SAR : frequency_band Required
Extension : SAR : polarizations Required
Extension : SAR : center_frequency Required
Extension : SAR : resolution_range Required
Extension : SAR : looks_range Required

Example

{
  "stac_version": "1.0.0",
  "stac_extensions": [
      "https://stac-extensions.github.io/eo/v1.0.0/schema.json",
      "https://stac-extensions.github.io/projection/v1.0.0/schema.json",
      "https://stac-extensions.github.io/view/v1.0.0/schema.json",
      "https://stac-extensions.github.io/sat/v1.0.0/schema.json"
  ],
  "type": "Feature",
  "id": "20201211_223832_CS2",
  "bbox": [
    172.91173669923782,
    1.3438851951615003,
    172.95469614953714,
    1.3690476620161975
  ],
  "geometry": {
    "type": "Polygon",
    "coordinates": [
      [
        [
          172.91173669923782,
          1.3438851951615003
        ],
        [
          172.95469614953714,
          1.3438851951615003
        ],
        [
          172.95469614953714,
          1.3690476620161975
        ],
        [
          172.91173669923782,
          1.3690476620161975
        ],
        [
          172.91173669923782,
          1.3438851951615003
        ]
      ]
    ]
  },
  "properties": {
    "datetime": "2020-12-11T22:38:32.125000Z",
    "created": "2020-12-12T01:48:13.725Z",
    "updated": "2020-12-12T01:48:13.725Z",
    "instruments": [
      "cool_sensor_v1"
    ],
    "view:off_nadir": 0,
    "view:incidence_angle": 90,
    "view:azimuth": 23.9,
    "view:sun_elevation": 45.0,
    "view:sun_azimuth": 56.4,
    "gsd": 0.66,
    "eo:cloud_cover": 1.2,
    "eo:snow_cover": 0
    "proj:epsg": 32659,
    "proj:shape": [
      5558,
      9559
    ],
    "proj:transform": [
      0.5,
      0,
      712710,
      0,
      -0.5,
      151406,
      0,
      0,
      1
    ],

  },
  "collection": "simple-collection",
  "links": [
    {
      "rel": "collection",
      "href": "./collection.json",
      "type": "application/json",
      "title": "Simple Example Collection"
    },
    {
      "rel": "root",
      "href": "./Catalog.json",
      "type": "application/json",
      "title": "Organisation Catalog"
    },
    {
      "rel": "parent",
      "href": "./collection.json",
      "type": "application/json",
      "title": "Simple Example Collection"
    }
  ],
  "assets": {
    "visual": {
      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.tif",
      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
      "title": "3-Band Visual",
      "roles": [
        "visual"
      ],
      "eo:bands": [
        {
          "name": "band1",
          "common_name": "blue",
          "center_wavelength": 0.47,
          "full_width_half_max": 0.07,
          "solar_illumination": 1959.66
        },
        {
          "name": "band2",
          "common_name": "green",
          "center_wavelength": 0.56,
          "full_width_half_max": 0.08,
          "solar_illumination": 1823.24
        },
        {
          "name": "band3",
          "common_name": "red",
          "center_wavelength": 0.645,
          "full_width_half_max": 0.09,
          "solar_illumination": 1512.06
        },
        {
          "name": "band4",
          "common_name": "nir",
          "center_wavelength": 0.8,
          "full_width_half_max": 0.152,
          "solar_illumination": 1041.63
        }
      ]
    },
    "thumbnail": {
      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.jpg",
      "title": "Thumbnail",
      "type": "image/jpeg",
      "roles": [
        "thumbnail"
      ]
    }
  }
}

Collection

Collections are encouraged to include extensions fields that are common amongst all the child items, such as the Projection EPSG, to remove the need to include them in every item.

Note

We are in the process of updating the collection to be compliant for real time data. We understand that the extent object will not be able to be completed whilst data is being added a collection in real time.

This defines the type a link relation should be as well of how it is grouped.

Link Relation Type
Parent Catalog, Collection
Child Collection, Item
Root Catalog
Grouped By Mission, Constellation, Platform, Month.

Change Table

Field Change
Standalone Collections Must Link to Child Collections
stac_version Do not mix STAC versions within a collection.
stac_extensions Required
license Required
title Required
providers Required. Must have at least one provider in the "Provider Object". This provider can be any role.
providers : roles Required. Must be one or more of the roles listed in Providers Object spec.
Extent Object : spatial
Extent Object : temporal
Extension : sat Required on platform collection level of organisation.
Extension : EO Only if common amongst all items
Extension : EO : name Only if common amongst all items
Extension : EO : common_name Only if common amongst all items. Must follow the list of common names given in EO extension.
Extension : View Only if common amongst all items
Extension : Proj Only if common amongst all items
Extension : Proj : epsg, wkt2, projjson Only if common amongst all items. Required to have at least one the fields, epsg, wkt2, projjson, not Null.
Extension : SAR Only if common amongst all items. Required if SAR Imagery

Example

{
  "id": "simple-collection",
  "type": "Collection",
  "stac_extensions": [
    "https://stac-extensions.github.io/eo/v1.0.0/schema.json",
    "https://stac-extensions.github.io/projection/v1.0.0/schema.json",
    "https://stac-extensions.github.io/view/v1.0.0/schema.json",
    "https://stac-extensions.github.io/sat/v1.0.0/schema.json"
  ],
  "stac_version": "1.0.0",
  "description": "A simple collection demonstrating core catalog fields with links to a couple of items",
  "title": "Simple Example Collection",
  "providers": [
    {
      "name": "Remote Data, Inc",
      "description": "Producers of awesome spatiotemporal assets",
      "roles": [
        "producer",
        "processor"
      ],
      "url": "http://remotedata.io"
    }
  ],
  "extent": {
    "spatial": {
      "bbox": [
        [
          172.91173669923782,
          1.3438851951615003,
          172.95469614953714,
          1.3690476620161975
        ]
      ]
    },
    "temporal": {
      "interval": [
        [
          "2020-12-11T22:38:32.125Z",
          "2020-12-14T18:02:31.437Z"
        ]
      ]
    }
  },
  "license": "CC-BY-4.0",
  "summaries": {
    "platform": [
      "cool_sat1",
      "cool_sat2"
    ],
    "constellation": [
      "ion"
    ],
    "instruments": [
      "cool_sensor_v1",
      "cool_sensor_v2"
    ],
    "gsd": {
      "minimum": 0.512,
      "maximum": 0.66
    },
    "eo:cloud_cover": {
      "minimum": 1.2,
      "maximum": 1.2
    },
    "proj:epsg": {
      "minimum": 32659,
      "maximum": 32659
    },
    "view:sun_elevation": {
      "minimum": 54.9,
      "maximum": 54.9
    },
    "view:off_nadir": {
      "minimum": 3.8,
      "maximum": 3.8
    },
    "view:sun_azimuth": {
      "minimum": 135.7,
      "maximum": 135.7
    },
  },
  "links": [
    {
      "rel": "root",
      "href": "./catalog.json",
      "type": "application/json",
      "title": "Organisation Catalog"
    },
    {
      "rel": "child",
      "href": "./cool_sat1_collection/collection.json",
      "type": "application/json",
      "title": "Cool Sat 1 Collection"
    },
    {
      "rel": "child",
      "href": "./cool_sat2_collection/collection.json",
      "type": "application/json",
      "title": "Cool Sate 2 Collection"
    },
    {
      "rel": "self",
      "href": "https://raw.githubusercontent.com/radiantearth/stac-spec/v1.0.0/examples/collection.json",
      "type": "application/json"
    }
  ]
}

Catalog

Catalogs are now reserved for holding other collections. They can be used to hold extra meta data common amongst all collections.

This defines the type a link relation should be as well of how it is grouped.

Link Relation Type
Parent None, Catalog
Child Catalog, Collection
Root Self, Catalog
Grouped By Organisation

Change Table

Field Change
title Required
Link Object : rel : item Not allowed. Catalogs are only allowed to link to collections or sub-catalogs.
Link Object : rel : self Required
Link Object : rel : root Required. This can be the same as self if the catalog is root.
Link Object : type Must be application/json, as all catalogs link to collections/sub-catalogs
Owner Required. The organisation that has curated the Catalog and all it's child elements.

Example

{
  "id": "examples",
  "type": "Catalog",
  "title": "Example Catalog",
  "stac_version": "1.0.0",
  "description": "This catalog is a simple demonstration of an example catalog that is used to organize a hierarchy of collections and their items.",
  "links": [
    {
      "rel": "root",
      "href": "./catalog.json",
      "type": "application/json"
    },
    {
      "rel": "child",
      "href": "./mission_A_collection/collection.json",
      "type": "application/json",
      "title": "Collection For Mission A"
    },
    {
      "rel": "child",
      "href": "./mission_B_collection/collection.json",
      "type": "application/json",
      "title": "Collection For Mission B"
    },
    {
      "rel": "self",
      "href": "https://raw.githubusercontent.com/radiantearth/stac-spec/v1.0.0/examples/catalog.json",
      "type": "application/json"
    }
  ]
}