diff --git a/CHANGELOG.md b/CHANGELOG.md index 656373e4e..9a596e8ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [v0.6.2] - 2019-03-01 + +### Fixed +- Fixed several examples and typos, improved descriptions +- Strictly checking the STAC version numbers in the JSON schemas +- Added missing required fields in Item JSON schema +- Changed `id` to `$id` in JSON schemas (draft-06 compatibility) + +### Changed +- Extensions require examples and a JSON schema to get to the maturity level 'Pilot' +- Updated ISERV implementation + +### Added +- Checksum extension +- Data Cube extension +- Point Cloud extension +- SAR extension + ## [v0.6.1] - 2019-01-25 ### Fixed @@ -112,6 +130,7 @@ Thanks @hgs-msmith, @matthewhanson, @hgs-trutherford, @rouault, @joshfix, @alkam [Unreleased]: https://github.com/radiantearth/stac-spec/compare/master...dev +[v0.6.2]: https://github.com/radiantearth/stac-spec/compare/v0.6.1...v0.6.2 [v0.6.1]: https://github.com/radiantearth/stac-spec/compare/v0.6.0...v0.6.1 [v0.6.0]: https://github.com/radiantearth/stac-spec/compare/v0.5.2...v0.6.0 [v0.5.2]: https://github.com/radiantearth/stac-spec/compare/v0.5.1...v0.5.2 diff --git a/README.md b/README.md index e52d62e8b..c7659d81f 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ The minimal amount is specified right now, but best practices should emerge with ## Current version and branches The [master branch](https://github.com/radiantearth/stac-spec/tree/master) is the 'stable' version of the spec. It is currently version -**0.6.1** of the specification. The +**0.6.2** of the specification. The [dev](https://github.com/radiantearth/stac-spec/tree/dev) branch is where active development takes place, and may have inconsistent examples. Whenever dev stabilizes a release is cut and we merge dev in to master. So master should be stable at any given time. It is possible that there may be small releases in quick succession, especially if they are nice improvements that do diff --git a/api-spec/STAC-query.yaml b/api-spec/STAC-query.yaml index 7b73f2dd4..37d8360da 100644 --- a/api-spec/STAC-query.yaml +++ b/api-spec/STAC-query.yaml @@ -1,7 +1,7 @@ openapi: 3.0.1 info: title: The SpatioTemporal Asset Catalog API (standalone) - version: 0.6.1 + version: 0.6.2 description: >- This is an OpenAPI definition of the core SpatioTemporal Asset Catalog API specification. Any service that implements this endpoint to allow search of @@ -361,7 +361,7 @@ components: properties: stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: type: string example: naip diff --git a/api-spec/STAC-standalone.yaml b/api-spec/STAC-standalone.yaml index d09ffbd86..6675ce300 100644 --- a/api-spec/STAC-standalone.yaml +++ b/api-spec/STAC-standalone.yaml @@ -1,7 +1,7 @@ openapi: 3.0.1 info: title: The SpatioTemporal Asset Catalog API (standalone) - version: 0.6.1 + version: 0.6.2 description: >- This is an OpenAPI definition of the core SpatioTemporal Asset Catalog API specification. Any service that implements this endpoint to allow search of @@ -329,7 +329,7 @@ components: properties: stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: type: string example: naip diff --git a/api-spec/WFS3core+STAC.yaml b/api-spec/WFS3core+STAC.yaml index 7c488b3f7..97f83eba2 100644 --- a/api-spec/WFS3core+STAC.yaml +++ b/api-spec/WFS3core+STAC.yaml @@ -1,7 +1,7 @@ openapi: 3.0.1 info: title: The SpatioTemporal Asset Catalog API + WFS3 - version: 0.6.1 + version: 0.6.2 description: >- This is an OpenAPI definition of the core SpatioTemporal Asset Catalog API specification. Any service that implements this endpoint to allow search of @@ -488,7 +488,7 @@ components: properties: stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: type: string example: naip @@ -749,7 +749,7 @@ components: - 'http://www.opengis.net/def/crs/OGC/1.3/CRS84' stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: description: 'identifier of the collection used, for example, in URIs' type: string diff --git a/api-spec/definitions/STAC-collections.fragment.yaml b/api-spec/definitions/STAC-collections.fragment.yaml index f614b7cce..a5f216fd9 100644 --- a/api-spec/definitions/STAC-collections.fragment.yaml +++ b/api-spec/definitions/STAC-collections.fragment.yaml @@ -11,7 +11,7 @@ components: properties: stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: description: 'identifier of the collection used, for example, in URIs' type: string diff --git a/api-spec/definitions/STAC-standalone.yaml b/api-spec/definitions/STAC-standalone.yaml index f925f78d8..1359912bd 100644 --- a/api-spec/definitions/STAC-standalone.yaml +++ b/api-spec/definitions/STAC-standalone.yaml @@ -1,7 +1,7 @@ openapi: 3.0.1 info: title: The SpatioTemporal Asset Catalog API (standalone) - version: 0.6.1 + version: 0.6.2 description: >- This is an OpenAPI definition of the core SpatioTemporal Asset Catalog API specification. Any service that implements this endpoint to allow search of @@ -327,7 +327,7 @@ components: properties: stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: type: string example: naip diff --git a/catalog-spec/catalog-spec.md b/catalog-spec/catalog-spec.md index 57fde2ab5..02f6549d6 100644 --- a/catalog-spec/catalog-spec.md +++ b/catalog-spec/catalog-spec.md @@ -160,7 +160,7 @@ might look something like this: ```json { - "stac_version": "0.6.1", + "stac_version": "0.6.2", "id": "NAIP", "description": "Catalog of NAIP Imagery", "links": [ @@ -178,7 +178,7 @@ A typical '_child_' sub-catalog could look similar: ```json { - "stac_version": "0.6.1", + "stac_version": "0.6.2", "id": "NAIP", "description": "Catalog of NAIP Imagery - 30087", "links": [ diff --git a/catalog-spec/examples/catalog.json b/catalog-spec/examples/catalog.json index 5042a4a13..b736f10d9 100644 --- a/catalog-spec/examples/catalog.json +++ b/catalog-spec/examples/catalog.json @@ -1,5 +1,5 @@ { - "stac_version": "0.6.1", + "stac_version": "0.6.2", "id": "sample", "title": "Sample catalog", "description": "This is a very basic sample catalog.", diff --git a/catalog-spec/json-schema/catalog.json b/catalog-spec/json-schema/catalog.json index 755e0417a..82e175603 100644 --- a/catalog-spec/json-schema/catalog.json +++ b/catalog-spec/json-schema/catalog.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-06/schema#", - "id": "catalog.json#", + "$id": "catalog.json#", "definitions": { "link": { "type": "object", @@ -39,7 +39,8 @@ "properties": { "stac_version": { "title": "STAC version", - "type": "string" + "type": "string", + "const": "0.6.2" }, "id": { "title": "Identifier", diff --git a/collection-spec/collection-spec.md b/collection-spec/collection-spec.md index bf2fe4724..372924469 100644 --- a/collection-spec/collection-spec.md +++ b/collection-spec/collection-spec.md @@ -47,7 +47,7 @@ be aware of their differences by reading both specifications. | spatial | [number] | **REQUIRED.** Potential *spatial extent* covered by the collection. | | temporal | [string\|null] | **REQUIRED.** Potential *temporal extent* covered by the collection. A list of two timestamps, which MUST be formatted according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339#section-5.6). Open date ranges are supported by setting either the start or the end time to `null`. Example for data from the beginning of 2019 until now: `["2009-01-01T00:00:00Z", null]`. | -**temporal** - The bounding box is provided as four or six numbers, depending on whether the coordinate reference system includes a vertical axis (height or depth): +**spatial**: The bounding box is provided as four or six numbers, depending on whether the coordinate reference system includes a vertical axis (height or depth): - Lower left corner, coordinate axis 1 (west) - Lower left corner, coordinate axis 2 (south) diff --git a/collection-spec/examples/sentinel2.json b/collection-spec/examples/sentinel2.json index cec61367f..e551e2c12 100644 --- a/collection-spec/examples/sentinel2.json +++ b/collection-spec/examples/sentinel2.json @@ -1,5 +1,5 @@ { - "stac_version": "0.6.1", + "stac_version": "0.6.2", "id": "COPERNICUS/S2", "title": "Sentinel-2 MSI: MultiSpectral Instrument, Level-1C", "description": "Sentinel-2 is a wide-swath, high-resolution, multi-spectral\nimaging mission supporting Copernicus Land Monitoring studies,\nincluding the monitoring of vegetation, soil and water cover,\nas well as observation of inland waterways and coastal areas.\n\nThe Sentinel-2 data contain 13 UINT16 spectral bands representing\nTOA reflectance scaled by 10000. See the [Sentinel-2 User Handbook](https://sentinel.esa.int/documents/247904/685211/Sentinel-2_User_Handbook)\nfor details. In addition, three QA bands are present where one\n(QA60) is a bitmask band with cloud mask information. For more\ndetails, [see the full explanation of how cloud masks are computed.](https://sentinel.esa.int/web/sentinel/technical-guides/sentinel-2-msi/level-1c/cloud-masks)\n\nEach Sentinel-2 product (zip archive) may contain multiple\ngranules. Each granule becomes a separate Earth Engine asset.\nEE asset ids for Sentinel-2 assets have the following format:\nCOPERNICUS/S2/20151128T002653_20151128T102149_T56MNN. Here the\nfirst numeric part represents the sensing date and time, the\nsecond numeric part represents the product generation date and\ntime, and the final 6-character string is a unique granule identifier\nindicating its UTM grid reference (see [MGRS](https://en.wikipedia.org/wiki/Military_Grid_Reference_System)).\n\nFor more details on Sentinel-2 radiometric resoltuon, [see this page](https://earth.esa.int/web/sentinel/user-guides/sentinel-2-msi/resolutions/radiometric).\n", diff --git a/collection-spec/json-schema/collection.json b/collection-spec/json-schema/collection.json index 3d72a3073..9505de5a7 100644 --- a/collection-spec/json-schema/collection.json +++ b/collection-spec/json-schema/collection.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-06/schema#", - "id": "collection.json#", + "$id": "collection.json#", "title": "STAC Collection Specification", "description": "This object represents Collections in a SpatioTemporal Asset Catalog.", "type": "object", @@ -16,7 +16,8 @@ "properties": { "stac_version": { "title": "STAC version", - "type": "string" + "type": "string", + "const": "0.6.2" }, "id": { "title": "Identifier", diff --git a/extensions/README.md b/extensions/README.md index f0f431308..e8bcc1ead 100644 --- a/extensions/README.md +++ b/extensions/README.md @@ -25,9 +25,9 @@ maturity classification, so that STAC spec users can easily get a sense of how m on the extension. | Maturity Classification | Min Impl # | Description | Stability | -| ----------------------- | ----------- | ----------- | --------- | +| ----------------------- | ----------- | ----------- | --------- | | Proposal | 0 | An idea put forward by a community member to gather feedback | Not stable - breaking changes almost guaranteed as implementors try out the idea. | -| Pilot | 1 | Idea is fleshed out and implemented in one or more catalogs. Additional implementations encouraged to help give feedback | Approaching stability - breaking changes are not anticipated but can easily come from additional feedback | +| Pilot | 1 | Idea is fleshed out, with examples and a JSON schema, and implemented in one or more catalogs. Additional implementations encouraged to help give feedback | Approaching stability - breaking changes are not anticipated but can easily come from additional feedback | | Candidate | 3 | A number of implementors are using it and are standing behind it as a solid extension. Can generally count on an extension at this maturity level | Mostly stable, breaking changes require a new version and minor changes are unlikely. | | Stable | 6 | Highest current level of maturity. The community of extension maintainers commits to a STAC review process for any changes, which are not made lightly. | Completely stable, all changes require a new version number and review process. | | Deprecated | N/A | A previous extension that has likely been superceded by a newer one or did not work out for some reason. | DO NOT USE, is not supported | @@ -45,12 +45,16 @@ stable for over a year and are used in twenty or more implementations. | Extension Name (Prefix) | Scope | Description | Maturity | | ------------------------------------------------------------ | ---------------- | ------------------------------------------------------------ | -------- | +| [Checksum](checksum/README.md) (`checksum`) | Item +Catalog +Collection | Provides a way to specify file checksums for assets and links in Items, Catalogs and Collections. | *Proposal* | | [Commons](commons/README.md) (-) | Item +Collection | Provides a way to specify data fields in a collection that are common across the STAC Items in that collection, so that each does not need to repeat all the same information. | *Proposal* | +| [Data Cube](datacube/README.md) (`cube`) | Item | Data Cube related metadata, especially to describe their dimensions. | *Proposal* | | [Datetime Range](datetime-range//README.md) (`dtr`) | Item | An extension to provide datetime ranges with a start and an end datetime stamp in a consistent way. | *Proposal* | -| [EO](eo//README.md) (`eo`) | Item | Covers electro-optical data that represents a snapshot of the earth for a single date and time. It could consist of multiple spectral bands, for example visible bands, infrared bands, red edge bands and panchromatic bands. The extension provides common fields like bands, cloud cover, off nadir, sun angle + elevation, gsd and more. | *Pilot* | +| [EO](eo/README.md) (`eo`) | Item | Covers electro-optical data that represents a snapshot of the earth for a single date and time. It could consist of multiple spectral bands, for example visible bands, infrared bands, red edge bands and panchromatic bands. The extension provides common fields like bands, cloud cover, off nadir, sun angle + elevation, gsd and more. | *Pilot* | +| [Point Cloud](pointcloud/README.md) (`pc`) | Item | Provides a way to describe point cloud datasets. The point clouds can come from either active or passive sensors, and data is frequently acquired using tools such as LiDAR or coincidence-matched imagery. | *Proposal* | +| [SAR](sar/README.md) (`sar`) | Item | Covers synthetic-aperture radar data that represents a snapshot of the earth for a single date and time. | *Proposal* | | [Single Item](single-item/README.md) (`item`) | Item | Provides a way to specify several fields in individual Items that usually reside on the collection-level such as license and providers. | *Proposal* | -| [Scientific](scientific//README.md) (`sci`) | Item | Scientific metadata is considered to be data that indicate from which publication a collection originates and how the collection itself should be cited or referenced. | *Proposal* | -| [Transaction](transaction//README.md) | API | Provides an API extension to support the creation, editing, and deleting of items on a specific WFS3 collection. | *Pilot* | +| [Scientific](scientific/README.md) (`sci`) | Item | Scientific metadata is considered to be data that indicate from which publication a collection originates and how the collection itself should be cited or referenced. | *Proposal* | +| [Transaction](transaction/README.md) | API | Provides an API extension to support the creation, editing, and deleting of items on a specific WFS3 collection. | *Pilot* | ## Third-party / vendor extensions @@ -73,7 +77,6 @@ extension, please get in touch through the referenced issues: - [Drone content Extension](https://github.com/radiantearth/stac-spec/issues/149) - [Full Motion Video Content Extension](https://github.com/radiantearth/stac-spec/issues/156) -- [Point Cloud Extension](https://github.com/radiantearth/stac-spec/issues/157) - [Storage Extensions](https://github.com/radiantearth/stac-spec/issues/148) ## Extending STAC diff --git a/extensions/checksum/README.md b/extensions/checksum/README.md new file mode 100644 index 000000000..132ac0db2 --- /dev/null +++ b/extensions/checksum/README.md @@ -0,0 +1,32 @@ +# Checksum Extension Specification (`checksum`) + +**Extension [Maturity Classification](../README.md#extension-maturity): Proposal** + +Provides a way to specify MD5, SHA1, SHA2 and SHA3 file checksums for assets and links in STAC Items, STAC Catalogs and STAC Collections. + +- [Example](example-sentinel1.json) +- [JSON Schema](schema.json) + +## `Link Object` and `Asset Object` fields + +| Field Name | Type | Description | +| ------------- | ------ | ------------------------------------------------------------ | +| checksum:md5 | string | [MD5 message-digest algorithm](https://en.wikipedia.org/wiki/MD5) 128-bit checksum for the corresponding file, encoded as hexadecimal string. | +| checksum:sha1 | string | [SHA-1 (Secure Hash Algorithm 1)](https://en.wikipedia.org/wiki/SHA-1) 160-bit checksum for the corresponding file, encoded as hexadecimal string. | +| checksum:sha2 | string | [SHA-2 (Secure Hash Algorithm 2)](https://en.wikipedia.org/wiki/SHA-2) checksum for the corresponding file with varying sizes of 224, 256, 384 or 512 bits, encoded as hexadecimal string. | +| checksum:sha3 | string | [SHA-3 (Secure Hash Algorithm 3)](https://en.wikipedia.org/wiki/SHA-3) checksum for the corresponding file with varying bit sizes, encoded as hexadecimal string. | + +### Examples + +Checksum for a text file with file content `test`. + +| Field Name | Example | +| ------------------------ | ------------------------------------------------------------ | +| checksum:md5 | `098f6bcd4621d373cade4e832627b4f6` | +| checksum:sha1 | `a94a8fe5ccb19ba61c4c0873d391e987982fbbd3` | +| checksum:sha2 (256 bits) | `9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08` | +| checksum:sha3 (256 bits) | `36f028580bb02cc8272a9a020f4200e346e276ae664e45ee80745574e2f5ab80` | + +## Implementations + +None yet, still in proposal stage. diff --git a/extensions/checksum/example-sentinel1.json b/extensions/checksum/example-sentinel1.json new file mode 100644 index 000000000..36f6c6912 --- /dev/null +++ b/extensions/checksum/example-sentinel1.json @@ -0,0 +1,70 @@ +{ + "id": "S1A_EW_GRDM_1SSH_20181103T235855_20181103T235955_024430_02AD5D_5616", + "type": "Feature", + "bbox": [-70.275032,-64.72924,-65.087479,-51.105831], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-67.071648,-64.72924], + [-65.087479,-56.674374], + [-68.033211,-51.105831], + [-70.275032,-59.805672], + [-67.071648,-64.72924] + ] + ] + }, + "properties": { + "datetime": "2018-11-03T23:58:55Z" + }, + "assets": { + "noises": { + "href": "./annotation/calibration/noise-s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.xml", + "title": "Calibration Schema", + "type": "text/xml", + "checksum:md5": "a30d1711e81a4b11ef67b28744321659" + }, + "calibrations": { + "href": "./annotation/calibration/calibration-s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.xml", + "title": "Noise Schema", + "type": "text/xml", + "checksum:md5": "4fc5351af67db0b8f1746efe421a05e4" + }, + "products": { + "href": "./annotation/s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.xml", + "title": "Product Schema", + "type": "text/xml", + "checksum:md5": "7a7f2588a85362b9beea2a12d4514d45" + }, + "measurement": { + "href": "./measurement/s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.tiff", + "title": "Measurements", + "type": "image/tiff", + "sar:bands": [ + 0 + ], + "checksum:md5": "163700a8a6501eccd00b6d3b44ddaed0" + }, + "thumbnail": { + "href": "./preview/quick-look.png", + "title": "Thumbnail", + "type": "image/png" + } + }, + "links": [ + { + "rel": "self", + "href": "https://example.com/collections/sentinel-1/items/S1A_EW_GRDM_1SSH_20181103T235855_20181103T235955_024430_02AD5D_5616" + }, + { + "rel": "parent", + "href": "https://example.com/collections/sentinel-1", + "checksum:sha1": "6D97123FD2C02DEC9A1B6D3B13136DBE600CF966" + }, + { + "rel": "root", + "href": "https://example.com/collections", + "checksum:sha1": "FA4B9D69FDDDC7C1BE7BED9440621400B383B43F" + } + ] +} \ No newline at end of file diff --git a/extensions/checksum/schema.json b/extensions/checksum/schema.json new file mode 100644 index 000000000..566b2b82c --- /dev/null +++ b/extensions/checksum/schema.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "schema.json#", + "type": "object", + "title": "Checksum Extension Specification", + "additionalProperties": true, + "allOf": [ + { + "$ref": "#/definitions/core" + } + ], + "definitions": { + "core": { + "type": "object", + "properties": { + "links": { + "title": "Links", + "type": "array", + "items": { + "$ref": "#/definitions/checksums" + } + }, + "assets": { + "title": "Assets", + "type": "object", + "patternProperties": { + ".+": { + "$ref": "#/definitions/checksums" + } + } + } + } + }, + "checksums": { + "type": "object", + "properties": { + "checksum:md5": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{32}$", + "title": "MD5 checksum" + }, + "checksum:sha1": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{40}$", + "title": "SHA1 checksum" + }, + "checksum:sha2": { + "type": "string", + "pattern": "^[A-Fa-f0-9]+$", + "title": "SHA2 checksum" + }, + "checksum:sha3": { + "type": "string", + "pattern": "^[A-Fa-f0-9]+$", + "title": "SHA3 checksum" + } + } + } + } +} \ No newline at end of file diff --git a/extensions/commons/examples/landsat-collection.json b/extensions/commons/examples/landsat-collection.json index d27ee5c8d..5cb3ced1f 100644 --- a/extensions/commons/examples/landsat-collection.json +++ b/extensions/commons/examples/landsat-collection.json @@ -4,7 +4,7 @@ "description": "Landat 8 imagery radiometrically calibrated and orthorectified using gound points and Digital Elevation Model (DEM) data to correct relief displacement.", "keywords": "landsat", "version": "0.1.0", - "stac_version": "0.6.1", + "stac_version": "0.6.2", "extent": { "spatial": [ -180, diff --git a/extensions/datacube/README.md b/extensions/datacube/README.md new file mode 100644 index 000000000..eab75aa92 --- /dev/null +++ b/extensions/datacube/README.md @@ -0,0 +1,75 @@ +# Data cube Extension Specification (`cube`) + +**Extension [Maturity Classification](../README.md#extension-maturity): Proposal** + +Data cube related metadata, especially to describe their dimensions. + +- [Example](example.json) +- [JSON Schema](schema.json) + +## Item Fields + +| Field Name | Type | Description | +| --------------- | ------------------------------------------------------------ | ----------- | +| cube:dimensions | Map | Uniquely named dimensions of the data cube. | + +\* = One of the objects defined below: + +### Horizontal Spatial Dimension Object + +A spatial dimension in one of the horizontal (x or y) directions. + +| Field Name | Type | Description | +| ---------------- | -------------- | ------------------------------------------------------------ | +| type | string | **REQUIRED.** Type of the dimension, always `spatial`. | +| axis | string | **REQUIRED.** Axis of the spatial dimension (`x`, `y`). | +| extent | [number] | **REQUIRED.** Extent (lower and upper bounds) of the dimension as two-dimensional array. Open intervals with `null` are not allowed. | +| values | [number] | Optionally, a set of all potential values. | +| step | number\|null | The space between the values. Use `null` for irregularly spaced steps. | +| reference_system | string\|number | The spatial reference system for the data, specified as [EPSG code](http://www.epsg-registry.org/) or [PROJ definition](https://proj4.org/operations/projections/index.html). Defaults to EPSG code 4326. | + +### Vertical Spatial Dimension Object + +A spatial dimension in vertical (z) direction. + +| Field Name | Type | Description | +| ---------------- | ---------------- | ------------------------------------------------------------ | +| type | string | **REQUIRED.** Type of the dimension, always `spatial`. | +| axis | string | **REQUIRED.** Axis of the spatial dimension, always `z`. | +| extent | [number\|null] | If the dimension consists of [ordinal](https://en.wikipedia.org/wiki/Level_of_measurement#Ordinal_scale) values, the extent (lower and upper bounds) of the values as two-dimensional array. Use `null` for open intervals. | +| values | [number\|string] | A set of all potential values, especially useful for [nominal](https://en.wikipedia.org/wiki/Level_of_measurement#Nominal_level) values. | +| step | number\|null | If the dimension consists of [interval](https://en.wikipedia.org/wiki/Level_of_measurement#Interval_scale) values, the space between the values. Use `null` for irregularly spaced steps. | +| unit | string | The unit of measurement for the data, preferably the symbols from [SI](https://physics.nist.gov/cuu/Units/units.html) or [UDUNITS](https://ncics.org/portfolio/other-resources/udunits2/). | +| reference_system | string\|number | The spatial reference system for the data, specified as [EPSG code](http://www.epsg-registry.org/) or [PROJ definition](https://proj4.org/operations/projections/index.html). Defaults to EPSG code 4326. | + +An Vertical Spatial Dimension Object MUST specify an `extent` or a set of `values`. It MAY specify both. + +### Temporal Dimension Object + +A temporal dimension based on the ISO 8601 standard. The temporal reference system for the data is expected to be ISO 8601 compliant (Gregorian calendar / UTC). Data not compliant with ISO 8601 can be represented as an *Additional Dimension Object* with `type` set to `temporal`. + +| Field Name | Type | Description | +| ---------- | -------------- | ------------------------------------------------------------ | +| type | string | **REQUIRED.** Type of the dimension, always `temporal`. | +| extent | [string\|null] | **REQUIRED.** Extent (lower and upper bounds) of the dimension as two-dimensional array. The dates and/or times must be strings compliant to [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). `null` is allowed for open date ranges. | +| values | [string] | If the dimension consists of set of specific values they can be listed here. The dates and/or times must be strings compliant to [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). | +| step | string\|null | The space between the temporal instances as [ISO 8601 duration](https://en.wikipedia.org/wiki/ISO_8601#Durations), e.g. `P1D`. Use `null` for irregularly spaced steps. | + +### Additional Dimension Object + +An additional dimension that is not `spatial`. + +| Field Name | Type | Description | +| ---------------- | ---------------- | ------------------------------------------------------------ | +| type | string | **REQUIRED.** Custom type of the dimension, never `spatial`. | +| extent | [number\|null] | If the dimension consists of [ordinal](https://en.wikipedia.org/wiki/Level_of_measurement#Ordinal_scale) values, the extent (lower and upper bounds) of the values as two-dimensional array. Use `null` for open intervals. | +| values | [number\|string] | A set of all potential values, especially useful for [nominal](https://en.wikipedia.org/wiki/Level_of_measurement#Nominal_level) values. | +| step | number\|null | If the dimension consists of [interval](https://en.wikipedia.org/wiki/Level_of_measurement#Interval_scale) values, the space between the values. Use `null` for irregularly spaced steps. | +| unit | string | The unit of measurement for the data, preferably the symbols from [SI](https://physics.nist.gov/cuu/Units/units.html) or [UDUNITS](https://ncics.org/portfolio/other-resources/udunits2/). | +| reference_system | string | The reference system for the data. | + +An Additional Dimension Object MUST specify an `extent` or a set of `values`. It MAY specify both. + +## Implementations + +None yet, still in proposal stage. \ No newline at end of file diff --git a/extensions/datacube/example.json b/extensions/datacube/example.json new file mode 100644 index 000000000..5b5bf7ffa --- /dev/null +++ b/extensions/datacube/example.json @@ -0,0 +1,49 @@ +{ + "stac_version": "0.6.2", + "id": "datacube", + "description": "Multi-dimensional data cube in a STAC collection.", + "links": [ + { + "rel": "self", + "href": "http://www.example.org/datacubes/catalog.json" + } + ], + "properties": { + "cube:dimensions": { + "x": { + "type": "spatial", + "axis": "x", + "extent": [-180,180], + "reference_system": 3857 + }, + "y": { + "type": "spatial", + "axis": "y", + "extent": [-85,85], + "reference_system": 3857 + }, + "pressure_levels": { + "type": "spatial", + "axis": "z", + "extent": [0,1000], + "step": 100, + "unit": "Pa" + }, + "metered_levels": { + "type": "spatial", + "axis": "z", + "values": [0,10,25,50,100,1000], + "unit": "m" + }, + "time": { + "type": "temporal", + "extent": ["2015-01-01T00:00:00Z","2018-12-31T00:00:00Z"], + "step": "P1D" + }, + "spectral": { + "type": "bands", + "values": ["red","green","blue"] + } + } + } +} \ No newline at end of file diff --git a/extensions/datacube/schema.json b/extensions/datacube/schema.json new file mode 100644 index 000000000..c3dbacca3 --- /dev/null +++ b/extensions/datacube/schema.json @@ -0,0 +1,284 @@ +{ + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Data Cube Extension", + "type": "object", + "description": "STAC Data Cube Extension", + "additionalProperties": true, + "allOf": [ + { + "$ref": "#/definitions/cube" + } + ], + "definitions": { + "cube": { + "properties": { + "properties": { + "type": "object", + "required": [ + "cube:dimensions" + ], + "properties": { + "cube:dimensions": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/definitions/objects/additional_dimension" + }, + { + "$ref": "#/definitions/objects/horizontal_spatial_dimension" + }, + { + "$ref": "#/definitions/objects/vertical_spatial_dimension" + }, + { + "$ref": "#/definitions/objects/temporal_dimension" + } + ] + } + } + } + } + } + }, + "objects": { + "additional_dimension": { + "title": "Additional Dimension Object", + "type": "object", + "anyOf": [ + { + "required": [ + "type", + "extent" + ] + }, + { + "required": [ + "type", + "values" + ] + } + ], + "not": { + "required": ["axis"] + }, + "properties": { + "type": { + "allOf": [ + { + "type": "string" + }, + { + "not": { + "type": "string", + "const": "spatial" + } + } + ] + }, + "extent": { + "$ref": "#/definitions/fields/extent_open" + }, + "values": { + "$ref": "#/definitions/fields/values" + }, + "step": { + "$ref": "#/definitions/fields/step" + }, + "unit": { + "$ref": "#/definitions/fields/unit" + }, + "reference_system": { + "type": "string" + } + } + }, + "horizontal_spatial_dimension": { + "title": "Horizontal Spatial Dimension Object", + "type": "object", + "required": [ + "type", + "axis", + "extent" + ], + "properties": { + "type": { + "$ref": "#/definitions/fields/type_spatial" + }, + "axis": { + "$ref": "#/definitions/fields/axis_xy" + }, + "extent": { + "$ref": "#/definitions/fields/extent_closed" + }, + "values": { + "$ref": "#/definitions/fields/values_numeric" + }, + "step": { + "$ref": "#/definitions/fields/step" + }, + "reference_system": { + "$ref": "#/definitions/fields/reference_system_spatial" + } + } + }, + "vertical_spatial_dimension": { + "title": "Vertical Spatial Dimension Object", + "type": "object", + "anyOf": [ + { + "required": [ + "type", + "axis", + "extent" + ] + }, + { + "required": [ + "type", + "axis", + "values" + ] + } + ], + "properties": { + "type": { + "$ref": "#/definitions/fields/type_spatial" + }, + "axis": { + "$ref": "#/definitions/fields/axis_z" + }, + "extent": { + "$ref": "#/definitions/fields/extent_open" + }, + "values": { + "$ref": "#/definitions/fields/values" + }, + "step": { + "$ref": "#/definitions/fields/step" + }, + "unit": { + "$ref": "#/definitions/fields/unit" + }, + "reference_system": { + "$ref": "#/definitions/fields/reference_system_spatial" + } + } + }, + "temporal_dimension": { + "title": "Temporal Dimension Object", + "type": "object", + "required": [ + "type", + "extent" + ], + "not": { + "required": ["axis"] + }, + "properties": { + "type": { + "type": "string", + "const": "temporal" + }, + "values": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "extent": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": [ + "string", + "null" + ] + } + }, + "step": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "fields": { + "type_spatial": { + "type": "string", + "const": "spatial" + }, + "axis_xy": { + "type": "string", + "enum": [ + "x", + "y" + ] + }, + "axis_z": { + "type": "string", + "const": "z" + }, + "extent_closed": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number" + } + }, + "extent_open": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": [ + "number", + "null" + ] + } + }, + "values_numeric": { + "type": "array", + "minItems": 1, + "items": { + "type": "number" + } + }, + "values": { + "type": "array", + "minItems": 1, + "items": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + "step": { + "type": [ + "number", + "null" + ] + }, + "unit": { + "type": "string" + }, + "reference_system_spatial": { + "type": [ + "string", + "number" + ], + "default": 4326 + } + } + } +} \ No newline at end of file diff --git a/extensions/datetime-range/schema.json b/extensions/datetime-range/schema.json index c7cf57249..c229540d3 100644 --- a/extensions/datetime-range/schema.json +++ b/extensions/datetime-range/schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-06/schema#", - "id": "schema.json#", + "$id": "schema.json#", "type": "object", "title": "STAC Datetime Range Extension Spec", "properties": { diff --git a/extensions/eo/README.md b/extensions/eo/README.md index 5ef03693f..9492f1069 100644 --- a/extensions/eo/README.md +++ b/extensions/eo/README.md @@ -22,19 +22,19 @@ It is not necessary, but recommended to use the [Commons extension](../commons/R ## Item fields -| Field Name | Type | Description | -| ---------------- | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| eo:gsd | number | **REQUIRED.** Ground Sample distance. The nominal distance between pixel centers available, in meters. | -| eo:platform | string | **REQUIRED.** Unique name of the specific platform the instrument is attached to. For satellites this would be the name of the satellite (e.g., landsat-8, sentinel-2A), whereas for drones this would be a unique name for the drone. | +| Field Name | Type | Description | +| ---------------- | ------------------------ | ----------- | +| eo:gsd | number | **REQUIRED.** Ground Sample distance. The nominal distance between pixel centers available, in meters. | +| eo:platform | string | **REQUIRED.** Unique name of the specific platform the instrument is attached to. For satellites this would be the name of the satellite (e.g., landsat-8, sentinel-2A), whereas for drones this would be a unique name for the drone. | | eo:constellation | string | Name of the constellation that the platform belongs to. See below for details. | -| eo:instrument | string | **REQUIRED.** Name of instrument or sensor used (e.g., MODIS, ASTER, OLI, Canon F-1). | -| eo:bands | [Band Object] | **REQUIRED.** This is a list of the available bands where each item is a Band Object. | -| eo:epsg | integer\|null | EPSG code of the datasource, `null` if no EPSG code. | -| eo:cloud_cover | number | Estimate of cloud cover as a percentage (0-100) of the entire scene. If not available the field should not be provided. | -| eo:off_nadir | number | Viewing angle. The angle from the sensor between nadir (straight down) and the scene center. Measured in degrees (0-90). | -| eo:azimuth | number | Viewing azimuth angle. The angle measured from the sub-satellite point (point on the ground below the platform) between the scene center and true north. Measured clockwise from north in degrees (0-360). | -| eo:sun_azimuth | number | Sun azimuth angle. From the scene center point on the ground, this is the angle between truth north and the sun. Measured clockwise in degrees (0-360). | -| eo:sun_elevation | number | Sun elevation angle. The angle from the tangent of the scene center point to the sun. Measured from the horizon in degrees (0-90). | +| eo:instrument | string | **REQUIRED.** Name of instrument or sensor used (e.g., MODIS, ASTER, OLI, Canon F-1). | +| eo:bands | [Band Object] | **REQUIRED.** This is a list of the available bands where each item is a Band Object. | +| eo:epsg | integer\|null | [EPSG code](http://www.epsg-registry.org/) of the datasource, `null` if no EPSG code. | +| eo:cloud_cover | number | Estimate of cloud cover as a percentage (0-100) of the entire scene. If not available the field should not be provided. | +| eo:off_nadir | number | Viewing angle. The angle from the sensor between nadir (straight down) and the scene center. Measured in degrees (0-90). | +| eo:azimuth | number | Viewing azimuth angle. The angle measured from the sub-satellite point (point on the ground below the platform) between the scene center and true north. Measured clockwise from north in degrees (0-360). | +| eo:sun_azimuth | number | Sun azimuth angle. From the scene center point on the ground, this is the angle between truth north and the sun. Measured clockwise in degrees (0-360). | +| eo:sun_elevation | number | Sun elevation angle. The angle from the tangent of the scene center point to the sun. Measured from the horizon in degrees (0-90). | **eo:gsd** is the nominal Ground Sample Distance for the data, as measured in meters on the ground. Since GSD can vary across a scene depending on projection, this should be the average or most diff --git a/extensions/eo/schema.json b/extensions/eo/schema.json index 79671b74e..c7c4200e2 100644 --- a/extensions/eo/schema.json +++ b/extensions/eo/schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-06/schema#", - "id": "stac-eo-extension.json#", + "$id": "stac-eo-extension.json#", "title": "EO Extension", "type": "object", "description": "STAC EO Extension to a STAC Item.", diff --git a/extensions/pointcloud/README.md b/extensions/pointcloud/README.md new file mode 100644 index 000000000..e0f588d5e --- /dev/null +++ b/extensions/pointcloud/README.md @@ -0,0 +1,54 @@ +# Point Cloud Extension Specification (`pc`) + +**Extension [Maturity Classification](../README.md#extension-maturity): Proposal** + +This document explains the fields of the Point Cloud Extension to a STAC Item, +which allows STAC to more fully describe point cloud datasets. The point clouds can +come from either active or passive sensors, and data is frequently acquired using +tools such as LiDAR or coincidence-matched imagery. + +- [Example](example-autzen.json) +- JSON Schema is missing. PRs are welcome. + +## Item Fields + +| Field Name | Type | Description | +| ------------- | ------------------- | ----------- | +| pc:count | integer | **REQUIRED.** The number of points in the item. | +| pc:type | string | **REQUIRED.** Phenomenology type for the point cloud. Possible valid values might include `lidar`, `eopc`, `radar`, `sonar`, or `other` | +| pc:encoding | string | **REQUIRED.** Content encoding or format of the data. | +| pc:schema | [Schema Object] | **REQUIRED.** A sequential array of items that define the dimensions and their types. | +| pc:density | number | Number of points per square unit area. | +| pc:schema | [Schema Object] | A sequential array of items that define the dimensions and their types. | +| pc:statistics | [Statistics Object] | A sequential array of items mapping to `pc:schema` defines per-channel statistics. | + +### Schema Object + +A sequential array of items that define the dimensions or channels of +the point cloud, their types, and their sizes (in full bytes). + +| Field Name | Type | Description | +| ---------- | ------- | -------------------------- | +| name | string | **REQUIRED.** The name of the dimension. | +| size | integer | **REQUIRED.** The size of the dimension in bytes. Whole bytes only are supported.| +| type | string | **REQUIRED.** Dimension type. Valid values include `floating`, `unsigned`, and `signed`| + +### Statistics Object + +A sequential array of items mapping to `pc:schema` defines per-channel statistics. All fields +are optional. + +| Field Name | Type | Description | +| ---------- | ------- | ----------- | +| average | number | The average of the channel. | +| count | integer | The number of elements in the channel. | +| maximum | number | The maximum value of the channel. | +| minimum | number | The minimum value of the channel. | +| name | string | The name of the channel. | +| position | integer | Position of the channel in the schema.| +| stddev | number | The standard deviation of the channel. | +| variance | number | The variance of the channel. | + +## Implementations + +None yet, still in proposal stage. diff --git a/extensions/pointcloud/example-autzen.json b/extensions/pointcloud/example-autzen.json new file mode 100644 index 000000000..3ff3b200b --- /dev/null +++ b/extensions/pointcloud/example-autzen.json @@ -0,0 +1,300 @@ +{ + "assets": {}, + "bbox": [ + -123.0755422, + 44.04971882, + 123.791472, + -123.0619599, + 44.06278031, + 187.531248 + ], + "geometry": { + "coordinates": [ + [ + [ + -123.07498674, + 44.04971882 + ], + [ + -123.07554223, + 44.06248623 + ], + [ + -123.0625126, + 44.06278031 + ], + [ + -123.06195992, + 44.05001283 + ], + [ + -123.07498674, + 44.04971882 + ] + ] + ], + "type": "Polygon" + }, + "id": "autzen-full.laz", + "links": [ + { + "href": "/Users/hobu/dev/git/pdal/test/data/autzen/autzen-full.laz", + "rel": "self" + } + ], + "properties": { + "datetime": "2013-07-17T00:00:00-05:00Z", + "item:license": "LICENSE", + "item:provider": "USGS", + "pc:count": 10653336, + "pc:density": 0, + "pc:encoding": "LASzip", + "pc:schema": [ + { + "name": "X", + "size": 8, + "type": "floating" + }, + { + "name": "Y", + "size": 8, + "type": "floating" + }, + { + "name": "Z", + "size": 8, + "type": "floating" + }, + { + "name": "Intensity", + "size": 2, + "type": "unsigned" + }, + { + "name": "ReturnNumber", + "size": 1, + "type": "unsigned" + }, + { + "name": "NumberOfReturns", + "size": 1, + "type": "unsigned" + }, + { + "name": "ScanDirectionFlag", + "size": 1, + "type": "unsigned" + }, + { + "name": "EdgeOfFlightLine", + "size": 1, + "type": "unsigned" + }, + { + "name": "Classification", + "size": 1, + "type": "unsigned" + }, + { + "name": "ScanAngleRank", + "size": 4, + "type": "floating" + }, + { + "name": "UserData", + "size": 1, + "type": "unsigned" + }, + { + "name": "PointSourceId", + "size": 2, + "type": "unsigned" + }, + { + "name": "GpsTime", + "size": 8, + "type": "floating" + }, + { + "name": "Red", + "size": 2, + "type": "unsigned" + }, + { + "name": "Green", + "size": 2, + "type": "unsigned" + }, + { + "name": "Blue", + "size": 2, + "type": "unsigned" + } + ], + "pc:statistics": [ + { + "average": 637294.1783, + "count": 10653336, + "maximum": 639003.73, + "minimum": 635577.79, + "name": "X", + "position": 0, + "stddev": 967.9329805, + "variance": 936894.2548 + }, + { + "average": 851247.6953, + "count": 10653336, + "maximum": 853537.66, + "minimum": 848882.15, + "name": "Y", + "position": 1, + "stddev": 1322.356387, + "variance": 1748626.415 + }, + { + "average": 434.1025002, + "count": 10653336, + "maximum": 615.26, + "minimum": 406.14, + "name": "Z", + "position": 2, + "stddev": 24.67893148, + "variance": 609.0496589 + }, + { + "average": 77.14742312, + "count": 10653336, + "maximum": 254, + "minimum": 0, + "name": "Intensity", + "position": 3, + "stddev": 62.62422344, + "variance": 3921.793362 + }, + { + "average": 1.17801438, + "count": 10653336, + "maximum": 4, + "minimum": 1, + "name": "ReturnNumber", + "position": 4, + "stddev": 0.4653418642, + "variance": 0.2165430505 + }, + { + "average": 1.358579791, + "count": 10653336, + "maximum": 4, + "minimum": 1, + "name": "NumberOfReturns", + "position": 5, + "stddev": 0.6656066447, + "variance": 0.4430322055 + }, + { + "average": 0.4989654884, + "count": 10653336, + "maximum": 1, + "minimum": 0, + "name": "ScanDirectionFlag", + "position": 6, + "stddev": 0.4999993213, + "variance": 0.2499993213 + }, + { + "average": 0, + "count": 10653336, + "maximum": 0, + "minimum": 0, + "name": "EdgeOfFlightLine", + "position": 7, + "stddev": 0, + "variance": 0 + }, + { + "average": 1.256686262, + "count": 10653336, + "maximum": 2, + "minimum": 1, + "name": "Classification", + "position": 8, + "stddev": 0.436805292, + "variance": 0.1907988632 + }, + { + "average": -0.812061405, + "count": 10653336, + "maximum": 20, + "minimum": -21, + "name": "ScanAngleRank", + "position": 9, + "stddev": 8.484319324, + "variance": 71.98367439 + }, + { + "average": 126.4052859, + "count": 10653336, + "maximum": 156, + "minimum": 115, + "name": "UserData", + "position": 10, + "stddev": 3.833000243, + "variance": 14.69189086 + }, + { + "average": 7329.903705, + "count": 10653336, + "maximum": 7334, + "minimum": 7326, + "name": "PointSourceId", + "position": 11, + "stddev": 3.107430355, + "variance": 9.656123408 + }, + { + "average": 121.3214254, + "count": 10653336, + "maximum": 255, + "minimum": 35, + "name": "Red", + "position": 12, + "stddev": 45.56263834, + "variance": 2075.954013 + }, + { + "average": 126.2526972, + "count": 10653336, + "maximum": 255, + "minimum": 49, + "name": "Green", + "position": 13, + "stddev": 36.85451838, + "variance": 1358.255525 + }, + { + "average": 111.2207554, + "count": 10653336, + "maximum": 255, + "minimum": 49, + "name": "Blue", + "position": 14, + "stddev": 31.95561927, + "variance": 1021.161603 + }, + { + "average": 247608.4011, + "count": 10653336, + "maximum": 249783.703, + "minimum": 245369.8966, + "name": "GpsTime", + "position": 15, + "stddev": 1178.538827, + "variance": 1388953.768 + } + ], + "pc:type": "lidar", + "title": "USGS 3DEP LiDAR" + }, + "type": "Feature" +} \ No newline at end of file diff --git a/extensions/pointcloud/pdal-to-stac.py b/extensions/pointcloud/pdal-to-stac.py new file mode 100755 index 000000000..f25ea9edc --- /dev/null +++ b/extensions/pointcloud/pdal-to-stac.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python + +# Read 'pdal info --all' output and emit a STAC pc object +# conda create -n pdal-stac -c conda-forge pdal +# conda activate pdal-stac +# pdal info --all ~/dev/git/pdal/test/data/autzen/autzen-full.laz |./pdal-to-stac.py + +import sys +import json +import os + + +data = sys.stdin.read() + +j = json.loads(data) + +def capture_date(pdalinfo): + import datetime + year = pdalinfo['metadata']['creation_year'] + day = pdalinfo['metadata']['creation_doy'] + date = datetime.datetime(int(year), 1, 1) + datetime.timedelta(int(day) - 1) + return date.astimezone().isoformat()+'Z' + +def convertGeometry(geom, srs): + import ogr + import osr + in_ref = osr.SpatialReference() + in_ref.SetFromUserInput(srs) + out_ref = osr.SpatialReference() + out_ref.SetFromUserInput('EPSG:4326') + + g = ogr.CreateGeometryFromJson(json.dumps(geom)) + g.AssignSpatialReference(in_ref) + g.TransformTo(out_ref) + return json.loads(g.ExportToJson()) + + +def convertBBox(obj): + output = [] + output.append(float(obj['minx'])) + output.append(float(obj['miny'])) + output.append(float(obj['minz'])) + output.append(float(obj['maxx'])) + output.append(float(obj['maxy'])) + output.append(float(obj['maxz'])) + return output + + +output = {} + +try: + output['geometry'] = convertGeometry(j['boundary']['boundary_json'],j['metadata']['comp_spatialreference']) +except KeyError: + output['geometry'] = j['stats']['bbox']['EPSG:4326']['boundary'] + +output['bbox'] = convertBBox(j['stats']['bbox']['EPSG:4326']['bbox']) +output['id'] = os.path.basename(j['filename']) +output['type'] = 'Feature' + +assets = {} +#assets['thumbnail'] = +properties = {} + +properties['pc:schema'] = j['schema']['dimensions'] +properties['pc:statistics'] = j['stats']['statistic'] +properties['title'] = "USGS 3DEP LiDAR" +properties['item:provider'] = "USGS" +properties['item:license'] = 'LICENSE' +properties['pc:type'] = 'lidar' # eopc, lidar, radar, sonar +try: + properties['pc:density'] = j['boundary']['avg_pt_per_sq_unit'] +except KeyError: + properties['pc:density'] = 0 +properties['pc:count'] = j['metadata']['count'] + +properties['pc:encoding'] = 'LASzip' if bool(j['metadata']['compressed']) else 'None' + +properties['datetime'] = capture_date(j) + +output['properties'] = properties +output['assets'] = assets + +link = {'rel':'self',"href":j['filename']} +output['links'] = [link] + +sys.stdout.write(json.dumps(output,sort_keys=True, + indent=2, separators=(',', ': '))) diff --git a/extensions/sar/README.md b/extensions/sar/README.md new file mode 100644 index 000000000..cb640bd25 --- /dev/null +++ b/extensions/sar/README.md @@ -0,0 +1,95 @@ +# SAR Extension Specification (`sar`) + +**Extension [Maturity Classification](../README.md#extension-maturity): Proposal** + +This document explains the fields of the STAC Synthetic-Aperture Radar (SAR) Extension to a STAC Item. +SAR data is considered to be data that represents a snapshot of the earth for a single date and time taken by a synthetic-aperture radar system such as Sentinel-1, RADARSAT or EnviSAT. + +It is not necessary, but recommended to use the [Commons extension](../commons/README.md) (see chapter "Placing common fields in Collections"). + +- [Examples](examples/) (for example [Sentinel-1](examples/sentinel1.json) and [Envisat](examples/envisat.json)) +- [JSON Schema](schema.json) + +## Item fields + +**Note:** In the following specification *range* values are meant to be measured perpendicular to the flight path and *azimuth* values are meant to be measured parallel to the flight path. + +| Field Name | Type | Description | +| --------------------- | ------------------ | ------------------------------------------------------------ | +| sar:platform | string | **REQUIRED.** Unique name of the specific platform the instrument is attached to. For satellites this would be the name of the satellite (e.g., landsat-8, sentinel-2A), whereas for drones this would be a unique name for the drone. | +| sar:constellation | string | Name of the constellation that the platform belongs to. See below for details. | +| sar:instrument | string | **REQUIRED.** Name of the sensor used, although for Items which contain data from multiple sensors this could also name multiple sensors. | +| sar:instrument_mode | string | **REQUIRED.** The name of the sensor acquisition mode that is commonly used. This should be the short name, if available. For example, `WV` for "Wave mode" of Sentinel-1 and Envisat ASAR satellites. | +| sar:frequency_band | string | **REQUIRED.** The common name for the frequency band to make it easier to search for bands across instruments. See section "Common Frequency Band Names" for a list of accepted names. | +| sar:center_wavelength | number | The center wavelength of the instrument, in centimeters (cm). | +| sar:center_frequency | number | The center frequency of the instrument, in gigahertz (GHz). | +| sar:polarization | [string] | **REQUIRED.** A single polarization or a polarization combinations specified as array. See below for more details. | +| sar:bands | [Band Object] | This is a list of the available bands where each item is a Band Object. See section "Band Object" for details. | +| sar:pass_direction | string\|null | **REQUIRED.** Direction of the orbit, either `ascending`, `descending` or `null` if not relevant. | +| sar:type | string | **REQUIRED.** The product type, for example `RAW`, `GRD`, `OCN` or `SLC` for Sentinel-1. | +| sar:resolution | [number] | The maximum ability to distinguish two adjacent targets, in meters (m). The first element of the array is the range resolution, the second element is the azimuth resolution. | +| sar:pixel_spacing | [number] | The distance between adjacent pixels, in meters (m). The first element of the array is the range pixel spacing, the second element is the azimuth pixel spacing. Strongly RECOMMENDED to be specified for products of type `GRD`. | +| sar:looks | [number] | The number of groups of signal samples (looks). The first element of the array must be the number of range looks, the second element must be the number of azimuth looks, the optional third element is the equivalent number of looks (ENL). | +| sar:absolute_orbit | [number\|[number]] | A list of absolute orbit numbers. See below for details. | +| sar:off_nadir | [number\|[number]] | Viewing angle(s). Measured in degrees (0-90). See below for details. | + + +**sar:absolute_orbit** lists absolute orbit numbers. Usually corresponds to the orbit count within the orbit cycle (e.g. ALOS, ERS-1/2, JERS-1, and RADARSAT-1, Sentinel-1). For UAVSAR it is the [Flight ID](http://uavsar.jpl.nasa.gov/cgi-bin/data.pl). A range can be specified as two element array in the array, e.g. `[25101, [25131, 25140]]` would be 25101 and 25131 to 25140. + +**sar:constellation** is the name of the group of satellites that have similar payloads and have their orbits arranged in a way to increase the temporal resolution of acquisitions of data with similar geometric and radiometric characteristics. Examples are the Sentinel-1 [constellation](https://www.esa.int/Our_Activities/Observing_the_Earth/Copernicus/Sentinel-1/Satellite_constellation), which has S1A, S1B, S1C and S1D and RADARSAT, which has RADARSAT-1 and RADARSAT-2. This field allows users to search for Sentinel-1 data, for example, without needing to specify which specific platform the data came from. + +**sar:off_nadir** is the angle from the sensor between nadir (straight down) and the scene center. Measured in degrees (0-90). A range can be specified as two element array in the array, e.g. `[20.1, [24.5, 30]]` would be 20.1 and 24.5 to 30. + +**sar:polarization** specifies a single polarization or a polarization combination. For single polarized radars one of `HH`, `VV`, `HV` or `VH` must be set. Fully polarimetric radars add all four polarizations to the array. Dual polarized radars and alternating polarization add the corresponding polarizations to the array, for instance for `HH+HV` add both `HH` and `HV`. + +### Common Frequency Band Names + +The `sar:freuency_band` is the name that is commonly used to refer to that band's spectral +properties. The table below shows the common name based on the wavelength and frequency ranges for several SAR satellites. + +| Common Name | Wavelength Range (cm) | Frequency Range (GHz) | Satellites | +| ----------- | --------------------- | --------------------- | ---------- | +| P | 30 - 120 | 0.25 - 1 | | +| L | 15 - 30 | 1 - 2 | ALOS, JERS, NISAR, SOACOM | +| S | 7.5 - 15 | 2 - 4 | HJ-1C | +| C | 3.8 - 7.5 | 4 - 8 | EnviSat, ERS, Radarsat, Risat-1, Sentinel-1 | +| X | 2.4 - 3.8 | 8 - 12.5 | Cosmo-SkyMed, TerraSAR-X, RanDEM-X, PAZ, KOMPSat-5 | +| Ku | 1.7 - 2.4 | 12.5 - 18 | | +| K | 1.1 - 1.7 | 18 - 26.5 | | +| Ka | 0.75 - 1.1 | 26.5 - 40 | | + +### Date and Time + +In SAR, you usually have frame start and end time. To describe this information it is recommended to use the [Datetime Range Extension Specification](../datetime-range/README.md). The center time of the frame should be specified with the `datetime` property for [STAC ITems](../../item-spec/item-spec.md). + +### Band Object + +The bands contained in SAR image are dependent on the `sar:type`. For example, single look complex (SLC) data contain both phase and amplitude information of the signal. This may be provided for instance in form of complex number components (i and q bands) for each available polarization. Multilooked data (for example GRD in case of Sentinel-1) contain only amplitude and intensity bands for each polarization. Geocoded data contain radiometrically calibrated and terrain corrected data such as sigma0 or flattening gamma and may also contain angular information such as projected local incidence angle. Details about each band and the respective processing applied is given in its description. + +| Field Name | Type | Description | +| ------------------- | ------------ | ----------- | +| name | string | The name of the band. | +| description | string | Description to fully explain the band, should include processing information. [CommonMark 0.28](http://commonmark.org/) syntax MAY be used for rich text representation. | +| data_type | string | Specifies the type of the data contained in the band, for example `amplitude`, `intensity`, `phase`, `angle`, `sigma0`, `gamma0`. | +| unit | string | The unit of measurement for the data, preferably the symbols from [SI](https://physics.nist.gov/cuu/Units/units.html) or [UDUNITS](https://ncics.org/portfolio/other-resources/udunits2/). | +| polarization | string\|null | The polarization of the band, either `HH`, `VV`, `HV`, `VH` or `null` if not applicable. | + +## Associating assets with bands + +Asset definitions that contain band data should reference the band index. Each asset should provide a `sar:bands` property that is an array of 0 based indexes to the correct Band Objects. + +### Item `Asset Object` fields +| Field Name | Type | Description | +| ---------- | -------- | -------------------------------------------- | +| sar:bands | [number] | Lists the band names available in the asset. | + +## Extensions + +The [extensions page](../README.md) gives an overview about related extensions, for example: + +* the [Datetime Range Extension Specification](../datetime-range/README.md) to describe frame start and end time. + +### Placing common fields in Collections +A lot of SAR data will have common metadata across many Items. It is not necessary, but recommended +to use the [Commons extension](../commons/README.md) in combination with [STAC Collections](../../collection-spec/README.md). +The exact metadata that would appear in a STAC Collection record will vary depending on the dataset. \ No newline at end of file diff --git a/extensions/sar/examples/envisat.json b/extensions/sar/examples/envisat.json new file mode 100644 index 000000000..a3fca2d79 --- /dev/null +++ b/extensions/sar/examples/envisat.json @@ -0,0 +1,70 @@ +{ + "id": "ASA_GM1_1PNPDE20090520_023957_000001022079_00118_37747_3607", + "type": "Feature", + "bbox": [64.302468,114.587673,71.179088,128.611298], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [65.212918,114.587673], + [71.179088,117.542266], + [70.096391,128.611298], + [64.302468,123.2946], + [65.212918,114.587673] + ] + ] + }, + "properties": { + "datetime": "2009-05-20T02:40:46.763325Z", + "dtr:start_datetime": "2009-05-20T02:40:01.042784Z", + "dtr:end_datetime": "2009-05-20T02:41:31.483865Z", + "sar:platform": "Envisat", + "sar:constellation": "Envisat", + "sar:instrument": "ASAR", + "sar:instrument_mode": "GM", + "sar:polarization": ["HH"], + "sar:resolution": [1000,1000], + "sar:pixel_spacing": [500,500], + "sar:looks": [3,4], + "sar:frequency_band": "C", + "sar:center_wavelength": 5.623568898893265, + "sar:center_frequency": 5.331, + "sar:pass_direction": "descending", + "sar:absolute_orbit": [37747], + "sar:type": "GM1_1P", + "sar:bands": [ + { + "name": "amplitude", + "data_type": "amplitude", + "polarization": "HH" + }, + { + "name": "intensity", + "description": "Equals the square of the amplitude band", + "data_type": "intensity", + "polarization": "HH" + } + ] + }, + "assets": { + "product": { + "href": "ASA_GM1_1PNPDE20090520_023957_000001022079_00118_37747_3607.n1.gz", + "type": "application/gzip", + "sar:bands": [0,1] + } + }, + "links": [ + { + "rel": "about", + "href": "https://earth.esa.int/pub/ESA_DOC/ENVISAT/ASAR/asar.ProductHandbook.2_2.pdf", + "title": "ASAR Product Handbook", + "type": "application/pdf" + }, + { + "rel": "about", + "href": "https://earth.esa.int/web/sppa/mission-performance/esa-missions/envisat/asar/products-and-algorithms", + "title": "ASAR Product and Algorithms", + "type": "text/html" + } + ] +} \ No newline at end of file diff --git a/extensions/sar/examples/sentinel1.json b/extensions/sar/examples/sentinel1.json new file mode 100644 index 000000000..7582e1492 --- /dev/null +++ b/extensions/sar/examples/sentinel1.json @@ -0,0 +1,89 @@ +{ + "id": "S1A_EW_GRDM_1SSH_20181103T235855_20181103T235955_024430_02AD5D_5616", + "type": "Feature", + "bbox": [-70.275032,-64.72924,-65.087479,-51.105831], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-67.071648,-64.72924], + [-65.087479,-56.674374], + [-68.033211,-51.105831], + [-70.275032,-59.805672], + [-67.071648,-64.72924] + ] + ] + }, + "properties": { + "datetime": "2018-11-03T23:58:55.617217Z", + "dtr:start_datetime": "2018-11-03T23:58:55.121559Z", + "dtr:end_datetime": "2018-11-03T23:59:55.112875Z", + "sar:platform": "Sentinel-1A", + "sar:constellation": "Sentinel-1", + "sar:instrument": "C-SAR", + "sar:instrument_mode": "EW", + "sar:polarization": ["HH"], + "sar:resolution": [50,50], + "sar:pixel_spacing": [25,25], + "sar:looks": [3,1,2.7], + "sar:frequency_band": "C", + "sar:center_wavelength": 5.546576466235, + "sar:center_frequency": 5.405, + "sar:pass_direction": "ascending", + "sar:absolute_orbit": [24430], + "sar:type": "GRD", + "sar:bands": [ + { + "name": "band_1", + "polarization": "HH" + } + ] + }, + "assets": { + "noises": { + "href": "./annotation/calibration/noise-s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.xml", + "title": "Calibration Schema", + "type": "text/xml", + "checksum:md5": "a30d1711e81a4b11ef67b28744321659" + }, + "calibrations": { + "href": "./annotation/calibration/calibration-s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.xml", + "title": "Noise Schema", + "type": "text/xml", + "checksum:md5": "4fc5351af67db0b8f1746efe421a05e4" + }, + "products": { + "href": "./annotation/s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.xml", + "title": "Product Schema", + "type": "text/xml", + "checksum:md5": "7a7f2588a85362b9beea2a12d4514d45" + }, + "measurement": { + "href": "./measurement/s1a-ew-grd-hh-20181103t235855-20181103t235955-024430-02ad5d-001.tiff", + "title": "Measurements", + "type": "image/tiff", + "sar:bands": [0], + "checksum:md5": "163700a8a6501eccd00b6d3b44ddaed0" + }, + "thumbnail": { + "href": "./preview/quick-look.png", + "title": "Thumbnail", + "type": "image/png", + "checksum:md5": "f52acd32b09769d3b1871b420789456c" + } + }, + "links": [ + { + "rel": "self", + "href": "https://example.com/collections/sentinel-1/items/S1A_EW_GRDM_1SSH_20181103T235855_20181103T235955_024430_02AD5D_5616" + }, + { + "rel": "parent", + "href": "https://example.com/collections/sentinel-1" + }, + { + "rel": "root", + "href": "https://example.com/collections" + } + ] +} \ No newline at end of file diff --git a/extensions/sar/schema.json b/extensions/sar/schema.json new file mode 100644 index 000000000..5eba2a0b9 --- /dev/null +++ b/extensions/sar/schema.json @@ -0,0 +1,215 @@ +{ + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "schema.json#", + "title": "SAR Extension", + "type": "object", + "description": "STAC SAR Extension", + "additionalProperties": true, + "properties": { + "properties": { + "type": "object", + "required": [ + "sar:platform", + "sar:instrument", + "sar:instrument_mode", + "sar:frequency_band", + "sar:polarization", + "sar:pass_direction", + "sar:type" + ], + "properties": { + "sar:platform": { + "title": "Platform", + "type": "string" + }, + "sar:constellation": { + "title": "Constellation", + "type": "string" + }, + "sar:instrument": { + "title": "Instrument", + "type": "string" + }, + "sar:instrument_mode": { + "title": "Instrument Mode", + "type": "string", + "example": "WV" + }, + "sar:frequency_band": { + "title": "Frequency Band", + "type": "string", + "enum": [ + "P", + "L", + "S", + "C", + "X", + "Ku", + "K", + "Ka" + ] + }, + "sar:center_wavelength": { + "title": "Center Wavelength (cm)", + "type": "number" + }, + "sar:center_frequency": { + "title": "Center Wavelength (GHz)", + "type": "number" + }, + "sar:polarization": { + "title": "Polarization", + "type": "array", + "minItems": 1, + "maxItems": 4, + "items": { + "type": "string", + "enum": [ + "HH", + "VV", + "HV", + "VH" + ] + } + }, + "sar:bands": { + "title": "Bands", + "type": "array", + "items": { + "properties": { + "name": { + "title": "Name of the band", + "type": "string" + }, + "common_name": { + "title": "Description of the band", + "type": "string" + }, + "data_type": { + "title": "Data type of the band", + "type": "string", + "examples": [ + "amplitude", + "intensity", + "phase", + "angle", + "sigma0", + "gamma0" + ] + }, + "unit": { + "title": "Unit of the band", + "type": "string" + }, + "polarization": { + "title": "Polarization of the band", + "type": [ + "string", + "null" + ], + "enum": [ + "HH", + "VV", + "HV", + "VH", + null + ] + } + } + } + }, + "sar:pass_direction": { + "title": "Pass direction", + "type": [ + "string", + "null" + ], + "enum": [ + "ascending", + "descending", + null + ] + }, + "sar:type": { + "title": "Product type", + "type": "string", + "examples": [ + "RAW", + "GRD", + "OCN", + "SLC" + ] + }, + "sar:resolution": { + "title": "Resolution (m)", + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number", + "minimum": 0 + } + }, + "sar:pixel_spacing": { + "title": "Pixel spacing (m)", + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number", + "minimum": 0 + } + }, + "sar:looks": { + "title": "Groups of signal samples (looks)", + "type": "array", + "minItems": 2, + "maxItems": 3, + "items": { + "type": "number", + "minimum": 0 + } + }, + "sar:absolute_orbit": { + "title": "Absolute orbit numbers", + "type": "array", + "minItems": 1, + "items": { + "type": [ + "number", + "array" + ], + "minimum": 0, + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number", + "minimum": 0 + } + } + }, + "sar:off_nadir": { + "title": "Viewing angles", + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": [ + "number", + "array" + ], + "minimum": 0, + "maximum": 90, + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number", + "minimum": 0, + "maximum": 90 + } + } + } + } + } + } +} \ No newline at end of file diff --git a/extensions/scientific/example-merraclim.json b/extensions/scientific/example-merraclim.json index c8c0ba200..5bffc2e74 100644 --- a/extensions/scientific/example-merraclim.json +++ b/extensions/scientific/example-merraclim.json @@ -1,5 +1,5 @@ { - "stac_version": "0.6.1", + "stac_version": "0.6.2", "id": "MERRAclim", "description": "MERRAclim, a high-resolution global dataset of remotely sensed bioclimatic variables for ecological modelling.", "keywords": [ diff --git a/extensions/scientific/schema.json b/extensions/scientific/schema.json index 970264820..9637298bc 100644 --- a/extensions/scientific/schema.json +++ b/extensions/scientific/schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-06/schema#", - "id": "schema.json#", + "$id": "schema.json#", "type": "object", "title": "STAC Scientific Extension Spec", "properties": { diff --git a/extensions/single-item/schema.json b/extensions/single-item/schema.json index 31e9fc6b5..71d979b7f 100644 --- a/extensions/single-item/schema.json +++ b/extensions/single-item/schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-06/schema#", - "id": "schema.json#", + "$id": "schema.json#", "type": "object", "title": "Single Item Extension", "properties": { diff --git a/extensions/transaction/WFS3core+STAC+extensions.yaml b/extensions/transaction/WFS3core+STAC+extensions.yaml index e315b486c..faed77743 100644 --- a/extensions/transaction/WFS3core+STAC+extensions.yaml +++ b/extensions/transaction/WFS3core+STAC+extensions.yaml @@ -1,7 +1,7 @@ openapi: 3.0.1 info: title: The SpatioTemporal Asset Catalog API + WFS3 + Transaction extension - version: 0.6.1 + version: 0.6.2 description: >- This is an OpenAPI definition of the core SpatioTemporal Asset Catalog API specification. Any service that implements this endpoint to allow search of @@ -641,7 +641,7 @@ components: properties: stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: type: string example: naip @@ -902,7 +902,7 @@ components: - 'http://www.opengis.net/def/crs/OGC/1.3/CRS84' stac_version: type: string - example: 0.6.1 + example: 0.6.2 id: description: 'identifier of the collection used, for example, in URIs' type: string diff --git a/implementations.md b/implementations.md index 31165cf6e..745f1ae45 100644 --- a/implementations.md +++ b/implementations.md @@ -13,7 +13,7 @@ Browsable online version are usually powered by [stac-browser](https://github.co [Spacenet](https://spacenetchallenge.github.io/) has made all their imagery available as STAC. - Catalog: https://s3.amazonaws.com/spacenet-stac/spacenet-repository.json -- Browsable online version: https://spacenet-stac.netlify.com/ +- Browsable online version: https://spacenet.stac.cloud/ - Source code: https://github.com/SpaceNetChallenge/stac-implementation ### CBERS-4 (STAC 0.6 and 0.5) @@ -29,6 +29,7 @@ STAC items are published to public SNS topics as soon as new scenes are ingested - Catalog: https://cbers-stac-0-6.s3.amazonaws.com/catalog.json - SNS topic: arn:aws:sns:us-east-1:769537946825:cbers-2-stac-0-6-CBERSSTACItemTopic-X1VTPGK5HBZ5 +- Browsable online version: https://cbers.stac.cloud/ #### STAC 0.5 @@ -42,16 +43,28 @@ This catalog contains all Landsat-8 metadata from the [Earth on AWS](https://aws - Catalog: https://landsat-stac.s3.amazonaws.com/catalog.json - SNS topic: arn:aws:sns:us-west-2:552188055668:landsat-stac +- Browsable online version: https://landsat.stac.cloud/ +### Sentinel-2 on AWS (STAC 0.6) -### ISERV (STAC 0.4.1) +This catalog contains all Sentinel-2 metadata from the [Earth on AWS](https://aws.amazon.com/earth/) program. -[ISERV](https://www.nasa.gov/mission_pages/station/research/experiments/867.html) data is hosted by -[Radiant.Earth](http://radiant.earth), created by [Azavea](http://azavea.com). +- Catalog: https://sentinel-stac.s3.amazonaws.com/catalog.json +- SNS topic: arn:aws:sns:eu-central-1:552188055668:sentinel-stac +- Browsable online version: https://sentinel.stac.cloud/ -- Catalog: https://s3-us-west-2.amazonaws.com/radiant-nasa-iserv/iserv.json -- Browsable online version: http://iserv-stac.netlify.com/ -- Source code: https://github.com/raster-foundry/pystac + +### ISERV (STAC 0.6 and 0.4.1) + +[ISERV](https://www.nasa.gov/mission_pages/station/research/experiments/867.html) +data is hosted by [Radiant Earth](http://radiant.earth), created by +[Azavea](http://azavea.com) (0.4.1) and Radiant Earth (0.6.1). + +- Catalog (0.6.1): https://iserv-stac.s3.amazonaws.com/0.6.1/catalog.json (`us-west-2`) +- Catalog (0.4.1): https://s3-us-west-2.amazonaws.com/radiant-nasa-iserv/iserv.json +- Browsable online version: https://iserv.stac.cloud/ +- Source code: https://github.com/radiantearth/iserv-stac-generator (0.6.1, generated from 0.4.1) +- Source code: https://github.com/raster-foundry/pystac (0.4.1) ### Planet Disaster Data (STAC 0.6) @@ -59,6 +72,7 @@ This catalog contains all Landsat-8 metadata from the [Earth on AWS](https://aws of the spec. - Catalog: https://storage.googleapis.com/pdd-stac/disasters/catalog.json +- Browsable online version: https://planet.stac.cloud - Raw catalog files: https://console.cloud.google.com/storage/browser/pdd-stac/disasters/hurricane-harvey/0831/ - Source code: https://github.com/cholmes/pdd-stac/tree/master/disasters/hurricane-harvey @@ -73,6 +87,7 @@ of the spec. * Search endpoint: https://stac.boundlessgeo.io/search/stac * Root catalog: https://stac.boundlessgeo.io/stac +* Browsable online version: https://boundless.stac.cloud/ ### sat-api (0.6) @@ -80,6 +95,7 @@ Development Seed's [sat-api](https://github.com/sat-utils/sat-api) is an easily * Latest release: https://sat-api.developmentseed.org/stac * Development release: https://sat-api-dev.developmentseed.org/stac +* Browsable online version: https://sat-api.stac.cloud/ The latest API should contain the latest available STAC version, while the development API will contain the next version (and may not include all items). @@ -89,6 +105,7 @@ Mirrors the [Google Earth Engine dataset catalogue](https://developers.google.co * Root catalog: https://earthengine.openeo.org/v0.3/stac * No search endpoint +* Browsable online version: https://openeo.stac.cloud/ ## Ecosystem @@ -99,6 +116,8 @@ Other software related to STAC like validators, crawlers etc. * [sat-search](https://github.com/sat-utils/sat-search) is a Python library and CLI for searching (and saving) a dynamic STAC API. * [Serverless STAC Crawler](https://github.com/fredliporace/stac-crawler) is a static STAC crawler that runs on Lambda and SQS integration. * [STAC Browser](https://github.com/radiantearth/stac-browser/) generates/renders browsable HTML versions of STAC catalogs. + * STAC.cloud is a domain for demoing the easy publishing of browsable versions of any online catalog, powered by STAC Browser. Anyone with a catalog to share is welcome to jump on the [STAC Gitter](https://gitter.im/SpatioTemporal-Asset-Catalog/Lobby) and someone there will be able to help set up (your-name).stac.cloud. + * *Note: Eventually STAC Browsers should be published at URL's that more match the catalog publisher, as the STAC vision is one of decentralized nodes, embracing web principles. STAC.cloud is just a way to easily show our progress.* ## Early prototypes / not updated diff --git a/item-spec/item-spec.md b/item-spec/item-spec.md index ac6e0079f..49b823738 100644 --- a/item-spec/item-spec.md +++ b/item-spec/item-spec.md @@ -41,7 +41,7 @@ inherited from GeoJSON. | id | string | **REQUIRED.** Provider identifier. As most geospatial assets are already defined by some identification scheme by the data provider it is recommended to simply use that ID. Data providers are advised to include sufficient information to make their IDs globally unique, including things like unique satellite IDs. | | type | string | **REQUIRED.** Type of the GeoJSON Object. MUST be set to `Feature`. | | geometry | [GeoJSON Geometry Object](https://tools.ietf.org/html/rfc7946#section-3.1) | **REQUIRED.** Defines the full footprint of the asset represented by this item, formatted according to [RFC 7946, section 3.1](https://tools.ietf.org/html/rfc7946). The footprint should be the default GeoJSON geometry, though additional geometries can be included. Specified in Longitude/Latitude based on EPSG:4326. | -| bbox | [number] | **REQUIRED.** Bounding Box of the asset represented by this item. Specified in Longitude/Latitude based on EPSG:4326 - first two numbers are longitude and latitude of lower left corner, followed by longitude and latitude of upper left corner. This field enables more naive clients to easily index and search geospatially. Most software can easily generate them for footprints. STAC compliant APIs are required to compute intersection operations with the item's geometry field, not its bbox. | +| bbox | [number] | **REQUIRED.** Bounding Box of the asset represented by this item. Specified in Longitude/Latitude based on EPSG:4326 - first two numbers are longitude and latitude of lower left corner, followed by longitude and latitude of upper right corner. This field enables more naive clients to easily index and search geospatially. Most software can easily generate them for footprints. STAC compliant APIs are required to compute intersection operations with the item's geometry field, not its bbox. | | properties | Properties Object | **REQUIRED.** A dictionary of additional metadata for the item. | | links | [Link Object] | **REQUIRED.** List of link objects to resources and related URLs. A link with the `rel` set to `self` is required. | | assets | Map | **REQUIRED.** Dictionary of asset objects that can be downloaded, each with a unique key. Some pre-defined keys are listed in the chapter 'Asset types'. | diff --git a/item-spec/json-schema/item.json b/item-spec/json-schema/item.json index 1b591a7fb..9a36f87d2 100644 --- a/item-spec/json-schema/item.json +++ b/item-spec/json-schema/item.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-06/schema#", - "id": "item.json#", + "$id": "item.json#", "title": "STAC Item", "type": "object", "description": "This object represents the metadata for an item in a SpatioTemporal Asset Catalog.", @@ -25,8 +25,11 @@ "required": [ "id", "type", + "geometry", "links", - "assets" + "assets", + "bbox", + "properties" ], "properties": { "id": { @@ -117,4 +120,4 @@ } } } -} \ No newline at end of file +} diff --git a/validation/package-lock.json b/validation/package-lock.json index 952cfd275..88a5b2091 100644 --- a/validation/package-lock.json +++ b/validation/package-lock.json @@ -1,6 +1,6 @@ { "name": "STAC_validation", - "version": "0.6.1", + "version": "0.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/validation/package.json b/validation/package.json index fc8d8a4b8..f094a775a 100644 --- a/validation/package.json +++ b/validation/package.json @@ -1,7 +1,7 @@ { "name": "stac_validation", "description": "Package to validate STAC items, catalogs and collections.", - "version": "0.6.1", + "version": "0.6.2", "author": "STAC Team", "license": "Apache-2.0", "repository": "https://github.com/radiantearth/stac-spec",