diff --git a/.actrc b/.actrc
new file mode 100644
index 000000000..034d7b799
--- /dev/null
+++ b/.actrc
@@ -0,0 +1,4 @@
+--bind
+-P ubuntu-latest=catthehacker/ubuntu:act-latest
+-P windows-latest=catthehacker/ubuntu:act-latest
+-P macos-latest=catthehacker/ubuntu:act-latest
diff --git a/docs/tutorials/creating-a-landsat-stac.ipynb b/docs/tutorials/creating-a-landsat-stac.ipynb
index 7663734c2..34e9a0932 100644
--- a/docs/tutorials/creating-a-landsat-stac.ipynb
+++ b/docs/tutorials/creating-a-landsat-stac.ipynb
@@ -2535,7 +2535,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.3"
+ "version": "3.11.6"
}
},
"nbformat": 4,
diff --git a/pyproject.toml b/pyproject.toml
index 7c20cc2fa..172aedf85 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -105,3 +105,8 @@ members = ["docs"]
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
+
+[dependency-groups]
+dev = [
+ "ipdb>=0.13.13",
+]
diff --git a/pystac/asset.py b/pystac/asset.py
index e42b8237b..509eac9da 100644
--- a/pystac/asset.py
+++ b/pystac/asset.py
@@ -267,7 +267,7 @@ def ext(self) -> AssetExt:
Example::
- asset.ext.proj.epsg = 4326
+ asset.ext.proj.code = "EPSG:4326"
"""
from pystac.extensions.ext import AssetExt
diff --git a/pystac/extensions/eo.py b/pystac/extensions/eo.py
index c9628a3c7..58c9b6be5 100644
--- a/pystac/extensions/eo.py
+++ b/pystac/extensions/eo.py
@@ -656,19 +656,30 @@ def migrate(
]
del obj["properties"][f"eo:{field}"]
- # eo:epsg became proj:epsg
+ # eo:epsg became proj:epsg in Projection Extension <2.0.0 and became
+ # proj:code in Projection Extension 2.0.0
eo_epsg = PREFIX + "epsg"
proj_epsg = projection.PREFIX + "epsg"
- if eo_epsg in obj["properties"] and proj_epsg not in obj["properties"]:
- obj["properties"][proj_epsg] = obj["properties"].pop(eo_epsg)
+ proj_code = projection.PREFIX + "code"
+ if (
+ eo_epsg in obj["properties"]
+ and proj_epsg not in obj["properties"]
+ and proj_code not in obj["properties"]
+ ):
obj["stac_extensions"] = obj.get("stac_extensions", [])
- if (
- projection.ProjectionExtension.get_schema_uri()
- not in obj["stac_extensions"]
+ if set(obj["stac_extensions"]).intersection(
+ projection.ProjectionExtensionHooks.pre_2
):
- obj["stac_extensions"].append(
- projection.ProjectionExtension.get_schema_uri()
+ obj["properties"][proj_epsg] = obj["properties"].pop(eo_epsg)
+ else:
+ obj["properties"][proj_code] = (
+ f"EPSG:{obj['properties'].pop(eo_epsg)}"
)
+ if not projection.ProjectionExtensionHooks().has_extension(obj):
+ obj["stac_extensions"].append(
+ projection.ProjectionExtension.get_schema_uri()
+ )
+
if not any(prop.startswith(PREFIX) for prop in obj["properties"]):
obj["stac_extensions"].remove(EOExtension.get_schema_uri())
diff --git a/pystac/extensions/hooks.py b/pystac/extensions/hooks.py
index f858bc84c..8db8ca4e4 100644
--- a/pystac/extensions/hooks.py
+++ b/pystac/extensions/hooks.py
@@ -6,6 +6,7 @@
from typing import TYPE_CHECKING, Any
import pystac
+from pystac.extensions.base import VERSION_REGEX
from pystac.serialization.identify import STACJSONDescription, STACVersionID
if TYPE_CHECKING:
@@ -43,6 +44,13 @@ def _get_stac_object_types(self) -> set[str]:
def get_object_links(self, obj: STACObject) -> list[str | pystac.RelType] | None:
return None
+ def has_extension(self, obj: dict[str, Any]) -> bool:
+ schema_startswith = VERSION_REGEX.split(self.schema_uri)[0] + "/"
+ return any(
+ uri.startswith(schema_startswith) or uri in self.prev_extension_ids
+ for uri in obj.get("stac_extensions", [])
+ )
+
def migrate(
self, obj: dict[str, Any], version: STACVersionID, info: STACJSONDescription
) -> None:
diff --git a/pystac/extensions/projection.py b/pystac/extensions/projection.py
index 8d3cb1523..86f076382 100644
--- a/pystac/extensions/projection.py
+++ b/pystac/extensions/projection.py
@@ -21,17 +21,20 @@
SummariesExtension,
)
from pystac.extensions.hooks import ExtensionHooks
+from pystac.serialization.identify import STACJSONDescription, STACVersionID
T = TypeVar("T", pystac.Item, pystac.Asset, pystac.ItemAssetDefinition)
-SCHEMA_URI: str = "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+SCHEMA_URI: str = "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
SCHEMA_URIS: list[str] = [
"https://stac-extensions.github.io/projection/v1.0.0/schema.json",
+ "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
SCHEMA_URI,
]
PREFIX: str = "proj:"
# Field names
+CODE_PROP: str = PREFIX + "code"
EPSG_PROP: str = PREFIX + "epsg"
WKT2_PROP: str = PREFIX + "wkt2"
PROJJSON_PROP: str = PREFIX + "projjson"
@@ -65,7 +68,9 @@ class ProjectionExtension(
def apply(
self,
- epsg: int | None,
+ *,
+ epsg: int | None = None,
+ code: str | None = None,
wkt2: str | None = None,
projjson: dict[str, Any] | None = None,
geometry: dict[str, Any] | None = None,
@@ -77,7 +82,10 @@ def apply(
"""Applies Projection extension properties to the extended Item.
Args:
- epsg : REQUIRED. EPSG code of the datasource.
+ epsg : Code of the datasource. Example: 4326. One of ``code`` and
+ ``epsg`` must be provided.
+ code : Code of the datasource. Example: "EPSG:4326". One of ``code`` and
+ ``epsg`` must be provided.
wkt2 : WKT2 string representing the Coordinate Reference
System (CRS) that the ``geometry`` and ``bbox`` fields represent
projjson : PROJJSON dict representing the
@@ -96,7 +104,15 @@ def apply(
transform : The affine transformation coefficients for
the default grid
"""
- self.epsg = epsg
+ if epsg is not None and code is not None:
+ raise KeyError(
+ "Only one of the options ``code`` and ``epsg`` should be specified."
+ )
+ elif epsg:
+ self.epsg = epsg
+ else:
+ self.code = code
+
self.wkt2 = wkt2
self.projjson = projjson
self.geometry = geometry
@@ -117,11 +133,33 @@ def epsg(self) -> int | None:
It should also be set to ``None`` if a CRS exists, but for which there is no
valid EPSG code.
"""
- return self._get_property(EPSG_PROP, int)
+ if self.code is not None and self.code.startswith("EPSG:"):
+ return int(self.code.replace("EPSG:", ""))
+ return None
@epsg.setter
def epsg(self, v: int | None) -> None:
- self._set_property(EPSG_PROP, v, pop_if_none=False)
+ if v is None:
+ self.code = None
+ else:
+ self.code = f"EPSG:{v}"
+
+ @property
+ def code(self) -> str | None:
+ """Get or set the code of the datasource.
+
+ Added in version 2.0.0 of this extension replacing "proj:epsg".
+
+ Projection codes are identified by a string. The `proj `_
+ library defines projections using "authority:code", e.g., "EPSG:4326" or
+ "IAU_2015:30100". Different projection authorities may define different
+ string formats.
+ """
+ return self._get_property(CODE_PROP, str)
+
+ @code.setter
+ def code(self, v: int | None) -> None:
+ self._set_property(CODE_PROP, v, pop_if_none=False)
@property
def wkt2(self) -> str | None:
@@ -168,13 +206,13 @@ def crs_string(self) -> str | None:
This string can be used to feed, e.g., ``rasterio.crs.CRS.from_string``.
The string is determined by the following heuristic:
- 1. If an EPSG code is set, return "EPSG:{code}", else
+ 1. If a code is set, return the code string, else
2. If wkt2 is set, return the WKT string, else,
3. If projjson is set, return the projjson as a string, else,
4. Return None
"""
- if self.epsg:
- return f"EPSG:{self.epsg}"
+ if self.code:
+ return self.code
elif self.wkt2:
return self.wkt2
elif self.projjson:
@@ -189,7 +227,7 @@ def geometry(self) -> dict[str, Any] | None:
This dict should be formatted according the Polygon object format specified in
`RFC 7946, sections 3.1.6 `_,
except not necessarily in EPSG:4326 as required by RFC7946. Specified based on
- the ``epsg``, ``projjson`` or ``wkt2`` fields (not necessarily EPSG:4326).
+ the ``code``, ``projjson`` or ``wkt2`` fields (not necessarily EPSG:4326).
Ideally, this will be represented by a Polygon with five coordinates, as the
item in the asset data CRS should be a square aligned to the original CRS grid.
"""
@@ -204,7 +242,7 @@ def bbox(self) -> list[float] | None:
"""Get or sets the bounding box of the assets represented by this item in the
asset data CRS.
- Specified as 4 or 6 coordinates based on the CRS defined in the ``epsg``,
+ Specified as 4 or 6 coordinates based on the CRS defined in the ``code``,
``projjson`` or ``wkt2`` properties. First two numbers are coordinates of the
lower left corner, followed by coordinates of upper right corner, e.g.,
``[west, south, east, north]``, ``[xmin, ymin, xmax, ymax]``,
@@ -382,16 +420,32 @@ class SummariesProjectionExtension(SummariesExtension):
defined in the :stac-ext:`Projection Extension `.
"""
+ @property
+ def code(self) -> list[str] | None:
+ """Get or sets the summary of :attr:`ProjectionExtension.code` values
+ for this Collection.
+ """
+ return self.summaries.get_list(CODE_PROP)
+
+ @code.setter
+ def code(self, v: list[str] | None) -> None:
+ self._set_summary(CODE_PROP, v)
+
@property
def epsg(self) -> list[int] | None:
- """Get or sets the summary of :attr:`ProjectionExtension.epsg` values
+ """Get the summary of :attr:`ProjectionExtension.epsg` values
for this Collection.
"""
- return self.summaries.get_list(EPSG_PROP)
+ if self.code is None:
+ return None
+ return [int(code.replace("EPSG:", "")) for code in self.code if "EPSG:" in code]
@epsg.setter
def epsg(self, v: list[int] | None) -> None:
- self._set_summary(EPSG_PROP, v)
+ if v is None:
+ self.code = None
+ else:
+ self.code = [f"EPSG:{epsg}" for epsg in v]
class ProjectionExtensionHooks(ExtensionHooks):
@@ -401,7 +455,27 @@ class ProjectionExtensionHooks(ExtensionHooks):
"projection",
*[uri for uri in SCHEMA_URIS if uri != SCHEMA_URI],
}
+ pre_2 = {
+ "proj",
+ "projection",
+ "https://stac-extensions.github.io/projection/v1.0.0/schema.json",
+ "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+ }
stac_object_types = {pystac.STACObjectType.ITEM}
+ def migrate(
+ self, obj: dict[str, Any], version: STACVersionID, info: STACJSONDescription
+ ) -> None:
+ if not self.has_extension(obj):
+ return
+
+ # proj:epsg moved to proj:code
+ if "proj:epsg" in obj["properties"]:
+ epsg = obj["properties"]["proj:epsg"]
+ obj["properties"]["proj:code"] = f"EPSG:{epsg}"
+ del obj["properties"]["proj:epsg"]
+
+ super().migrate(obj, version, info)
+
PROJECTION_EXTENSION_HOOKS: ExtensionHooks = ProjectionExtensionHooks()
diff --git a/pystac/item.py b/pystac/item.py
index c2af036df..e2a8d1cf9 100644
--- a/pystac/item.py
+++ b/pystac/item.py
@@ -524,7 +524,7 @@ def ext(self) -> ItemExt:
Example::
- item.ext.proj.epsg = 4326
+ item.ext.proj.code = "EPSG:4326"
"""
from pystac.extensions.ext import ItemExt
diff --git a/pystac/static/fields-normalized.json b/pystac/static/fields-normalized.json
index 9e7b2af36..d34425639 100644
--- a/pystac/static/fields-normalized.json
+++ b/pystac/static/fields-normalized.json
@@ -1 +1,2457 @@
-{"metadata":{"id":{"label":"Identifier"},"keywords":{"label":"Keywords"},"datetime":{"label":"Time of Data","format":"Timestamp","summary":false},"title":{"label":"Title","summary":false},"description":{"label":"Description","format":"CommonMark","summary":false},"start_datetime":{"label":"Time of Data begins","format":"Timestamp","summary":false},"end_datetime":{"label":"Time of Data ends","format":"Timestamp","summary":false},"created":{"label":"Created","format":"Timestamp","summary":"r"},"updated":{"label":"Updated","format":"Timestamp","summary":"r"},"published":{"label":"Published","format":"Timestamp","summary":"r"},"expires":{"label":"Expires","format":"Timestamp","summary":"r"},"unpublished":{"label":"Unpublished","format":"Timestamp","summary":"r"},"license":{"label":"License","format":"License","summary":false},"providers":{"label":"Providers","format":"Providers","summary":false},"platform":{"label":"Platform"},"instruments":{"label":"Instruments","format":"CSV"},"constellation":{"label":"Constellation"},"mission":{"label":"Mission"},"gsd":{"label":"GSD","explain":"Ground Sample Distance","unit":"m"},"version":{"label":"Data Version","summary":false},"deprecated":{"label":"Deprecated","summary":false},"language":{"label":"Current Language","ext":"language","summary":"v","properties":{"name":{"label":"Name"},"alternate":{"label":"Alternate Name"},"code":{"label":"Code"},"dir":{"label":"Direction","explain":"Reading and writing direction","mapping":{"ltr":"left-to-right","rtl":"right-to-left"},"default":"ltr"}}},"languages":{"label":"Available Languages","ext":"language","summary":false,"items":{"name":{"label":"Name","sortable":true,"order":0},"alternate":{"label":"Alternate Name","sortable":true,"order":1},"code":{"label":"Code","sortable":true,"order":2},"dir":{"label":"Direction","explain":"Reading and writing direction","sortable":true,"order":3,"mapping":{"ltr":"left-to-right","rtl":"right-to-left"},"default":"ltr"}},"itemOrder":["name","alternate","code","dir"]},"crs":{"label":"CRS","format":"CRS","explain":"Coordinate Reference System"},"anon:size":{"label":"Uncertainty","unit":"°","explain":"The size of one side of the anonymized bounding box"},"anon:warning":{"label":"Warning","summary":false},"classification:classes":{"summary":false,"label":"Classes","items":{"color_hint":{"label":"Color","order":0,"format":"HexColor"},"value":{"label":"Value","order":1},"title":{"label":"Title","order":2},"name":{"label":"Identifier","order":3},"description":{"label":"Description","order":4,"format":"CommonMark"},"nodata":{"label":"No-data value","order":5,"default":false}},"itemOrder":["color_hint","value","title","name","description","nodata"]},"classification:bitfields":{"summary":false,"label":"Bit Mask","items":{"name":{"label":"Name","order":0},"offset":{"label":"Offset","explain":"Offset to the first bit","order":1},"length":{"label":"Number of bits","order":2},"description":{"label":"Description","order":3,"format":"CommonMark"},"classes":{"alias":"classification:classes","summary":false,"label":"Classes","items":{"color_hint":{"label":"Color","order":0,"format":"HexColor"},"value":{"label":"Value","order":1},"title":{"label":"Title","order":2},"name":{"label":"Identifier","order":3},"description":{"label":"Description","order":4,"format":"CommonMark"},"nodata":{"label":"No-data value","order":5,"default":false}},"itemOrder":["color_hint","value","title","name","description","nodata"]},"roles":{"label":"Purpose"}},"itemOrder":["classes","name","offset","length","description","roles"]},"cube:dimensions":{"label":"Dimensions","summary":false,"listWithKeys":true,"items":{"type":{"label":"Type","order":0},"axis":{"label":"Axis","order":1},"description":{"label":"Description","format":"CommonMark","order":2},"extent":{"label":"Extent","format":"Extent","order":3},"values":{"label":"Values","order":4},"step":{"label":"Step","order":5},"unit":{"alias":"file:unit","order":5,"label":"Unit of Values"},"reference_system":{"label":"Reference System","explain":"Coordinate / Temporal / Other Reference System","order":6}},"itemOrder":["type","axis","description","extent","values","step","unit","reference_system"]},"cube:variables":{"label":"Variables","summary":false,"listWithKeys":true,"items":{"dimensions":{"label":"Dimensions","order":0},"type":{"label":"Type","order":1,"mapping":{"data":"Measured values","auxiliary":"Coordinate data"}},"description":{"label":"Description","format":"CommonMark","order":2},"extent":{"label":"Extent","format":"Extent","order":3},"values":{"label":"Values","order":4},"step":{"label":"Step","order":5},"unit":{"alias":"file:unit","order":6,"label":"Unit of Values"}},"itemOrder":["dimensions","type","description","extent","values","step","unit"]},"eo:bands":{"label":"Spectral Bands","items":{"name":{"label":"Name","sortable":true,"id":true,"order":0},"common_name":{"label":"Common Name","sortable":true,"order":1},"description":{"label":"Description","format":"CommonMark","order":2},"center_wavelength":{"label":"Wavelength","explain":"The center wavelength of the band","unit":"μm","sortable":true,"order":5},"full_width_half_max":{"label":"FWHM","explain":"Full Width Half Max","unit":"μm","sortable":true,"order":6},"gsd":{"alias":"gsd","sortable":true,"order":3,"label":"GSD","explain":"Ground Sample Distance","unit":"m"},"cloud_cover":{"alias":"eo:cloud_cover","sortable":true,"order":4,"label":"Cloud Cover","unit":"%"},"solar_illumination":{"label":"Solar Illumination","sortable":true,"order":7,"unit":"W/m²/μm"},"classification:classes":{"alias":"classification:classes","summary":false,"label":"Classes","items":{"color_hint":{"label":"Color","order":0,"format":"HexColor"},"value":{"label":"Value","order":1},"title":{"label":"Title","order":2},"name":{"label":"Identifier","order":3},"description":{"label":"Description","order":4,"format":"CommonMark"},"nodata":{"label":"No-data value","order":5,"default":false}},"itemOrder":["color_hint","value","title","name","description","nodata"]},"classification:bitfields":{"alias":"classification:bitfields","summary":false,"label":"Bit Mask","items":{"name":{"label":"Name","order":0},"offset":{"label":"Offset","explain":"Offset to the first bit","order":1},"length":{"label":"Number of bits","order":2},"description":{"label":"Description","order":3,"format":"CommonMark"},"classes":{"alias":"classification:classes","summary":false,"label":"Classes","items":{"color_hint":{"label":"Color","order":0,"format":"HexColor"},"value":{"label":"Value","order":1},"title":{"label":"Title","order":2},"name":{"label":"Identifier","order":3},"description":{"label":"Description","order":4,"format":"CommonMark"},"nodata":{"label":"No-data value","order":5,"default":false}},"itemOrder":["color_hint","value","title","name","description","nodata"]},"roles":{"label":"Purpose"}},"itemOrder":["classes","name","offset","length","description","roles"]}},"itemOrder":["name","classification:bitfields","classification:classes","common_name","description","gsd","cloud_cover","center_wavelength","full_width_half_max","solar_illumination"]},"eo:cloud_cover":{"label":"Cloud Cover","unit":"%"},"eo:snow_cover":{"label":"Snow/Ice Cover","unit":"%"},"forecast:reference_datetime":{"label":"Reference Time","format":"Timestamp","summary":"r"},"forecast:horizon":{"label":"Forecast Horizon","explain":"The time between the reference time and the forecast time","format":"Duration","summary":"r"},"forecast:duration":{"label":"Forecast Length","format":"Duration","summary":"r"},"file:bits_per_sample":{"label":"Bits per Sample"},"file:byte_order":{"label":"Byte Order"},"file:checksum":{"label":"Checksum","format":"Checksum","summary":false},"file:data_type":{"label":"Data Type of Values","format":"FileDataType"},"file:header_size":{"label":"Header Size","format":"FileSize","summary":false},"file:nodata":{"label":"No-Data Values","format":"CSV","summary":false},"file:size":{"label":"Size","format":"FileSize","summary":false},"file:unit":{"label":"Unit of Values"},"file:values":{"label":"Map of Values","summary":false,"items":{"values":{"label":"Values","format":"CSV","order":1},"summary":{"label":"Summary","order":0}},"itemOrder":["summary","values"]},"file:local_path":{"label":"Local Path","summary":false},"goes:orbital_slot":{"label":"Orbital Slot"},"goes:system_environment":{"label":"System Environment","mapping":{"OR":"Operational system, real-time data","OT":"Operational system, test data","IR":"Test system, real-time data","IT":"Test system, test data","IP":"Test system, playback data","IS":"Test system, simulated data"}},"goes:image_type":{"label":"Area","mapping":{"FULL DISK":"The Americas (full disk)","CONUS":"North America (continental US)","MESOSCALE":"Central/South America (mesoscale)"}},"goes:mesoscale_image_number":{"label":"Area in Central/South America","mapping":{"1":"Region 1","2":"Region 2"}},"goes:mode":{"label":"Capture Mode","mapping":{"3":"3: 1x full disk, 3x continental US, 30x mesoscale region 1, 30x mesoscale region 2 (every 15 minutes)","4":"4: 1x full disk (every 5 minutes)","6":"6: 1x full disk, 2x continental US, 20x mesoscale region 1, 20x mesoscale region 2 (every 10 minutes)"}},"goes:group_time_threshold":{"label":"Time Threshold in a Group","explain":"Lightning group maximum time difference among lightning events in a group","unit":"s"},"goes:flash_time_threshold":{"label":"Time Threshold in a Flash","explain":"Lightning flash maximum time difference among lightning events in a flash","unit":"s"},"goes:lightning_wavelength":{"label":"Central Wavelength","unit":"nm"},"goes:yaw_flip_flag":{"label":"Yaw Flip Configuration","explain":"Flag indicating that the spacecraft is operating in yaw flip configuration.","mapping":{"0":"Upright","1":"Neither","2":"Inverted"}},"goes:event_count":{"label":"Lightning Events"},"goes:group_count":{"label":"Lightning Groups"},"goes:flash_count":{"label":"Lightning Flashes"},"goes:nominal_satellite_subpoint_lat":{"label":"Satellite Subpoint Latitude","unit":"°N"},"goes:nominal_satellite_subpoint_lon":{"label":"Satellite Subpoint Longitude","unit":"°E"},"goes:nominal_satellite_height":{"label":"Satellite Height","explain":"Nominal satellite height above GRS 80 ellipsoid","unit":"km"},"goes:percent_navigated_L1b_events":{"label":"Events navigated by Instrument","format":"Percent0to1","unit":"%"},"goes:percent_uncorrectable_L0_errors":{"label":"Data Lost","format":"Percent0to1","unit":"%"},"grid:code":{"label":"Grid","format":"GridCode"},"raster:bands":{"label":"Bands","items":{"nodata":{"alias":"file:nodata","label":"No-Data Values","format":"CSV","summary":false},"sampling":{"label":"Sampling","mapping":{"area":"Area","point":"Point (at pixel center)"}},"data_type":{"alias":"file:data_type","label":"Data Type of Values","format":"FileDataType"},"bits_per_sample":{"alias":"file:bits_per_sample","label":"Bits per Sample"},"spatial_resolution":{"label":"Resolution","explain":"Average spatial resolution","unit":"m"},"statistics":{"label":"Statistics","items":{"mean":{"label":"Average"},"maximum":{"label":"Max.","explain":"Maxmimum value"},"minimum":{"label":"Min.","explain":"Minimum value"},"stdev":{"label":"Std. Dev.","explain":"Standard Deviation"},"valid_percent":{"label":"Valid","explain":"Percentage of valid pixels","unit":"%"}},"itemOrder":["mean","maximum","minimum","stdev","valid_percent"]},"unit":{"alias":"file:unit","label":"Unit of Values"},"scale":{"label":"Scale"},"offset":{"label":"Offset"},"histogram":{"label":"Histogram","custom":true},"classification:classes":{"alias":"classification:classes","summary":false,"label":"Classes","items":{"color_hint":{"label":"Color","order":0,"format":"HexColor"},"value":{"label":"Value","order":1},"title":{"label":"Title","order":2},"name":{"label":"Identifier","order":3},"description":{"label":"Description","order":4,"format":"CommonMark"},"nodata":{"label":"No-data value","order":5,"default":false}},"itemOrder":["color_hint","value","title","name","description","nodata"]},"classification:bitfields":{"alias":"classification:bitfields","summary":false,"label":"Bit Mask","items":{"name":{"label":"Name","order":0},"offset":{"label":"Offset","explain":"Offset to the first bit","order":1},"length":{"label":"Number of bits","order":2},"description":{"label":"Description","order":3,"format":"CommonMark"},"classes":{"alias":"classification:classes","summary":false,"label":"Classes","items":{"color_hint":{"label":"Color","order":0,"format":"HexColor"},"value":{"label":"Value","order":1},"title":{"label":"Title","order":2},"name":{"label":"Identifier","order":3},"description":{"label":"Description","order":4,"format":"CommonMark"},"nodata":{"label":"No-data value","order":5,"default":false}},"itemOrder":["color_hint","value","title","name","description","nodata"]},"roles":{"label":"Purpose"}},"itemOrder":["classes","name","offset","length","description","roles"]}},"itemOrder":["classification:bitfields","bits_per_sample","classification:classes","data_type","histogram","nodata","offset","spatial_resolution","sampling","scale","statistics","unit"]},"label:properties":{"label":"Properties","null":"raster data"},"label:classes":{"label":"Classes","items":{"name":{"label":"Name","null":"raster-formatted","sortable":true,"id":true},"classes":{"label":"Classes"}},"itemOrder":["name","classes"]},"label:description":{"label":"Description","format":"CommonMark","summary":false},"label:type":{"label":"Type"},"label:tasks":{"label":"Tasks"},"label:methods":{"label":"Methods"},"label:overviews":{"label":"Overviews","summary":false,"items":{"property_key":{"label":"Property Key","id":true},"counts":{"label":"Counts","custom":true},"statistics":{"label":"Statistics","custom":true}},"itemOrder":["property_key","counts","statistics"]},"mgrs:latitude_band":{"label":"Latitude Band"},"mgrs:grid_square":{"label":"Grid Square"},"mgrs:utm_zone":{"label":"UTM Zone"},"noaa_mrms_qpe:pass":{"label":"Pass Number","mapping":{"1":"1 (less latency / less gauges)","2":"2 (more latency / more gauges)"}},"noaa_mrms_qpe:period":{"label":"Accumulation Period","unit":"h"},"noaa_mrms_qpe:region":{"label":"Region","mapping":{"CONUS":"Continental US","HAWAII":"Hawaii","GUAM":"Guam","ALASKA":"Alaska","CARIB":"Caribbean Islands"}},"openeo:status":{"label":"Processing Status"},"api_version":{"label":"API Version","ext":"openeo"},"backend_version":{"label":"Back-End Version","ext":"openeo"},"production":{"label":"Production-Ready","ext":"openeo"},"endpoints":{"label":"Supported Endpoints","ext":"openeo","summary":false,"items":{"path":{"label":"Path Template","order":0},"methods":{"label":"HTTP Methods","order":1,"format":"CSV"}},"itemOrder":["path","methods"]},"billing":{"label":"Billing","ext":"openeo","custom":true,"summary":false},"order:status":{"label":"Status","mapping":{"orderable":"Orderable (data can be ordered)","ordered":"Ordered (preparing to deliver data)","pending":"Pending (waiting for activation)","shipping":"Shipping (data is getting processed)","succeeded":"Delivered (data is available)","failed":"Failed (unable to deliver)","canceled":"Canceled (delivery stopped)"}},"order:id":{"label":"Identifier"},"order:date":{"label":"Submitted","format":"Timestamp","summary":"r"},"order:expiration_date":{"alias":"expires","label":"Expires","format":"Timestamp","summary":"r"},"pc:count":{"label":"Points","explain":"Number of Points"},"pc:type":{"label":"Type"},"pc:encoding":{"label":"Format"},"pc:schemas":{"label":"Schemas","summary":false,"items":{"name":{"label":"Name","sortable":true,"id":true},"size":{"label":"Size","unit":"bytes","sortable":true},"type":{"label":"Type","sortable":true}},"itemOrder":["name","size","type"]},"pc:density":{"label":"Density"},"pc:statistics":{"label":"Statistics","summary":"s","items":{"name":{"label":"Name","id":true},"position":{"label":"Position"},"average":{"label":"Average"},"count":{"label":"Count"},"maximum":{"label":"Max.","explain":"Maxmimum value"},"minimum":{"label":"Min.","explain":"Minimum value"},"stddev":{"label":"Std. Dev.","explain":"Standard Deviation"},"variance":{"label":"Variance"}},"itemOrder":["name","average","count","maximum","minimum","position","stddev","variance"]},"processing:expression":{"label":"Processing Instructions","summary":false},"processing:lineage":{"label":"Lineage","format":"CommonMark","summary":false},"processing:level":{"label":"Level"},"processing:facility":{"label":"Facility"},"processing:software":{"label":"Software","format":"Software","summary":false},"proj:epsg":{"label":"EPSG Code","format":"EPSG","summary":"v"},"proj:wkt2":{"label":"WKT2","explain":"Well-Known Text, version 2","format":"WKT2","summary":false},"proj:projjson":{"label":"PROJJSON","explain":"JSON encoding of WKT2","format":"PROJJSON","summary":false},"proj:geometry":{"label":"Footprint","custom":true,"summary":false},"proj:bbox":{"label":"Bounding Box","custom":true,"summary":false},"proj:centroid":{"label":"Centroid","custom":true,"summary":false},"proj:shape":{"label":"Image Dimensions","format":"Shape","summary":false},"proj:transform":{"label":"Transformation Matrix","format":"Transform","summary":false},"sar:instrument_mode":{"label":"Instrument Mode"},"sar:frequency_band":{"label":"Frequency Band"},"sar:center_frequency":{"label":"Center Frequency","unit":"GHz"},"sar:polarizations":{"label":"Polarizations","format":"CSV"},"sar:product_type":{"label":"Product Type"},"sar:resolution_range":{"label":"Range Resolution","unit":"m"},"sar:resolution_azimuth":{"label":"Azimuth Resolution","unit":"m"},"sar:pixel_spacing_range":{"label":"Range Pixel Spacing","unit":"m"},"sar:pixel_spacing_azimuth":{"label":"Aziumth Pixel Spacing","unit":"m"},"sar:looks_range":{"label":"Range Looks"},"sar:looks_azimuth":{"label":"Azimuth Looks"},"sar:looks_equivalent_number":{"label":"ENL","explain":"Equivalent Number of Looks"},"sar:observation_direction":{"label":"Observation Direction"},"sat:platform_international_designator":{"label":"Int. Designator","explain":"International designator for the platform, also known as COSPAR ID and NSSDCA ID."},"sat:orbit_state":{"label":"Orbit State"},"sat:absolute_orbit":{"label":"Abs. Orbit Number","explain":"Absolute Orbit Number"},"sat:relative_orbit":{"label":"Rel. Orbit Number","explain":"Relative Orbit Number"},"sat:anx_datetime":{"label":"ANX Time","explain":"Ascending Node Crossing time","summary":"r"},"sci:doi":{"label":"DOI","format":"DOI"},"sci:citation":{"label":"Citation"},"sci:publications":{"label":"Publications","summary":false,"items":{"citation":{"label":"Publication","sortable":true,"order":0},"doi":{"label":"DOI","format":"DOI","sortable":true,"order":1}},"itemOrder":["citation","doi"]},"ssys:targets":{"label":"Target Body"},"storage:platform":{"label":"Provider","mapping":{"ALIBABA":"Alibaba Cloud","AWS":"Amazon AWS","AZURE":"Microsoft Azure","GCP":"Google Cloud Platform","IBM":"IBM Cloud","ORACLE":"Oracle Cloud"}},"storage:region":{"label":"Region"},"storage:requester_pays":{"label":"Requester Pays"},"storage:tier":{"label":"Tier Type"},"table:columns":{"label":"Columns","items":{"name":{"label":"Name","sortable":true,"id":true,"order":0},"type":{"label":"Data Type","sortable":true,"order":1},"description":{"label":"Description","format":"CommonMark","order":2}},"itemOrder":["name","type","description"]},"table:primary_geometry":{"label":"Primary Geometry Column"},"table:row_count":{"label":"Rows"},"table:tables":{"label":"Tables","summary":false,"listWithKeys":true,"items":{"name":{"label":"Name","sortable":true,"id":true,"order":0},"description":{"label":"Description","format":"CommonMark","order":1}},"itemOrder":["name","description"]},"tiles:tile_matrix_sets":{"label":"Tile Matrix Sets","custom":true,"summary":false},"tiles:tile_matrix_set_links":{"label":"Tile Matrix Set Links","custom":true,"summary":false},"view:off_nadir":{"label":"Off-Nadir Angle","unit":"°"},"view:incidence_angle":{"label":"Incidence Angle","unit":"°"},"view:azimuth":{"label":"Viewing Azimuth","unit":"°"},"view:sun_azimuth":{"label":"Sun Azimuth","unit":"°"},"view:sun_elevation":{"label":"Sun Elevation","unit":"°"},"pl:black_fill":{"label":"Unfilled Image Parts","unit":"%"},"pl:clear_percent":{"label":"Clear Sky","unit":"%"},"pl:grid_cell":{"label":"Grid Cell"},"pl:ground_control":{"label":"Positional Accuracy"},"pl:ground_control_ratio":{"label":"Successful Rectification Ratio"},"pl:item_type":{"label":"Type"},"pl:pixel_resolution":{"label":"Spatial Resolution","unit":"m"},"pl:publishing_stage":{"label":"Publishing Stage","mapping":{"preview":"Preview","standard":"Standard","finalized":"Finalized"}},"pl:quality_category":{"label":"Quality Category","mapping":{"standard":"Standard","test":"Test"}},"pl:strip_id":{"label":"Image Strip ID"},"gee:type":{"label":"Type","mapping":{"image":"Single image","image_collection":"Image collection","table":"Table"}},"gee:cadence":{"label":"Cadence"},"gee:schema":{"label":"Variables","items":{"name":{"label":"Name"},"description":{"label":"Description"},"type":{"label":"Data Type"}},"summary":false,"itemOrder":["type","description","name"]},"gee:revisit_interval":{"label":"Revisit Interval"},"gee:terms_of_use":{"label":"Terms of Use","format":"CommonMark","summary":false},"gee:visualizations":{"label":"Visualizations","custom":true,"summary":false},"landsat:scene_id":{"label":"Scene ID"},"landsat:collection_category":{"label":"Collection Category"},"landsat:collection_number":{"label":"Collection Number"},"landsat:wrs_type":{"label":"WRS Type","explain":"Worldwide Reference System Type"},"landsat:wrs_path":{"label":"WRS Path","explain":"Worldwide Reference System Path"},"landsat:wrs_row":{"label":"WRS Row","explain":"Worldwide Reference System Row"},"landsat:cloud_cover_land":{"label":"Land Cloud Cover","unit":"%"},"msft:container":{"label":"Container"},"msft:storage_account":{"label":"Storage Account"},"msft:short_description":{"label":"Summary","summary":false},"sentinel:utm_zone":{"label":"UTM Zone"},"sentinel:latitude_band":{"label":"Latitude Band"},"sentinel:grid_square":{"label":"Grid Square"},"sentinel:sequence":{"label":"Sequence"},"sentinel:product_id":{"label":"Product ID","summary":"s"},"sentinel:data_coverage":{"label":"Data Coverage","unit":"%"},"sentinel:valid_cloud_cover":{"label":"Valid Cloud Cover"},"cbers:data_type":{"label":"Processing Level","explain":"Geolocation precision level","mapping":{"L2":"Geolocation using only satellite telemetry","L3":"Control points used to geolocate image, no terrain correction","L4":"Control points used to geolocate image, orthorectified"},"summary":"v"},"cbers:path":{"label":"Reference Grid Path"},"cbers:row":{"label":"Reference Grid Row"},"card4l:specification":{"label":"Specification","mapping":{"SR":"Surface Reflectance (Optical)","ST":"Surface Temperature (Optical)","NRB":"Normalized Radar Backscatter (SAR)","POL":"Polarimetric Radar (SAR)"}},"card4l:specification_version":{"label":"Specification Version"},"card4l:orbit_mean_altitude":{"label":"Platform Altitude","unit":"m"},"card4l:incidence_angle_near_range":{"label":"Incidence Angle (near)","unit":"°"},"card4l:incidence_angle_far_range":{"label":"Incidence Angle (far)","unit":"°"},"card4l:noise_equivalent_intensity":{"label":"Noise Equivalent Intensity","unit":"dB"},"card4l:mean_faraday_rotation_angle":{"label":"Mean Faraday Rotation","unit":"°"},"card4l:speckle_filtering":{"label":"Speckle Filtering","custom":true,"summary":false,"null":"not applied"},"card4l:relative_rtc_accuracy":{"label":"Rel. RTC Accuracy","explain":"Relative accuracy of the Radiometric Terrain Correction","unit":"dB"},"card4l:absolute_rtc_accuracy":{"label":"Abs. RTC Accuracy","explain":"Absolute accuracy of the Radiometric Terrain Correction","unit":"dB"},"card4l:northern_geometric_accuracy":{"label":"Northern Geometric Accuracy","unit":"m"},"card4l:eastern_geometric_accuracy":{"label":"Eastern Geometric Accuracy","unit":"m"},"card4l:ellipsoidal_height":{"label":"Ellipsoidal Height","unit":"m"},"geoadmin:variant":{"label":"Product Variant","mapping":{"krel":"RGB color with relief","komb":"RGB color without relief","kgrel":"Grayscale with relief","kgrs":"Grayscale without relief"}}}}
+{
+ "assets": {
+ "href": {
+ "label": "URL",
+ "format": "Url"
+ },
+ "hreflang": {
+ "label": "Language",
+ "format": "LanguageCode"
+ },
+ "type": {
+ "label": "File Format",
+ "explain": "Based on the IANA media (MIME) types",
+ "format": "MediaType"
+ },
+ "roles": {
+ "label": "Purpose",
+ "mapping": {
+ "thumbnail": "Preview",
+ "overview": "Overview",
+ "visual": "Visualization",
+ "data": "Data",
+ "metadata": "Metadata",
+ "graphic": "Illustration"
+ }
+ },
+ "alternate": {
+ "label": "Alternatives",
+ "listWithKeys": true,
+ "items": {
+ "href": {
+ "label": "URL",
+ "format": "Url"
+ },
+ "title": {
+ "alias": "title",
+ "label": "Title",
+ "summary": false
+ },
+ "description": {
+ "alias": "description",
+ "label": "Description",
+ "format": "CommonMark",
+ "summary": false
+ }
+ },
+ "summary": false,
+ "ext": "alternate",
+ "itemOrder": [
+ "description",
+ "title",
+ "href"
+ ]
+ },
+ "pl:asset_type": {
+ "label": "Asset Type"
+ },
+ "pl:bundle_type": {
+ "label": "Bundle Type"
+ },
+ "table:storage_options": {
+ "alias": "xarray:storage_options",
+ "label": "fsspec Options",
+ "custom": true,
+ "summary": false
+ },
+ "xarray:open_kwargs": {
+ "label": "Read Options",
+ "custom": true,
+ "summary": false
+ },
+ "xarray:storage_options": {
+ "label": "fsspec Options",
+ "custom": true,
+ "summary": false
+ }
+ },
+ "extensions": {
+ "alternate": {
+ "label": "Alternative Access Methods"
+ },
+ "anon": {
+ "label": "Anonymized Location"
+ },
+ "card4l": {
+ "label": "CARD4L",
+ "explain": "CEOS Analysis Ready Data for Land"
+ },
+ "classification": {
+ "label": "Classification"
+ },
+ "contacts": {
+ "label": "Contacts"
+ },
+ "cube": {
+ "label": "Data Cube"
+ },
+ "esa_cci_lc": {
+ "label": "ESA Climate Change Initiative - Land Cover"
+ },
+ "eo": {
+ "label": "Electro-Optical"
+ },
+ "forecast": {
+ "label": "Forecast"
+ },
+ "file": {
+ "label": "File"
+ },
+ "grid": {
+ "label": "Gridded Data"
+ },
+ "goes": {
+ "label": "NOAA GOES",
+ "explain": "NOAA Geostationary Operational Environmental Satellite"
+ },
+ "label": {
+ "label": "Labels / ML"
+ },
+ "language": {
+ "label": "Internationalization / Localization"
+ },
+ "mgrs": {
+ "label": "MGRS",
+ "explain": "Military Grid Reference System"
+ },
+ "noaa_mrms_qpe": {
+ "label": "NOAA MRMS QPE",
+ "explain": "NOAA Multi-Radar Multi-Sensor Quantitative Precipitation Estimation"
+ },
+ "odc": {
+ "label": "Open Data Cube"
+ },
+ "order": {
+ "label": "Order"
+ },
+ "pc": {
+ "label": "Point Cloud"
+ },
+ "processing": {
+ "label": "Processing"
+ },
+ "product": {
+ "label": "Product"
+ },
+ "proj": {
+ "label": "Projection"
+ },
+ "raster": {
+ "label": "Raster Imagery"
+ },
+ "sar": {
+ "label": "SAR",
+ "explain": "Synthetic Aperture Radar"
+ },
+ "sat": {
+ "label": "Satellite"
+ },
+ "sci": {
+ "label": "Scientific"
+ },
+ "ssys": {
+ "label": "Solar System"
+ },
+ "stats": {
+ "label": "STAC Statistics"
+ },
+ "storage": {
+ "label": "Cloud Storage"
+ },
+ "table": {
+ "label": "Tabular Data"
+ },
+ "themes": {
+ "label": "Themes"
+ },
+ "tiles": {
+ "label": "Tiled Assets"
+ },
+ "view": {
+ "label": "View Geometry"
+ },
+ "web-map-links": {
+ "label": "Web Maps"
+ },
+ "xarray": {
+ "label": "xarray"
+ },
+ "gee": {
+ "label": "Google Earth Engine"
+ },
+ "landsat": {
+ "label": "Landsat"
+ },
+ "msft": {
+ "label": "Microsoft"
+ },
+ "openeo": {
+ "label": "openEO"
+ },
+ "pl": {
+ "label": "Planet Labs PBC"
+ },
+ "s2": {
+ "label": "Sentinel-2"
+ },
+ "sentinel": {
+ "label": "Copernicus Sentinel"
+ },
+ "cbers": {
+ "label": "CBERS",
+ "explain": "China-Brazil Earth Resources Satellite Program"
+ },
+ "geoadmin": {
+ "label": "swisstopo",
+ "explain": "Federal Office of Topography (Switzerland)"
+ }
+ },
+ "links": {
+ "href": {
+ "label": "URL",
+ "format": "Url"
+ },
+ "hreflang": {
+ "label": "Language",
+ "format": "LanguageCode"
+ },
+ "rel": {
+ "label": "Relation",
+ "explain": "Based on IANA relation types",
+ "mapping": {
+ "self": "This document",
+ "root": "Root STAC Catalog",
+ "parent": "Parent STAC Catalog",
+ "collection": "STAC Collection",
+ "derived_from": "STAC Item for input data",
+ "about": "About this resource",
+ "alternate": "Alternative representation",
+ "via": "Source metadata",
+ "next": "Next page",
+ "prev": "Previous page",
+ "canonical": "Origin of this document",
+ "processing-expression": "Processing inctructions/code",
+ "latest-version": "Latest version",
+ "predecessor-version": "Predecessor version",
+ "successor-version": "Successor version",
+ "source": "Source data",
+ "cite-as": "Citation information",
+ "related": "Related resource",
+ "describedby": "Description of the resource",
+ "service-desc": "API definitions",
+ "service-doc": "API user documentation",
+ "conformance": "API conformance declaration",
+ "order": "Order details",
+ "3d-tiles": "3D Tiles",
+ "pmtiles": "PMTiles",
+ "tilejson": "TileJSON",
+ "wms": "OGC Web Map Service (WMS)",
+ "wmts": "OGC Web Map Tile Service (WMTS)",
+ "xyz": "XYZ Web Map"
+ }
+ },
+ "type": {
+ "label": "File Format",
+ "explain": "Based on the IANA media (MIME) types",
+ "format": "MediaType"
+ },
+ "method": {
+ "label": "HTTP Method"
+ },
+ "headers": {
+ "label": "HTTP Headers"
+ },
+ "body": {
+ "label": "Request Body"
+ }
+ },
+ "metadata": {
+ "id": {
+ "label": "Identifier"
+ },
+ "keywords": {
+ "label": "Keywords"
+ },
+ "datetime": {
+ "label": "Time of Data",
+ "format": "Timestamp",
+ "summary": false
+ },
+ "title": {
+ "label": "Title",
+ "summary": false
+ },
+ "description": {
+ "label": "Description",
+ "format": "CommonMark",
+ "summary": false
+ },
+ "roles": {
+ "label": "Purpose"
+ },
+ "start_datetime": {
+ "label": "Time of Data begins",
+ "format": "Timestamp",
+ "summary": false
+ },
+ "end_datetime": {
+ "label": "Time of Data ends",
+ "format": "Timestamp",
+ "summary": false
+ },
+ "created": {
+ "label": "Created",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "updated": {
+ "label": "Updated",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "published": {
+ "label": "Published",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "expires": {
+ "label": "Expires",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "unpublished": {
+ "label": "Unpublished",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "license": {
+ "label": "License",
+ "format": "License",
+ "summary": false
+ },
+ "providers": {
+ "label": "Providers",
+ "format": "Providers",
+ "summary": false
+ },
+ "platform": {
+ "label": "Platform"
+ },
+ "instruments": {
+ "label": "Instruments",
+ "format": "CSV"
+ },
+ "constellation": {
+ "label": "Constellation"
+ },
+ "mission": {
+ "label": "Mission"
+ },
+ "gsd": {
+ "label": "GSD",
+ "explain": "Ground Sample Distance",
+ "unit": "m"
+ },
+ "bands": {
+ "label": "Bands",
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "id": true,
+ "order": 0
+ },
+ "description": {
+ "alias": "description",
+ "order": 2,
+ "label": "Description",
+ "format": "CommonMark",
+ "summary": false
+ },
+ "gsd": {
+ "alias": "gsd",
+ "sortable": true,
+ "label": "GSD",
+ "explain": "Ground Sample Distance",
+ "unit": "m"
+ },
+ "nodata": {
+ "alias": "nodata",
+ "label": "No-Data Values",
+ "format": "CSV",
+ "summary": false
+ },
+ "data_type": {
+ "alias": "data_type",
+ "sortable": true,
+ "label": "Data Type of Values",
+ "format": "FileDataType"
+ },
+ "statistics": {
+ "alias": "statistics",
+ "label": "Statistics",
+ "items": {
+ "mean": {
+ "label": "Average"
+ },
+ "maximum": {
+ "label": "Max.",
+ "explain": "Maxmimum value"
+ },
+ "minimum": {
+ "label": "Min.",
+ "explain": "Minimum value"
+ },
+ "stdev": {
+ "label": "Std. Dev.",
+ "explain": "Standard Deviation"
+ },
+ "count": {
+ "label": "Count",
+ "explain": "Total number of values"
+ },
+ "valid_percent": {
+ "label": "Valid",
+ "explain": "Percentage of valid values",
+ "unit": "%"
+ }
+ },
+ "itemOrder": [
+ "mean",
+ "count",
+ "maximum",
+ "minimum",
+ "stdev",
+ "valid_percent"
+ ]
+ },
+ "eo:common_name": {
+ "alias": "eo:common_name",
+ "sortable": true,
+ "order": 1,
+ "label": "Common Name"
+ },
+ "eo:center_wavelength": {
+ "alias": "eo:center_wavelength",
+ "sortable": true,
+ "label": "Wavelength",
+ "explain": "The center wavelength of the band",
+ "unit": "μm"
+ },
+ "eo:full_width_half_max": {
+ "alias": "eo:full_width_half_max",
+ "sortable": true,
+ "label": "FWHM",
+ "explain": "Full Width Half Max",
+ "unit": "μm"
+ },
+ "eo:solar_illumination": {
+ "alias": "eo:solar_illumination",
+ "sortable": true,
+ "label": "Solar Illumination",
+ "unit": "W/m²/μm"
+ },
+ "raster:sampling": {
+ "alias": "raster:sampling",
+ "sortable": true,
+ "label": "Sampling",
+ "mapping": {
+ "area": "Area",
+ "point": "Point (at pixel center)"
+ }
+ },
+ "unit": {
+ "alias": "unit",
+ "sortable": true,
+ "label": "Unit of Values"
+ },
+ "raster:bits_per_sample": {
+ "alias": "raster:bits_per_sample",
+ "sortable": true,
+ "label": "Bits per Sample"
+ },
+ "raster:spatial_resolution": {
+ "alias": "raster:spatial_resolution",
+ "sortable": true,
+ "label": "Resolution",
+ "explain": "Average spatial resolution",
+ "unit": "m"
+ },
+ "raster:scale": {
+ "alias": "raster:scale",
+ "sortable": true,
+ "label": "Scale"
+ },
+ "raster:offset": {
+ "alias": "raster:offset",
+ "sortable": true,
+ "label": "Offset"
+ },
+ "raster:histogram": {
+ "alias": "raster:histogram",
+ "label": "Histogram",
+ "custom": true
+ },
+ "classification:classes": {
+ "alias": "classification:classes",
+ "summary": false,
+ "label": "Classes",
+ "items": {
+ "color_hint": {
+ "label": "Color",
+ "order": 0,
+ "format": "HexColor"
+ },
+ "value": {
+ "label": "Value",
+ "sortable": true,
+ "order": 1
+ },
+ "title": {
+ "label": "Title",
+ "sortable": true,
+ "order": 2
+ },
+ "name": {
+ "label": "Identifier",
+ "sortable": true,
+ "order": 3
+ },
+ "description": {
+ "label": "Description",
+ "order": 4,
+ "format": "CommonMark"
+ },
+ "percentage": {
+ "label": "Percentage of samples",
+ "sortable": true,
+ "order": 5,
+ "unit": "%"
+ },
+ "count": {
+ "label": "Number of samples",
+ "sortable": true,
+ "order": 6
+ },
+ "nodata": {
+ "label": "No-data value",
+ "order": 7,
+ "default": false
+ }
+ },
+ "itemOrder": [
+ "color_hint",
+ "value",
+ "title",
+ "name",
+ "description",
+ "percentage",
+ "count",
+ "nodata"
+ ]
+ },
+ "classification:bitfields": {
+ "alias": "classification:bitfields",
+ "summary": false,
+ "label": "Bit Mask",
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "order": 0
+ },
+ "offset": {
+ "label": "Offset",
+ "explain": "Offset to the first bit",
+ "order": 1
+ },
+ "length": {
+ "label": "Number of bits",
+ "order": 2
+ },
+ "description": {
+ "label": "Description",
+ "order": 3,
+ "format": "CommonMark"
+ },
+ "classes": {
+ "alias": "classification:classes",
+ "summary": false,
+ "label": "Classes",
+ "items": {
+ "color_hint": {
+ "label": "Color",
+ "order": 0,
+ "format": "HexColor"
+ },
+ "value": {
+ "label": "Value",
+ "sortable": true,
+ "order": 1
+ },
+ "title": {
+ "label": "Title",
+ "sortable": true,
+ "order": 2
+ },
+ "name": {
+ "label": "Identifier",
+ "sortable": true,
+ "order": 3
+ },
+ "description": {
+ "label": "Description",
+ "order": 4,
+ "format": "CommonMark"
+ },
+ "percentage": {
+ "label": "Percentage of samples",
+ "sortable": true,
+ "order": 5,
+ "unit": "%"
+ },
+ "count": {
+ "label": "Number of samples",
+ "sortable": true,
+ "order": 6
+ },
+ "nodata": {
+ "label": "No-data value",
+ "order": 7,
+ "default": false
+ }
+ },
+ "itemOrder": [
+ "color_hint",
+ "value",
+ "title",
+ "name",
+ "description",
+ "percentage",
+ "count",
+ "nodata"
+ ]
+ },
+ "roles": {
+ "label": "Purpose"
+ }
+ },
+ "itemOrder": [
+ "classes",
+ "name",
+ "offset",
+ "length",
+ "description",
+ "roles"
+ ]
+ }
+ },
+ "itemOrder": [
+ "name",
+ "classification:bitfields",
+ "raster:bits_per_sample",
+ "classification:classes",
+ "eo:common_name",
+ "data_type",
+ "description",
+ "eo:full_width_half_max",
+ "gsd",
+ "raster:histogram",
+ "nodata",
+ "raster:offset",
+ "raster:spatial_resolution",
+ "raster:sampling",
+ "raster:scale",
+ "eo:solar_illumination",
+ "statistics",
+ "unit",
+ "eo:center_wavelength"
+ ]
+ },
+ "nodata": {
+ "label": "No-Data Values",
+ "format": "CSV",
+ "summary": false
+ },
+ "data_type": {
+ "label": "Data Type of Values",
+ "format": "FileDataType"
+ },
+ "unit": {
+ "label": "Unit of Values"
+ },
+ "statistics": {
+ "label": "Statistics",
+ "items": {
+ "mean": {
+ "label": "Average"
+ },
+ "maximum": {
+ "label": "Max.",
+ "explain": "Maxmimum value"
+ },
+ "minimum": {
+ "label": "Min.",
+ "explain": "Minimum value"
+ },
+ "stdev": {
+ "label": "Std. Dev.",
+ "explain": "Standard Deviation"
+ },
+ "count": {
+ "label": "Count",
+ "explain": "Total number of values"
+ },
+ "valid_percent": {
+ "label": "Valid",
+ "explain": "Percentage of valid values",
+ "unit": "%"
+ }
+ },
+ "itemOrder": [
+ "mean",
+ "count",
+ "maximum",
+ "minimum",
+ "stdev",
+ "valid_percent"
+ ]
+ },
+ "version": {
+ "label": "Data Version",
+ "summary": false
+ },
+ "deprecated": {
+ "label": "Deprecated",
+ "summary": false
+ },
+ "experimental": {
+ "label": "Experimental",
+ "summary": false
+ },
+ "language": {
+ "label": "Current Language",
+ "ext": "language",
+ "summary": "v",
+ "properties": {
+ "name": {
+ "label": "Name"
+ },
+ "alternate": {
+ "label": "Alternate Name"
+ },
+ "code": {
+ "label": "Code"
+ },
+ "dir": {
+ "label": "Direction",
+ "explain": "Reading and writing direction",
+ "mapping": {
+ "ltr": "left-to-right",
+ "rtl": "right-to-left"
+ },
+ "default": "ltr"
+ }
+ }
+ },
+ "languages": {
+ "label": "Available Languages",
+ "ext": "language",
+ "summary": false,
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "order": 0
+ },
+ "alternate": {
+ "label": "Alternate Name",
+ "sortable": true,
+ "order": 1
+ },
+ "code": {
+ "label": "Code",
+ "sortable": true,
+ "order": 2
+ },
+ "dir": {
+ "label": "Direction",
+ "explain": "Reading and writing direction",
+ "sortable": true,
+ "order": 3,
+ "mapping": {
+ "ltr": "left-to-right",
+ "rtl": "right-to-left"
+ },
+ "default": "ltr"
+ }
+ },
+ "itemOrder": [
+ "name",
+ "alternate",
+ "code",
+ "dir"
+ ]
+ },
+ "contacts": {
+ "label": "Contacts",
+ "ext": "contacts",
+ "summary": "v",
+ "items": {
+ "name": {
+ "label": "Name"
+ },
+ "identifier": {
+ "label": "Identifier"
+ },
+ "position": {
+ "label": "Position"
+ },
+ "organization": {
+ "label": "Organization"
+ },
+ "logo": {
+ "label": "Logo",
+ "format": "Image"
+ },
+ "phones": {
+ "label": "Phone",
+ "items": {
+ "value": {
+ "label": "Number",
+ "format": "Phone",
+ "order": 0
+ },
+ "roles": {
+ "label": "Used For",
+ "order": 1,
+ "mapping": {
+ "work": "Work",
+ "home": "Personal",
+ "fax": "Fax"
+ }
+ }
+ },
+ "itemOrder": [
+ "value",
+ "roles"
+ ]
+ },
+ "emails": {
+ "label": "Email",
+ "items": {
+ "value": {
+ "label": "Address",
+ "format": "Email",
+ "order": 0
+ },
+ "roles": {
+ "label": "Used For",
+ "order": 1,
+ "mapping": {
+ "work": "Work",
+ "home": "Personal"
+ }
+ }
+ },
+ "itemOrder": [
+ "value",
+ "roles"
+ ]
+ },
+ "addresses": {
+ "label": "Postal Addresses",
+ "format": "Address",
+ "items": {
+ "deliveryPoint": {
+ "label": "Street / House",
+ "order": 0
+ },
+ "city": {
+ "label": "City",
+ "order": 1
+ },
+ "administrativeArea": {
+ "label": "State / Province",
+ "order": 2
+ },
+ "postalCode": {
+ "label": "Postal Code",
+ "order": 3
+ },
+ "country": {
+ "label": "Country",
+ "order": 4
+ }
+ },
+ "itemOrder": [
+ "deliveryPoint",
+ "city",
+ "administrativeArea",
+ "postalCode",
+ "country"
+ ]
+ },
+ "links": {
+ "label": "Additional Resources",
+ "format": "Link"
+ },
+ "contactInstructions": {
+ "label": "Further Instructions"
+ },
+ "roles": {
+ "label": "Types",
+ "format": "CSV"
+ }
+ },
+ "itemOrder": [
+ "links",
+ "emails",
+ "contactInstructions",
+ "identifier",
+ "logo",
+ "name",
+ "organization",
+ "phones",
+ "position",
+ "addresses",
+ "roles"
+ ]
+ },
+ "themes": {
+ "label": "Themes",
+ "ext": "themes",
+ "summary": false,
+ "items": {
+ "scheme": {
+ "label": "Vocabulary",
+ "order": 0,
+ "format": "Url"
+ },
+ "concepts": {
+ "label": "Terms",
+ "order": 1,
+ "format": "Concepts",
+ "items": {
+ "id": {
+ "label": "Identifier",
+ "order": 0
+ },
+ "title": {
+ "label": "Title",
+ "order": 1
+ },
+ "description": {
+ "label": "Description",
+ "order": 2
+ },
+ "url": {
+ "label": "URL",
+ "order": 3,
+ "format": "Url"
+ }
+ },
+ "itemOrder": [
+ "id",
+ "title",
+ "description",
+ "url"
+ ]
+ }
+ },
+ "itemOrder": [
+ "scheme",
+ "concepts"
+ ]
+ },
+ "crs": {
+ "label": "CRS",
+ "format": "CRS",
+ "explain": "Coordinate Reference System"
+ },
+ "anon:size": {
+ "label": "Uncertainty",
+ "unit": "°",
+ "explain": "The size of one side of the anonymized bounding box"
+ },
+ "anon:warning": {
+ "label": "Warning",
+ "summary": false
+ },
+ "classification:classes": {
+ "summary": false,
+ "label": "Classes",
+ "items": {
+ "color_hint": {
+ "label": "Color",
+ "order": 0,
+ "format": "HexColor"
+ },
+ "value": {
+ "label": "Value",
+ "sortable": true,
+ "order": 1
+ },
+ "title": {
+ "label": "Title",
+ "sortable": true,
+ "order": 2
+ },
+ "name": {
+ "label": "Identifier",
+ "sortable": true,
+ "order": 3
+ },
+ "description": {
+ "label": "Description",
+ "order": 4,
+ "format": "CommonMark"
+ },
+ "percentage": {
+ "label": "Percentage of samples",
+ "sortable": true,
+ "order": 5,
+ "unit": "%"
+ },
+ "count": {
+ "label": "Number of samples",
+ "sortable": true,
+ "order": 6
+ },
+ "nodata": {
+ "label": "No-data value",
+ "order": 7,
+ "default": false
+ }
+ },
+ "itemOrder": [
+ "color_hint",
+ "value",
+ "title",
+ "name",
+ "description",
+ "percentage",
+ "count",
+ "nodata"
+ ]
+ },
+ "classification:bitfields": {
+ "summary": false,
+ "label": "Bit Mask",
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "order": 0
+ },
+ "offset": {
+ "label": "Offset",
+ "explain": "Offset to the first bit",
+ "order": 1
+ },
+ "length": {
+ "label": "Number of bits",
+ "order": 2
+ },
+ "description": {
+ "label": "Description",
+ "order": 3,
+ "format": "CommonMark"
+ },
+ "classes": {
+ "alias": "classification:classes",
+ "summary": false,
+ "label": "Classes",
+ "items": {
+ "color_hint": {
+ "label": "Color",
+ "order": 0,
+ "format": "HexColor"
+ },
+ "value": {
+ "label": "Value",
+ "sortable": true,
+ "order": 1
+ },
+ "title": {
+ "label": "Title",
+ "sortable": true,
+ "order": 2
+ },
+ "name": {
+ "label": "Identifier",
+ "sortable": true,
+ "order": 3
+ },
+ "description": {
+ "label": "Description",
+ "order": 4,
+ "format": "CommonMark"
+ },
+ "percentage": {
+ "label": "Percentage of samples",
+ "sortable": true,
+ "order": 5,
+ "unit": "%"
+ },
+ "count": {
+ "label": "Number of samples",
+ "sortable": true,
+ "order": 6
+ },
+ "nodata": {
+ "label": "No-data value",
+ "order": 7,
+ "default": false
+ }
+ },
+ "itemOrder": [
+ "color_hint",
+ "value",
+ "title",
+ "name",
+ "description",
+ "percentage",
+ "count",
+ "nodata"
+ ]
+ },
+ "roles": {
+ "label": "Purpose"
+ }
+ },
+ "itemOrder": [
+ "classes",
+ "name",
+ "offset",
+ "length",
+ "description",
+ "roles"
+ ]
+ },
+ "cube:dimensions": {
+ "label": "Dimensions",
+ "summary": false,
+ "listWithKeys": true,
+ "items": {
+ "type": {
+ "label": "Type",
+ "order": 0
+ },
+ "axis": {
+ "label": "Axis",
+ "order": 1
+ },
+ "description": {
+ "label": "Description",
+ "format": "CommonMark",
+ "order": 2
+ },
+ "extent": {
+ "label": "Extent",
+ "format": "Extent",
+ "order": 3
+ },
+ "bbox": {
+ "alias": "proj:bbox",
+ "order": 3,
+ "label": "Bounding Box",
+ "custom": true,
+ "summary": false
+ },
+ "values": {
+ "label": "Values",
+ "order": 4
+ },
+ "step": {
+ "label": "Step",
+ "order": 5
+ },
+ "unit": {
+ "alias": "unit",
+ "order": 5,
+ "label": "Unit of Values"
+ },
+ "geometry_types": {
+ "label": "Geometry Types",
+ "order": 5
+ },
+ "reference_system": {
+ "label": "Reference System",
+ "explain": "Coordinate / Temporal / Other Reference System",
+ "order": 6
+ }
+ },
+ "itemOrder": [
+ "type",
+ "axis",
+ "description",
+ "extent",
+ "bbox",
+ "values",
+ "step",
+ "unit",
+ "geometry_types",
+ "reference_system"
+ ]
+ },
+ "cube:variables": {
+ "label": "Variables",
+ "summary": false,
+ "listWithKeys": true,
+ "items": {
+ "dimensions": {
+ "label": "Dimensions",
+ "order": 0
+ },
+ "type": {
+ "label": "Type",
+ "order": 1,
+ "mapping": {
+ "data": "Measured values",
+ "auxiliary": "Coordinate data"
+ }
+ },
+ "description": {
+ "label": "Description",
+ "format": "CommonMark",
+ "order": 2
+ },
+ "extent": {
+ "label": "Extent",
+ "format": "Extent",
+ "order": 3
+ },
+ "values": {
+ "label": "Values",
+ "order": 4
+ },
+ "step": {
+ "label": "Step",
+ "order": 5
+ },
+ "unit": {
+ "alias": "unit",
+ "order": 6,
+ "label": "Unit of Values"
+ }
+ },
+ "itemOrder": [
+ "dimensions",
+ "type",
+ "description",
+ "extent",
+ "values",
+ "step",
+ "unit"
+ ]
+ },
+ "eo:bands": {
+ "label": "Spectral Bands",
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "id": true,
+ "order": 0
+ },
+ "common_name": {
+ "alias": "eo:common_name",
+ "sortable": true,
+ "order": 1,
+ "label": "Common Name"
+ },
+ "center_wavelength": {
+ "alias": "eo:center_wavelength",
+ "sortable": true,
+ "order": 2,
+ "label": "Wavelength",
+ "explain": "The center wavelength of the band",
+ "unit": "μm"
+ },
+ "full_width_half_max": {
+ "alias": "eo:full_width_half_max",
+ "sortable": true,
+ "order": 3,
+ "label": "FWHM",
+ "explain": "Full Width Half Max",
+ "unit": "μm"
+ },
+ "solar_illumination": {
+ "alias": "eo:solar_illumination",
+ "sortable": true,
+ "order": 7,
+ "label": "Solar Illumination",
+ "unit": "W/m²/μm"
+ },
+ "description": {
+ "alias": "description",
+ "label": "Description",
+ "format": "CommonMark",
+ "summary": false
+ },
+ "gsd": {
+ "alias": "gsd",
+ "sortable": true,
+ "label": "GSD",
+ "explain": "Ground Sample Distance",
+ "unit": "m"
+ },
+ "cloud_cover": {
+ "alias": "eo:cloud_cover",
+ "sortable": true,
+ "label": "Cloud Cover",
+ "unit": "%"
+ }
+ },
+ "itemOrder": [
+ "name",
+ "cloud_cover",
+ "common_name",
+ "description",
+ "gsd",
+ "center_wavelength",
+ "full_width_half_max",
+ "solar_illumination"
+ ]
+ },
+ "eo:cloud_cover": {
+ "label": "Cloud Cover",
+ "unit": "%"
+ },
+ "eo:snow_cover": {
+ "label": "Snow/Ice Cover",
+ "unit": "%"
+ },
+ "eo:common_name": {
+ "label": "Common Name"
+ },
+ "eo:center_wavelength": {
+ "label": "Wavelength",
+ "explain": "The center wavelength of the band",
+ "unit": "μm"
+ },
+ "eo:full_width_half_max": {
+ "label": "FWHM",
+ "explain": "Full Width Half Max",
+ "unit": "μm"
+ },
+ "eo:solar_illumination": {
+ "label": "Solar Illumination",
+ "unit": "W/m²/μm"
+ },
+ "forecast:reference_datetime": {
+ "label": "Reference Time",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "forecast:horizon": {
+ "label": "Forecast Horizon",
+ "explain": "The time between the reference time and the forecast time",
+ "format": "Duration"
+ },
+ "forecast:duration": {
+ "label": "Forecast Length",
+ "format": "Duration"
+ },
+ "file:bits_per_sample": {
+ "alias": "raster:bits_per_sample",
+ "label": "Bits per Sample"
+ },
+ "file:byte_order": {
+ "label": "Byte Order"
+ },
+ "file:checksum": {
+ "label": "Checksum",
+ "format": "Checksum",
+ "summary": false
+ },
+ "file:data_type": {
+ "alias": "data_type",
+ "label": "Data Type of Values",
+ "format": "FileDataType"
+ },
+ "file:header_size": {
+ "label": "Header Size",
+ "format": "FileSize",
+ "summary": false
+ },
+ "file:nodata": {
+ "alias": "nodata",
+ "label": "No-Data Values",
+ "format": "CSV",
+ "summary": false
+ },
+ "file:size": {
+ "label": "Size",
+ "format": "FileSize",
+ "summary": false
+ },
+ "file:unit": {
+ "alias": "unit",
+ "label": "Unit of Values"
+ },
+ "file:values": {
+ "label": "Map of Values",
+ "summary": false,
+ "items": {
+ "values": {
+ "label": "Values",
+ "format": "CSV",
+ "order": 1
+ },
+ "summary": {
+ "label": "Summary",
+ "order": 0
+ }
+ },
+ "itemOrder": [
+ "summary",
+ "values"
+ ]
+ },
+ "file:local_path": {
+ "label": "Local Path",
+ "summary": false
+ },
+ "nodata:values": {
+ "alias": "nodata",
+ "label": "No-Data Values",
+ "format": "CSV",
+ "summary": false
+ },
+ "goes:orbital_slot": {
+ "label": "Orbital Slot"
+ },
+ "goes:system_environment": {
+ "label": "System Environment",
+ "mapping": {
+ "OR": "Operational system, real-time data",
+ "OT": "Operational system, test data",
+ "IR": "Test system, real-time data",
+ "IT": "Test system, test data",
+ "IP": "Test system, playback data",
+ "IS": "Test system, simulated data"
+ }
+ },
+ "goes:image_type": {
+ "label": "Area",
+ "mapping": {
+ "FULL DISK": "The Americas (full disk)",
+ "CONUS": "North America (continental US)",
+ "MESOSCALE": "Central/South America (mesoscale)"
+ }
+ },
+ "goes:mesoscale_image_number": {
+ "label": "Area in Central/South America",
+ "mapping": {
+ "1": "Region 1",
+ "2": "Region 2"
+ }
+ },
+ "goes:mode": {
+ "label": "Capture Mode",
+ "mapping": {
+ "3": "3: 1x full disk, 3x continental US, 30x mesoscale region 1, 30x mesoscale region 2 (every 15 minutes)",
+ "4": "4: 1x full disk (every 5 minutes)",
+ "6": "6: 1x full disk, 2x continental US, 20x mesoscale region 1, 20x mesoscale region 2 (every 10 minutes)"
+ }
+ },
+ "goes:group_time_threshold": {
+ "label": "Time Threshold in a Group",
+ "explain": "Lightning group maximum time difference among lightning events in a group",
+ "unit": "s"
+ },
+ "goes:flash_time_threshold": {
+ "label": "Time Threshold in a Flash",
+ "explain": "Lightning flash maximum time difference among lightning events in a flash",
+ "unit": "s"
+ },
+ "goes:lightning_wavelength": {
+ "label": "Central Wavelength",
+ "unit": "nm"
+ },
+ "goes:yaw_flip_flag": {
+ "label": "Yaw Flip Configuration",
+ "explain": "Flag indicating that the spacecraft is operating in yaw flip configuration.",
+ "mapping": {
+ "0": "Upright",
+ "1": "Neither",
+ "2": "Inverted"
+ }
+ },
+ "goes:event_count": {
+ "label": "Lightning Events"
+ },
+ "goes:group_count": {
+ "label": "Lightning Groups"
+ },
+ "goes:flash_count": {
+ "label": "Lightning Flashes"
+ },
+ "goes:nominal_satellite_subpoint_lat": {
+ "label": "Satellite Subpoint Latitude",
+ "unit": "°N"
+ },
+ "goes:nominal_satellite_subpoint_lon": {
+ "label": "Satellite Subpoint Longitude",
+ "unit": "°E"
+ },
+ "goes:nominal_satellite_height": {
+ "label": "Satellite Height",
+ "explain": "Nominal satellite height above GRS 80 ellipsoid",
+ "unit": "km"
+ },
+ "goes:percent_navigated_L1b_events": {
+ "label": "Events navigated by Instrument",
+ "format": "Percent0to1",
+ "unit": "%"
+ },
+ "goes:percent_uncorrectable_L0_errors": {
+ "label": "Data Lost",
+ "format": "Percent0to1",
+ "unit": "%"
+ },
+ "grid:code": {
+ "label": "Grid",
+ "format": "GridCode"
+ },
+ "raster:bands": {
+ "label": "Layers",
+ "items": {
+ "nodata": {
+ "alias": "nodata",
+ "label": "No-Data Values",
+ "format": "CSV",
+ "summary": false
+ },
+ "sampling": {
+ "alias": "raster:sampling",
+ "sortable": true,
+ "label": "Sampling",
+ "mapping": {
+ "area": "Area",
+ "point": "Point (at pixel center)"
+ }
+ },
+ "data_type": {
+ "alias": "data_type",
+ "sortable": true,
+ "label": "Data Type of Values",
+ "format": "FileDataType"
+ },
+ "bits_per_sample": {
+ "alias": "raster:bits_per_sample",
+ "sortable": true,
+ "label": "Bits per Sample"
+ },
+ "spatial_resolution": {
+ "alias": "raster:spatial_resolution",
+ "sortable": true,
+ "label": "Resolution",
+ "explain": "Average spatial resolution",
+ "unit": "m"
+ },
+ "statistics": {
+ "alias": "statistics",
+ "label": "Statistics",
+ "items": {
+ "mean": {
+ "label": "Average"
+ },
+ "maximum": {
+ "label": "Max.",
+ "explain": "Maxmimum value"
+ },
+ "minimum": {
+ "label": "Min.",
+ "explain": "Minimum value"
+ },
+ "stdev": {
+ "label": "Std. Dev.",
+ "explain": "Standard Deviation"
+ },
+ "count": {
+ "label": "Count",
+ "explain": "Total number of values"
+ },
+ "valid_percent": {
+ "label": "Valid",
+ "explain": "Percentage of valid values",
+ "unit": "%"
+ }
+ },
+ "itemOrder": [
+ "mean",
+ "count",
+ "maximum",
+ "minimum",
+ "stdev",
+ "valid_percent"
+ ]
+ },
+ "unit": {
+ "alias": "unit",
+ "sortable": true,
+ "label": "Unit of Values"
+ },
+ "scale": {
+ "alias": "raster:scale",
+ "sortable": true,
+ "label": "Scale"
+ },
+ "offset": {
+ "alias": "raster:offset",
+ "sortable": true,
+ "label": "Offset"
+ },
+ "histogram": {
+ "alias": "raster:histogram",
+ "label": "Histogram",
+ "custom": true
+ }
+ },
+ "itemOrder": [
+ "bits_per_sample",
+ "data_type",
+ "histogram",
+ "nodata",
+ "offset",
+ "spatial_resolution",
+ "sampling",
+ "scale",
+ "statistics",
+ "unit"
+ ]
+ },
+ "raster:sampling": {
+ "label": "Sampling",
+ "mapping": {
+ "area": "Area",
+ "point": "Point (at pixel center)"
+ }
+ },
+ "raster:bits_per_sample": {
+ "label": "Bits per Sample"
+ },
+ "raster:spatial_resolution": {
+ "label": "Resolution",
+ "explain": "Average spatial resolution",
+ "unit": "m"
+ },
+ "raster:scale": {
+ "label": "Scale"
+ },
+ "raster:offset": {
+ "label": "Offset"
+ },
+ "raster:histogram": {
+ "label": "Histogram",
+ "custom": true
+ },
+ "label:properties": {
+ "label": "Properties",
+ "null": "raster data"
+ },
+ "label:classes": {
+ "label": "Classes",
+ "items": {
+ "name": {
+ "label": "Name",
+ "null": "raster-formatted",
+ "sortable": true,
+ "id": true
+ },
+ "classes": {
+ "label": "Classes"
+ }
+ },
+ "itemOrder": [
+ "name",
+ "classes"
+ ]
+ },
+ "label:description": {
+ "label": "Description",
+ "format": "CommonMark",
+ "summary": false
+ },
+ "label:type": {
+ "label": "Type"
+ },
+ "label:tasks": {
+ "label": "Tasks"
+ },
+ "label:methods": {
+ "label": "Methods"
+ },
+ "label:overviews": {
+ "label": "Overviews",
+ "summary": false,
+ "items": {
+ "property_key": {
+ "label": "Property Key",
+ "id": true
+ },
+ "counts": {
+ "label": "Counts",
+ "custom": true
+ },
+ "statistics": {
+ "label": "Statistics",
+ "custom": true
+ }
+ },
+ "itemOrder": [
+ "property_key",
+ "counts",
+ "statistics"
+ ]
+ },
+ "mgrs:latitude_band": {
+ "label": "Latitude Band"
+ },
+ "mgrs:grid_square": {
+ "label": "Grid Square"
+ },
+ "mgrs:utm_zone": {
+ "label": "UTM Zone"
+ },
+ "noaa_mrms_qpe:pass": {
+ "label": "Pass Number",
+ "mapping": {
+ "1": "1 (less latency / less gauges)",
+ "2": "2 (more latency / more gauges)"
+ }
+ },
+ "noaa_mrms_qpe:period": {
+ "label": "Accumulation Period",
+ "unit": "h"
+ },
+ "noaa_mrms_qpe:region": {
+ "label": "Region",
+ "mapping": {
+ "CONUS": "Continental US",
+ "HAWAII": "Hawaii",
+ "GUAM": "Guam",
+ "ALASKA": "Alaska",
+ "CARIB": "Caribbean Islands"
+ }
+ },
+ "openeo:status": {
+ "label": "Processing Status"
+ },
+ "api_version": {
+ "label": "API Version",
+ "ext": "openeo"
+ },
+ "backend_version": {
+ "label": "Back-End Version",
+ "ext": "openeo"
+ },
+ "production": {
+ "label": "Production-Ready",
+ "ext": "openeo"
+ },
+ "endpoints": {
+ "label": "Supported Endpoints",
+ "ext": "openeo",
+ "summary": false,
+ "items": {
+ "path": {
+ "label": "Path Template",
+ "order": 0
+ },
+ "methods": {
+ "label": "HTTP Methods",
+ "order": 1,
+ "format": "CSV"
+ }
+ },
+ "itemOrder": [
+ "path",
+ "methods"
+ ]
+ },
+ "billing": {
+ "label": "Billing",
+ "ext": "openeo",
+ "custom": true,
+ "summary": false
+ },
+ "order:status": {
+ "label": "Status",
+ "mapping": {
+ "orderable": "Orderable (data can be ordered)",
+ "ordered": "Ordered (preparing to deliver data)",
+ "pending": "Pending (waiting for activation)",
+ "shipping": "Shipping (data is getting processed)",
+ "succeeded": "Delivered (data is available)",
+ "failed": "Failed (unable to deliver)",
+ "canceled": "Canceled (delivery stopped)"
+ }
+ },
+ "order:id": {
+ "label": "Identifier"
+ },
+ "order:date": {
+ "label": "Submitted",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "order:expiration_date": {
+ "alias": "expires",
+ "label": "Expires",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "pc:count": {
+ "label": "Points",
+ "explain": "Number of Points"
+ },
+ "pc:type": {
+ "label": "Type"
+ },
+ "pc:encoding": {
+ "label": "Format"
+ },
+ "pc:schemas": {
+ "label": "Schemas",
+ "summary": false,
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "id": true
+ },
+ "size": {
+ "label": "Size",
+ "unit": "bytes",
+ "sortable": true
+ },
+ "type": {
+ "label": "Type",
+ "sortable": true
+ }
+ },
+ "itemOrder": [
+ "name",
+ "size",
+ "type"
+ ]
+ },
+ "pc:density": {
+ "label": "Density"
+ },
+ "pc:statistics": {
+ "label": "Statistics",
+ "summary": "s",
+ "items": {
+ "name": {
+ "label": "Name",
+ "id": true
+ },
+ "position": {
+ "label": "Position"
+ },
+ "average": {
+ "label": "Average"
+ },
+ "count": {
+ "label": "Count"
+ },
+ "maximum": {
+ "label": "Max.",
+ "explain": "Maxmimum value"
+ },
+ "minimum": {
+ "label": "Min.",
+ "explain": "Minimum value"
+ },
+ "stddev": {
+ "label": "Std. Dev.",
+ "explain": "Standard Deviation"
+ },
+ "variance": {
+ "label": "Variance"
+ }
+ },
+ "itemOrder": [
+ "name",
+ "average",
+ "count",
+ "maximum",
+ "minimum",
+ "position",
+ "stddev",
+ "variance"
+ ]
+ },
+ "processing:expression": {
+ "label": "Processing Instructions",
+ "summary": false
+ },
+ "processing:lineage": {
+ "label": "Lineage",
+ "format": "CommonMark",
+ "summary": false
+ },
+ "processing:level": {
+ "label": "Level"
+ },
+ "processing:facility": {
+ "label": "Facility"
+ },
+ "processing:software": {
+ "label": "Software",
+ "format": "Software",
+ "summary": false
+ },
+ "processing:version": {
+ "label": "Processor Version"
+ },
+ "processing:datetime": {
+ "label": "Processing Time",
+ "format": "Timestamp",
+ "summary": "r"
+ },
+ "product:type": {
+ "label": "Product Type"
+ },
+ "product:timeliness": {
+ "label": "Timeliness",
+ "format": "Duration"
+ },
+ "product:timeliness_category": {
+ "label": "Timeliness Category"
+ },
+ "product:acquisition_type": {
+ "label": "Acquisition Type",
+ "mapping": {
+ "nominal": "Nominal",
+ "calibration": "Calibration",
+ "other": "Other"
+ }
+ },
+ "proj:epsg": {
+ "label": "EPSG Code",
+ "format": "EPSG",
+ "summary": "v"
+ },
+ "proj:code": {
+ "label": "Code",
+ "format": "CrsCode",
+ "summary": "v"
+ },
+ "proj:wkt2": {
+ "label": "WKT2",
+ "explain": "Well-Known Text, version 2",
+ "format": "WKT2",
+ "summary": false
+ },
+ "proj:projjson": {
+ "label": "PROJJSON",
+ "explain": "JSON encoding of WKT2",
+ "format": "PROJJSON",
+ "summary": false
+ },
+ "proj:geometry": {
+ "label": "Footprint",
+ "custom": true,
+ "summary": false
+ },
+ "proj:bbox": {
+ "label": "Bounding Box",
+ "custom": true,
+ "summary": false
+ },
+ "proj:centroid": {
+ "label": "Centroid",
+ "custom": true,
+ "summary": false
+ },
+ "proj:shape": {
+ "label": "Image Dimensions",
+ "format": "Shape",
+ "summary": false
+ },
+ "proj:transform": {
+ "label": "Transformation Matrix",
+ "format": "Transform",
+ "summary": false
+ },
+ "sar:instrument_mode": {
+ "label": "Instrument Mode"
+ },
+ "sar:frequency_band": {
+ "label": "Frequency Band"
+ },
+ "sar:center_frequency": {
+ "label": "Center Frequency",
+ "unit": "GHz"
+ },
+ "sar:polarizations": {
+ "label": "Polarizations",
+ "format": "CSV"
+ },
+ "sar:product_type": {
+ "label": "Product Type"
+ },
+ "sar:resolution_range": {
+ "label": "Range Resolution",
+ "unit": "m"
+ },
+ "sar:resolution_azimuth": {
+ "label": "Azimuth Resolution",
+ "unit": "m"
+ },
+ "sar:pixel_spacing_range": {
+ "label": "Range Pixel Spacing",
+ "unit": "m"
+ },
+ "sar:pixel_spacing_azimuth": {
+ "label": "Azimuth Pixel Spacing",
+ "unit": "m"
+ },
+ "sar:looks_range": {
+ "label": "Range Looks"
+ },
+ "sar:looks_azimuth": {
+ "label": "Azimuth Looks"
+ },
+ "sar:looks_equivalent_number": {
+ "label": "ENL",
+ "explain": "Equivalent Number of Looks"
+ },
+ "sar:observation_direction": {
+ "label": "Observation Direction"
+ },
+ "sat:platform_international_designator": {
+ "label": "Int. Designator",
+ "explain": "International designator for the platform, also known as COSPAR ID and NSSDCA ID."
+ },
+ "sat:orbit_state": {
+ "label": "Orbit State"
+ },
+ "sat:absolute_orbit": {
+ "label": "Abs. Orbit Number",
+ "explain": "Absolute Orbit Number"
+ },
+ "sat:relative_orbit": {
+ "label": "Rel. Orbit Number",
+ "explain": "Relative Orbit Number"
+ },
+ "sat:anx_datetime": {
+ "label": "ANX Time",
+ "format": "Timestamp",
+ "explain": "Ascending Node Crossing time",
+ "summary": "r"
+ },
+ "sci:doi": {
+ "label": "DOI",
+ "format": "DOI"
+ },
+ "sci:citation": {
+ "label": "Citation"
+ },
+ "sci:publications": {
+ "label": "Publications",
+ "summary": false,
+ "items": {
+ "citation": {
+ "label": "Publication",
+ "sortable": true,
+ "order": 0
+ },
+ "doi": {
+ "label": "DOI",
+ "format": "DOI",
+ "sortable": true,
+ "order": 1
+ }
+ },
+ "itemOrder": [
+ "citation",
+ "doi"
+ ]
+ },
+ "ssys:targets": {
+ "label": "Target Body"
+ },
+ "storage:platform": {
+ "label": "Provider",
+ "mapping": {
+ "ALIBABA": "Alibaba Cloud",
+ "AWS": "Amazon AWS",
+ "AZURE": "Microsoft Azure",
+ "GCP": "Google Cloud Platform",
+ "IBM": "IBM Cloud",
+ "ORACLE": "Oracle Cloud"
+ }
+ },
+ "storage:region": {
+ "label": "Region"
+ },
+ "storage:requester_pays": {
+ "label": "Requester Pays"
+ },
+ "storage:tier": {
+ "label": "Tier Type"
+ },
+ "table:columns": {
+ "label": "Columns",
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "id": true,
+ "order": 0
+ },
+ "type": {
+ "label": "Data Type",
+ "sortable": true,
+ "order": 1
+ },
+ "description": {
+ "label": "Description",
+ "format": "CommonMark",
+ "order": 2
+ }
+ },
+ "itemOrder": [
+ "name",
+ "type",
+ "description"
+ ]
+ },
+ "table:primary_geometry": {
+ "label": "Primary Geometry Column"
+ },
+ "table:row_count": {
+ "label": "Rows"
+ },
+ "table:tables": {
+ "label": "Tables",
+ "summary": false,
+ "listWithKeys": true,
+ "items": {
+ "name": {
+ "label": "Name",
+ "sortable": true,
+ "id": true,
+ "order": 0
+ },
+ "description": {
+ "label": "Description",
+ "format": "CommonMark",
+ "order": 1
+ }
+ },
+ "itemOrder": [
+ "name",
+ "description"
+ ]
+ },
+ "tiles:tile_matrix_sets": {
+ "label": "Tile Matrix Sets",
+ "custom": true,
+ "summary": false
+ },
+ "tiles:tile_matrix_set_links": {
+ "label": "Tile Matrix Set Links",
+ "custom": true,
+ "summary": false
+ },
+ "view:off_nadir": {
+ "label": "Off-Nadir Angle",
+ "unit": "°"
+ },
+ "view:incidence_angle": {
+ "label": "Incidence Angle",
+ "unit": "°"
+ },
+ "view:azimuth": {
+ "label": "Viewing Azimuth",
+ "unit": "°"
+ },
+ "view:sun_azimuth": {
+ "label": "Sun Azimuth",
+ "unit": "°"
+ },
+ "view:sun_elevation": {
+ "label": "Sun Elevation",
+ "unit": "°"
+ },
+ "pl:black_fill": {
+ "label": "Unfilled Image Parts",
+ "unit": "%"
+ },
+ "pl:clear_percent": {
+ "label": "Clear Sky",
+ "unit": "%"
+ },
+ "pl:grid_cell": {
+ "label": "Grid Cell"
+ },
+ "pl:ground_control": {
+ "label": "Positional Accuracy"
+ },
+ "pl:ground_control_ratio": {
+ "label": "Successful Rectification Ratio"
+ },
+ "pl:item_type": {
+ "label": "Type"
+ },
+ "pl:pixel_resolution": {
+ "label": "Spatial Resolution",
+ "unit": "m"
+ },
+ "pl:publishing_stage": {
+ "label": "Publishing Stage",
+ "mapping": {
+ "preview": "Preview",
+ "standard": "Standard",
+ "finalized": "Finalized"
+ }
+ },
+ "pl:quality_category": {
+ "label": "Quality Category",
+ "mapping": {
+ "standard": "Standard",
+ "test": "Test"
+ }
+ },
+ "pl:strip_id": {
+ "label": "Image Strip ID"
+ },
+ "gee:type": {
+ "label": "Type",
+ "mapping": {
+ "image": "Single image",
+ "image_collection": "Image collection",
+ "table": "Table"
+ }
+ },
+ "gee:cadence": {
+ "label": "Cadence"
+ },
+ "gee:schema": {
+ "label": "Variables",
+ "items": {
+ "name": {
+ "label": "Name"
+ },
+ "description": {
+ "label": "Description"
+ },
+ "type": {
+ "label": "Data Type"
+ }
+ },
+ "summary": false,
+ "itemOrder": [
+ "type",
+ "description",
+ "name"
+ ]
+ },
+ "gee:revisit_interval": {
+ "label": "Revisit Interval"
+ },
+ "gee:terms_of_use": {
+ "label": "Terms of Use",
+ "format": "CommonMark",
+ "summary": false
+ },
+ "gee:visualizations": {
+ "label": "Visualizations",
+ "custom": true,
+ "summary": false
+ },
+ "landsat:scene_id": {
+ "label": "Scene ID"
+ },
+ "landsat:collection_category": {
+ "label": "Collection Category"
+ },
+ "landsat:collection_number": {
+ "label": "Collection Number"
+ },
+ "landsat:wrs_type": {
+ "label": "WRS Type",
+ "explain": "Worldwide Reference System Type"
+ },
+ "landsat:wrs_path": {
+ "label": "WRS Path",
+ "explain": "Worldwide Reference System Path"
+ },
+ "landsat:wrs_row": {
+ "label": "WRS Row",
+ "explain": "Worldwide Reference System Row"
+ },
+ "landsat:cloud_cover_land": {
+ "label": "Land Cloud Cover",
+ "unit": "%"
+ },
+ "msft:container": {
+ "label": "Container"
+ },
+ "msft:storage_account": {
+ "label": "Storage Account"
+ },
+ "msft:short_description": {
+ "label": "Summary",
+ "summary": false
+ },
+ "sentinel:utm_zone": {
+ "label": "UTM Zone"
+ },
+ "sentinel:latitude_band": {
+ "label": "Latitude Band"
+ },
+ "sentinel:grid_square": {
+ "label": "Grid Square"
+ },
+ "sentinel:sequence": {
+ "label": "Sequence"
+ },
+ "sentinel:product_id": {
+ "label": "Product ID",
+ "summary": "s"
+ },
+ "sentinel:data_coverage": {
+ "label": "Data Coverage",
+ "unit": "%"
+ },
+ "sentinel:valid_cloud_cover": {
+ "label": "Valid Cloud Cover"
+ },
+ "cbers:data_type": {
+ "label": "Processing Level",
+ "explain": "Geolocation precision level",
+ "mapping": {
+ "L2": "Geolocation using only satellite telemetry",
+ "L3": "Control points used to geolocate image, no terrain correction",
+ "L4": "Control points used to geolocate image, orthorectified"
+ },
+ "summary": "v"
+ },
+ "cbers:path": {
+ "label": "Reference Grid Path"
+ },
+ "cbers:row": {
+ "label": "Reference Grid Row"
+ },
+ "card4l:specification": {
+ "label": "Specification",
+ "mapping": {
+ "SR": "Surface Reflectance (Optical)",
+ "ST": "Surface Temperature (Optical)",
+ "NRB": "Normalized Radar Backscatter (SAR)",
+ "POL": "Polarimetric Radar (SAR)"
+ }
+ },
+ "card4l:specification_version": {
+ "label": "Specification Version"
+ },
+ "card4l:orbit_mean_altitude": {
+ "label": "Platform Altitude",
+ "unit": "m"
+ },
+ "card4l:incidence_angle_near_range": {
+ "label": "Incidence Angle (near)",
+ "unit": "°"
+ },
+ "card4l:incidence_angle_far_range": {
+ "label": "Incidence Angle (far)",
+ "unit": "°"
+ },
+ "card4l:noise_equivalent_intensity": {
+ "label": "Noise Equivalent Intensity",
+ "unit": "dB"
+ },
+ "card4l:mean_faraday_rotation_angle": {
+ "label": "Mean Faraday Rotation",
+ "unit": "°"
+ },
+ "card4l:speckle_filtering": {
+ "label": "Speckle Filtering",
+ "custom": true,
+ "summary": false,
+ "null": "not applied"
+ },
+ "card4l:relative_rtc_accuracy": {
+ "label": "Rel. RTC Accuracy",
+ "explain": "Relative accuracy of the Radiometric Terrain Correction",
+ "unit": "dB"
+ },
+ "card4l:absolute_rtc_accuracy": {
+ "label": "Abs. RTC Accuracy",
+ "explain": "Absolute accuracy of the Radiometric Terrain Correction",
+ "unit": "dB"
+ },
+ "card4l:northern_geometric_accuracy": {
+ "label": "Northern Geometric Accuracy",
+ "unit": "m"
+ },
+ "card4l:eastern_geometric_accuracy": {
+ "label": "Eastern Geometric Accuracy",
+ "unit": "m"
+ },
+ "card4l:ellipsoidal_height": {
+ "label": "Ellipsoidal Height",
+ "unit": "m"
+ },
+ "geoadmin:variant": {
+ "label": "Product Variant",
+ "mapping": {
+ "krel": "RGB color with relief",
+ "komb": "RGB color without relief",
+ "kgrel": "Grayscale with relief",
+ "kgrs": "Grayscale without relief"
+ }
+ },
+ "href:servers": {
+ "label": "Servers",
+ "ext": "web-map-links"
+ },
+ "pmtiles:layers": {
+ "label": "Layers",
+ "ext": "web-map-links"
+ },
+ "wms:layers": {
+ "label": "Layers",
+ "ext": "web-map-links"
+ },
+ "wms:styles": {
+ "label": "Styles",
+ "ext": "web-map-links"
+ },
+ "wms:dimensions": {
+ "label": "Dimensions",
+ "ext": "web-map-links"
+ },
+ "wms:transparent": {
+ "label": "Transparency",
+ "ext": "web-map-links"
+ },
+ "wmts:layer": {
+ "label": "Layers",
+ "ext": "web-map-links"
+ },
+ "wmts:dimensions": {
+ "label": "Dimensions",
+ "ext": "web-map-links"
+ }
+ }
+}
\ No newline at end of file
diff --git a/pystac/validation/jsonschemas/projection.json b/pystac/validation/jsonschemas/projection.json
new file mode 100644
index 000000000..1f9bd9a45
--- /dev/null
+++ b/pystac/validation/jsonschemas/projection.json
@@ -0,0 +1,186 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+ "title": "Projection Extension",
+ "description": "STAC Projection Extension for STAC Items.",
+ "$comment": "This schema succeeds if the proj: fields are not used at all, please keep this in mind.",
+ "oneOf": [
+ {
+ "$comment": "This is the schema for STAC Items.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/stac_extensions"
+ },
+ {
+ "type": "object",
+ "required": [
+ "type",
+ "properties",
+ "assets"
+ ],
+ "properties": {
+ "type": {
+ "const": "Feature"
+ },
+ "properties": {
+ "$ref": "#/definitions/fields"
+ },
+ "assets": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/fields"
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "$comment": "This is the schema for STAC Collections.",
+ "allOf": [
+ {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "const": "Collection"
+ },
+ "assets": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/fields"
+ }
+ },
+ "item_assets": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/fields"
+ }
+ }
+ }
+ },
+ {
+ "$ref": "#/definitions/stac_extensions"
+ }
+ ]
+ }
+ ],
+ "definitions": {
+ "stac_extensions": {
+ "type": "object",
+ "required": [
+ "stac_extensions"
+ ],
+ "properties": {
+ "stac_extensions": {
+ "type": "array",
+ "contains": {
+ "const": "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "object",
+ "properties": {
+ "proj:code":{
+ "title":"Projection code",
+ "type":[
+ "string",
+ "null"
+ ]
+ },
+ "proj:wkt2":{
+ "title":"Coordinate Reference System in WKT2 format",
+ "type":[
+ "string",
+ "null"
+ ]
+ },
+ "proj:projjson": {
+ "title":"Coordinate Reference System in PROJJSON format",
+ "oneOf": [
+ {
+ "$ref": "https://proj.org/schemas/v0.5/projjson.schema.json"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "proj:geometry":{
+ "$ref": "https://geojson.org/schema/Geometry.json"
+ },
+ "proj:bbox":{
+ "title":"Extent",
+ "type":"array",
+ "oneOf": [
+ {
+ "minItems":4,
+ "maxItems":4
+ },
+ {
+ "minItems":6,
+ "maxItems":6
+ }
+ ],
+ "items":{
+ "type":"number"
+ }
+ },
+ "proj:centroid":{
+ "title":"Centroid",
+ "type":"object",
+ "required": [
+ "lat",
+ "lon"
+ ],
+ "properties": {
+ "lat": {
+ "type": "number",
+ "minimum": -90,
+ "maximum": 90
+ },
+ "lon": {
+ "type": "number",
+ "minimum": -180,
+ "maximum": 180
+ }
+ }
+ },
+ "proj:shape":{
+ "title":"Shape",
+ "type":"array",
+ "minItems":2,
+ "maxItems":2,
+ "items":{
+ "type":"integer"
+ }
+ },
+ "proj:transform":{
+ "title":"Transform",
+ "type":"array",
+ "oneOf": [
+ {
+ "minItems":6,
+ "maxItems":6
+ },
+ {
+ "minItems":9,
+ "maxItems":9
+ }
+ ],
+ "items":{
+ "type":"number"
+ }
+ }
+ },
+ "patternProperties": {
+ "^(?!proj:)": {}
+ },
+ "additionalProperties": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/pystac/validation/local_validator.py b/pystac/validation/local_validator.py
index 48101b67c..e1aec6401 100644
--- a/pystac/validation/local_validator.py
+++ b/pystac/validation/local_validator.py
@@ -52,6 +52,11 @@ def get_local_schema_cache() -> dict[str, dict[str, Any]]:
"provider",
)
},
+ # FIXME: This is temporary, until https://github.com/stac-extensions/projection/pull/12
+ # is merged and released
+ "https://stac-extensions.github.io/projection/v2.0.0/schema.json": _read_schema(
+ "projection.json"
+ ),
}
diff --git a/scripts/pull-static b/scripts/pull-static
index 3b120727d..9a0b5d8f0 100755
--- a/scripts/pull-static
+++ b/scripts/pull-static
@@ -2,7 +2,7 @@
set -e
-VERSION="1.0.0-rc.1"
+VERSION="1.0.0-rc.1" #v1.5.0-beta.2 should work or no??
SRC="https://cdn.jsdelivr.net/npm/@radiantearth/stac-fields@$VERSION/fields-normalized.json"
HERE=$(dirname "$0")
DEST=$(dirname "$HERE")/pystac/static/fields-normalized.json
diff --git a/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/20170831_172754_101c/20170831_172754_101c.json b/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/20170831_172754_101c/20170831_172754_101c.json
index a4c58ab49..ca5f0037f 100644
--- a/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/20170831_172754_101c/20170831_172754_101c.json
+++ b/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/20170831_172754_101c/20170831_172754_101c.json
@@ -16,7 +16,7 @@
"view:sun_azimuth": 145.4,
"view:sun_elevation": 65.1,
"view:off_nadir": 0.2,
- "proj:epsg": 32615,
+ "proj:code": "EPSG:32615",
"pl:anomalous_pixels": 0.01,
"pl:columns": 8307,
"pl:ground_control": true,
@@ -143,7 +143,7 @@
"stac_extensions": [
"https://stac-extensions.github.io/eo/v1.1.0/schema.json",
"https://stac-extensions.github.io/view/v1.0.0/schema.json",
- "https://stac-extensions.github.io/projection/v1.0.0/schema.json"
+ "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
],
"collection": "planet-disaster-data"
}
\ No newline at end of file
diff --git a/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/Houston-East-20170831-103f-100d-0f4f-RGB/Houston-East-20170831-103f-100d-0f4f-RGB.json b/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/Houston-East-20170831-103f-100d-0f4f-RGB/Houston-East-20170831-103f-100d-0f4f-RGB.json
index 8579544c7..6daa72c67 100644
--- a/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/Houston-East-20170831-103f-100d-0f4f-RGB/Houston-East-20170831-103f-100d-0f4f-RGB.json
+++ b/tests/data-files/catalogs/planet-example-v1.0.0-beta.2/hurricane-harvey/hurricane-harvey-0831/Houston-East-20170831-103f-100d-0f4f-RGB/Houston-East-20170831-103f-100d-0f4f-RGB.json
@@ -13,7 +13,7 @@
"view:sun_azimuth": 145.5,
"view:sun_elevation": 64.9,
"view:off_nadir": 0.2,
- "proj:epsg": 32615,
+ "proj:code": "EPSG:32615",
"pl:ground_control": true
},
"geometry": {
@@ -86,7 +86,7 @@
"stac_extensions": [
"https://stac-extensions.github.io/eo/v1.1.0/schema.json",
"https://stac-extensions.github.io/view/v1.0.0/schema.json",
- "https://stac-extensions.github.io/projection/v1.0.0/schema.json"
+ "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
],
"collection": "planet-disaster-data"
}
\ No newline at end of file
diff --git a/tests/data-files/catalogs/test-case-5/CBERS4/CBERS4MUX/CBERS4-MUX-027/CBERS4-MUX-027/069/CBERS_4_MUX_20190510_027_069_L2/CBERS_4_MUX_20190510_027_069_L2.json b/tests/data-files/catalogs/test-case-5/CBERS4/CBERS4MUX/CBERS4-MUX-027/CBERS4-MUX-027/069/CBERS_4_MUX_20190510_027_069_L2/CBERS_4_MUX_20190510_027_069_L2.json
index 267b41344..6729a57d7 100644
--- a/tests/data-files/catalogs/test-case-5/CBERS4/CBERS4MUX/CBERS4-MUX-027/CBERS4-MUX-027/069/CBERS_4_MUX_20190510_027_069_L2/CBERS_4_MUX_20190510_027_069_L2.json
+++ b/tests/data-files/catalogs/test-case-5/CBERS4/CBERS4MUX/CBERS4-MUX-027/CBERS4-MUX-027/069/CBERS_4_MUX_20190510_027_069_L2/CBERS_4_MUX_20190510_027_069_L2.json
@@ -30,7 +30,7 @@
"cbers:data_type": "L2",
"cbers:path": 27,
"cbers:row": 69,
- "proj:epsg": 32687,
+ "proj:code": "EPSG:32687",
"view:off_nadir": 0.00239349,
"view:sun_azimuth": 110.943,
"view:sun_elevation": 66.3097
@@ -139,7 +139,7 @@
],
"stac_extensions": [
"https://stac-extensions.github.io/eo/v1.1.0/schema.json",
- "https://stac-extensions.github.io/projection/v1.0.0/schema.json",
+ "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
"https://stac-extensions.github.io/view/v1.0.0/schema.json"
],
"collection": "CBERS4MUX"
diff --git a/tests/data-files/projection/collection-with-summaries.json b/tests/data-files/projection/collection-with-summaries.json
index f471e198d..5a578a4a7 100644
--- a/tests/data-files/projection/collection-with-summaries.json
+++ b/tests/data-files/projection/collection-with-summaries.json
@@ -21,11 +21,11 @@
}
],
"stac_extensions": [
- "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+ "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
],
"summaries": {
- "proj:epsg": [
- 32614
+ "proj:code": [
+ "EPSG:32614"
]
},
"extent": {
diff --git a/tests/data-files/projection/example-landsat8.json b/tests/data-files/projection/example-landsat8.json
index b15bd7013..e40b27053 100644
--- a/tests/data-files/projection/example-landsat8.json
+++ b/tests/data-files/projection/example-landsat8.json
@@ -4,7 +4,7 @@
"id": "LC81530252014153LGN00",
"properties": {
"datetime": "2018-10-01T01:08:32.033000Z",
- "proj:epsg": 32614,
+ "proj:code": "EPSG:32614",
"proj:wkt2": "PROJCS[\"WGS 84 / UTM zone 14N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-99],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],AUTHORITY[\"EPSG\",\"32614\"],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]]",
"proj:projjson": {
"$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
@@ -240,7 +240,7 @@
"full_width_half_max": 0.18
}
],
- "proj:epsg": 9999,
+ "proj:code": "EPSG:9999",
"proj:wkt2": "PROJCS[\"WGS 84 / UTM zone 14N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-99],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],AUTHORITY[\"EPSG\",\"32614\"],AXIS[\"Easting\",EAST],AXIS[\"Northing\",TEST_TEXT]]",
"proj:projjson": {
"$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
@@ -427,7 +427,7 @@
],
"stac_extensions": [
"https://stac-extensions.github.io/eo/v1.1.0/schema.json",
- "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+ "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
],
"collection": "landsat-8-l1"
}
\ No newline at end of file
diff --git a/tests/data-files/projection/example-with-version-1.1.json b/tests/data-files/projection/example-with-version-1.1.json
new file mode 100644
index 000000000..f03c671a7
--- /dev/null
+++ b/tests/data-files/projection/example-with-version-1.1.json
@@ -0,0 +1,433 @@
+{
+ "type": "Feature",
+ "stac_version": "1.0.0",
+ "id": "LC81530252014153LGN00",
+ "properties": {
+ "datetime": "2018-10-01T01:08:32.033000Z",
+ "proj:epsg": 32614,
+ "proj:wkt2": "PROJCS[\"WGS 84 / UTM zone 14N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-99],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],AUTHORITY[\"EPSG\",\"32614\"],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]]",
+ "proj:projjson": {
+ "$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
+ "type": "ProjectedCRS",
+ "name": "WGS 84 / UTM zone 14N",
+ "base_crs": {
+ "name": "WGS 84",
+ "datum": {
+ "type": "GeodeticReferenceFrame",
+ "name": "World Geodetic System 1984",
+ "ellipsoid": {
+ "name": "WGS 84",
+ "semi_major_axis": 6378137,
+ "inverse_flattening": 298.257223563
+ }
+ },
+ "coordinate_system": {
+ "subtype": "ellipsoidal",
+ "axis": [
+ {
+ "name": "Geodetic latitude",
+ "abbreviation": "Lat",
+ "direction": "north",
+ "unit": "degree"
+ },
+ {
+ "name": "Geodetic longitude",
+ "abbreviation": "Lon",
+ "direction": "east",
+ "unit": "degree"
+ }
+ ]
+ },
+ "id": {
+ "authority": "EPSG",
+ "code": 4326
+ }
+ },
+ "conversion": {
+ "name": "UTM zone 14N",
+ "method": {
+ "name": "Transverse Mercator",
+ "id": {
+ "authority": "EPSG",
+ "code": 9807
+ }
+ },
+ "parameters": [
+ {
+ "name": "Latitude of natural origin",
+ "value": 0,
+ "unit": "degree",
+ "id": {
+ "authority": "EPSG",
+ "code": 8801
+ }
+ },
+ {
+ "name": "Longitude of natural origin",
+ "value": -99,
+ "unit": "degree",
+ "id": {
+ "authority": "EPSG",
+ "code": 8802
+ }
+ },
+ {
+ "name": "Scale factor at natural origin",
+ "value": 0.9996,
+ "unit": "unity",
+ "id": {
+ "authority": "EPSG",
+ "code": 8805
+ }
+ },
+ {
+ "name": "False easting",
+ "value": 500000,
+ "unit": "metre",
+ "id": {
+ "authority": "EPSG",
+ "code": 8806
+ }
+ },
+ {
+ "name": "False northing",
+ "value": 0,
+ "unit": "metre",
+ "id": {
+ "authority": "EPSG",
+ "code": 8807
+ }
+ }
+ ]
+ },
+ "coordinate_system": {
+ "subtype": "Cartesian",
+ "axis": [
+ {
+ "name": "Easting",
+ "abbreviation": "E",
+ "direction": "east",
+ "unit": "metre"
+ },
+ {
+ "name": "Northing",
+ "abbreviation": "N",
+ "direction": "north",
+ "unit": "metre"
+ }
+ ]
+ },
+ "area": "World - N hemisphere - 102\u00b0W to 96\u00b0W - by country",
+ "bbox": {
+ "south_latitude": 0,
+ "west_longitude": -102,
+ "north_latitude": 84,
+ "east_longitude": -96
+ },
+ "id": {
+ "authority": "EPSG",
+ "code": 32614
+ }
+ },
+ "proj:geometry": {
+ "coordinates": [
+ [
+ [
+ 169200.0,
+ 3712800.0
+ ],
+ [
+ 403200.0,
+ 3712800.0
+ ],
+ [
+ 403200.0,
+ 3951000.0
+ ],
+ [
+ 169200.0,
+ 3951000.0
+ ],
+ [
+ 169200.0,
+ 3712800.0
+ ]
+ ]
+ ],
+ "type": "Polygon"
+ },
+ "proj:bbox": [
+ 169200.0,
+ 3712800.0,
+ 403200.0,
+ 3951000.0
+ ],
+ "proj:centroid": {
+ "lat": 34.595302781575604,
+ "lon": -101.34448382627504
+ },
+ "proj:shape": [
+ 8391,
+ 8311
+ ],
+ "proj:transform": [
+ 30.0,
+ 0.0,
+ 224985.0,
+ 0.0,
+ -30.0,
+ 6790215.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ },
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ 152.52758,
+ 60.63437
+ ],
+ [
+ 149.1755,
+ 61.19016
+ ],
+ [
+ 148.13933,
+ 59.51584
+ ],
+ [
+ 151.33786,
+ 58.97792
+ ],
+ [
+ 152.52758,
+ 60.63437
+ ]
+ ]
+ ]
+ },
+ "links": [
+ {
+ "rel": "collection",
+ "href": "https://example.com/landsat/collection.json"
+ }
+ ],
+ "assets": {
+ "B1": {
+ "href": "https://landsat-pds.s3.amazonaws.com/c1/L8/107/018/LC08_L1TP_107018_20181001_20181001_01_RT/LC08_L1TP_107018_20181001_20181001_01_RT_B1.TIF",
+ "type": "image/tiff; application=geotiff",
+ "title": "Band 1 (coastal)",
+ "eo:bands": [
+ {
+ "name": "B1",
+ "common_name": "coastal",
+ "center_wavelength": 0.44,
+ "full_width_half_max": 0.02
+ }
+ ]
+ },
+ "B8": {
+ "href": "https://landsat-pds.s3.amazonaws.com/c1/L8/107/018/LC08_L1TP_107018_20181001_20181001_01_RT/LC08_L1TP_107018_20181001_20181001_01_RT_B8.TIF",
+ "type": "image/tiff; application=geotiff",
+ "title": "Band 8 (panchromatic)",
+ "eo:bands": [
+ {
+ "name": "B8",
+ "center_wavelength": 0.59,
+ "full_width_half_max": 0.18
+ }
+ ],
+ "proj:epsg": 9999,
+ "proj:wkt2": "PROJCS[\"WGS 84 / UTM zone 14N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-99],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],AUTHORITY[\"EPSG\",\"32614\"],AXIS[\"Easting\",EAST],AXIS[\"Northing\",TEST_TEXT]]",
+ "proj:projjson": {
+ "$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
+ "type": "ProjectedCRS",
+ "name": "WGS 84 / UTM zone 14N",
+ "base_crs": {
+ "name": "WGS 84",
+ "datum": {
+ "type": "GeodeticReferenceFrame",
+ "name": "World Geodetic System 1984",
+ "ellipsoid": {
+ "name": "WGS 84",
+ "semi_major_axis": 6378137,
+ "inverse_flattening": 298.257223563
+ }
+ },
+ "coordinate_system": {
+ "subtype": "ellipsoidal",
+ "axis": [
+ {
+ "name": "Geodetic latitude",
+ "abbreviation": "Lat",
+ "direction": "north",
+ "unit": "degree"
+ },
+ {
+ "name": "Geodetic longitude",
+ "abbreviation": "Lon",
+ "direction": "east",
+ "unit": "degree"
+ }
+ ]
+ },
+ "id": {
+ "authority": "EPSG",
+ "code": 4326
+ }
+ },
+ "conversion": {
+ "name": "UTM zone 14N",
+ "method": {
+ "name": "Transverse Mercator",
+ "id": {
+ "authority": "EPSG",
+ "code": 9807
+ }
+ },
+ "parameters": [
+ {
+ "name": "Latitude of natural origin",
+ "value": 0,
+ "unit": "degree",
+ "id": {
+ "authority": "EPSG",
+ "code": 8801
+ }
+ },
+ {
+ "name": "Longitude of natural origin",
+ "value": -99,
+ "unit": "degree",
+ "id": {
+ "authority": "EPSG",
+ "code": 8802
+ }
+ },
+ {
+ "name": "Scale factor at natural origin",
+ "value": 0.9996,
+ "unit": "unity",
+ "id": {
+ "authority": "EPSG",
+ "code": 8805
+ }
+ },
+ {
+ "name": "False easting",
+ "value": 500000,
+ "unit": "metre",
+ "id": {
+ "authority": "EPSG",
+ "code": 8806
+ }
+ },
+ {
+ "name": "False northing",
+ "value": 0,
+ "unit": "metre",
+ "id": {
+ "authority": "EPSG",
+ "code": 8807
+ }
+ }
+ ]
+ },
+ "coordinate_system": {
+ "subtype": "Cartesian",
+ "axis": [
+ {
+ "name": "Easting",
+ "abbreviation": "E",
+ "direction": "east",
+ "unit": "metre"
+ },
+ {
+ "name": "Northing",
+ "abbreviation": "N",
+ "direction": "north",
+ "unit": "metre"
+ }
+ ]
+ },
+ "area": "World - N hemisphere - 102\u00b0W to 96\u00b0W - by country",
+ "bbox": {
+ "south_latitude": 0,
+ "west_longitude": -102,
+ "north_latitude": 84,
+ "east_longitude": -96
+ },
+ "id": {
+ "authority": "EPSG",
+ "code": 9999
+ }
+ },
+ "proj:geometry": {
+ "coordinates": [
+ [
+ [
+ 0.0,
+ 0.0
+ ],
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 1.0,
+ 1.0
+ ],
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0
+ ]
+ ]
+ ],
+ "type": "Polygon"
+ },
+ "proj:bbox": [
+ 1.0,
+ 2.0,
+ 3.0,
+ 4.0
+ ],
+ "proj:centroid": {
+ "lat": 0.5,
+ "lon": 0.3
+ },
+ "proj:shape": [
+ 16781,
+ 16621
+ ],
+ "proj:transform": [
+ 15.0,
+ 0.0,
+ 224992.5,
+ 0.0,
+ -15.0,
+ 6790207.5,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ }
+ },
+ "bbox": [
+ 148.13933,
+ 59.51584,
+ 152.52758,
+ 60.63437
+ ],
+ "stac_extensions": [
+ "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+ "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+ ],
+ "collection": "landsat-8-l1"
+ }
\ No newline at end of file
diff --git a/tests/data-files/projection/optional-epsg.json b/tests/data-files/projection/optional-epsg.json
index 37c5dd0f6..1f2bd8226 100644
--- a/tests/data-files/projection/optional-epsg.json
+++ b/tests/data-files/projection/optional-epsg.json
@@ -132,7 +132,7 @@
"description": "Pixel opacity (0: fully transparent; 255: fully opaque)"
}
],
- "proj:epsg": 32618,
+ "proj:code": "EPSG:32618",
"proj:bbox": [
363546.0,
2755638.0,
@@ -170,7 +170,7 @@
"https://stac-extensions.github.io/eo/v1.1.0/schema.json",
"https://stac-extensions.github.io/view/v1.0.0/schema.json",
"https://stac-extensions.github.io/raster/v1.1.0/schema.json",
- "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+ "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
],
"collection": "psscene-vis-clip: PSScene"
}
\ No newline at end of file
diff --git a/tests/data-files/summaries/fields_no_bands.json b/tests/data-files/summaries/fields_no_bands.json
index 96ec883ae..27bd9550d 100644
--- a/tests/data-files/summaries/fields_no_bands.json
+++ b/tests/data-files/summaries/fields_no_bands.json
@@ -361,9 +361,8 @@
"summary": false
},
- "proj:epsg": {
- "label": "EPSG Code",
- "format": "EPSG",
+ "proj:code": {
+ "label": "Proj Code",
"summary": "v"
},
"proj:wkt2": {
diff --git a/tests/extensions/cassettes/test_classification/test_validate_classification.yaml b/tests/extensions/cassettes/test_classification/test_validate_classification.yaml
index 652b93a90..9de4ac7bb 100644
--- a/tests/extensions/cassettes/test_classification/test_validate_classification.yaml
+++ b/tests/extensions/cassettes/test_classification/test_validate_classification.yaml
@@ -847,7 +847,7 @@ interactions:
Access-Control-Allow-Origin:
- '*'
Age:
- - '1'
+ - '0'
Cache-Control:
- max-age=600
Connection:
@@ -871,9 +871,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- 67b8727546644f385c7db6b26afaf5f8badae4a5
X-GitHub-Request-Id:
diff --git a/tests/extensions/cassettes/test_projection/ProjectionTest.test_bbox.yaml b/tests/extensions/cassettes/test_projection/ProjectionTest.test_bbox.yaml
index 1dfadffe0..c0353991f 100644
--- a/tests/extensions/cassettes/test_projection/ProjectionTest.test_bbox.yaml
+++ b/tests/extensions/cassettes/test_projection/ProjectionTest.test_bbox.yaml
@@ -267,7 +267,7 @@ interactions:
Access-Control-Allow-Origin:
- '*'
CF-Cache-Status:
- - EXPIRED
+ - MISS
CF-Ray:
- 86ba48d70b7c3354-EWR
Cache-Control:
diff --git a/tests/extensions/cassettes/test_projection/ProjectionTest.test_centroid.yaml b/tests/extensions/cassettes/test_projection/ProjectionTest.test_centroid.yaml
index 4dbf18fae..9684eb87d 100644
--- a/tests/extensions/cassettes/test_projection/ProjectionTest.test_centroid.yaml
+++ b/tests/extensions/cassettes/test_projection/ProjectionTest.test_centroid.yaml
@@ -841,7 +841,7 @@ interactions:
Age:
- '3705'
CF-Cache-Status:
- - HIT
+ - MISS
CF-Ray:
- 86ba48db5ba97cf0-EWR
Cache-Control:
diff --git a/tests/extensions/cassettes/test_projection/ProjectionTest.test_epsg.yaml b/tests/extensions/cassettes/test_projection/ProjectionTest.test_epsg.yaml
index 114c210c8..98769bf6d 100644
--- a/tests/extensions/cassettes/test_projection/ProjectionTest.test_epsg.yaml
+++ b/tests/extensions/cassettes/test_projection/ProjectionTest.test_epsg.yaml
@@ -269,7 +269,7 @@ interactions:
Age:
- '1'
CF-Cache-Status:
- - HIT
+ - MISS
CF-Ray:
- 86ba48dda8cd41df-EWR
Cache-Control:
diff --git a/tests/extensions/cassettes/test_projection/ProjectionTest.test_geometry.yaml b/tests/extensions/cassettes/test_projection/ProjectionTest.test_geometry.yaml
index 51c884254..cb4585723 100644
--- a/tests/extensions/cassettes/test_projection/ProjectionTest.test_geometry.yaml
+++ b/tests/extensions/cassettes/test_projection/ProjectionTest.test_geometry.yaml
@@ -841,7 +841,7 @@ interactions:
Age:
- '3706'
CF-Cache-Status:
- - HIT
+ - MISS
CF-Ray:
- 86ba48e0eadc43c9-EWR
Cache-Control:
diff --git a/tests/extensions/cassettes/test_projection/ProjectionTest.test_shape.yaml b/tests/extensions/cassettes/test_projection/ProjectionTest.test_shape.yaml
index 3400d84d2..82763fa35 100644
--- a/tests/extensions/cassettes/test_projection/ProjectionTest.test_shape.yaml
+++ b/tests/extensions/cassettes/test_projection/ProjectionTest.test_shape.yaml
@@ -269,7 +269,7 @@ interactions:
Age:
- '2'
CF-Cache-Status:
- - HIT
+ - MISS
CF-Ray:
- 86ba48e8ea928c8d-EWR
Cache-Control:
@@ -841,7 +841,7 @@ interactions:
Age:
- '3707'
CF-Cache-Status:
- - HIT
+ - MISS
CF-Ray:
- 86ba48e99ff219cf-EWR
Cache-Control:
diff --git a/tests/extensions/cassettes/test_raster/RasterTest.test_asset_bands.yaml b/tests/extensions/cassettes/test_raster/RasterTest.test_asset_bands.yaml
index 5143831e1..ee1497397 100644
--- a/tests/extensions/cassettes/test_raster/RasterTest.test_asset_bands.yaml
+++ b/tests/extensions/cassettes/test_raster/RasterTest.test_asset_bands.yaml
@@ -221,7 +221,7 @@ interactions:
X-Cache:
- HIT
X-Cache-Hits:
- - '1'
+ - '2'
X-Fastly-Request-ID:
- bb1c748b83ff2a8146d220798309759672d99353
X-GitHub-Request-Id:
diff --git a/tests/extensions/test_eo.py b/tests/extensions/test_eo.py
index a51ac6c10..b0b1703c2 100644
--- a/tests/extensions/test_eo.py
+++ b/tests/extensions/test_eo.py
@@ -366,8 +366,9 @@ def test_migration(self) -> None:
item = Item.from_file(self.item_0_8_path)
self.assertNotIn("eo:epsg", item.properties)
- self.assertIn("proj:epsg", item.properties)
+ self.assertIn("proj:code", item.properties)
self.assertIn(ProjectionExtension.get_schema_uri(), item.stac_extensions)
+ assert item.ext.proj.epsg == item_dict["properties"]["eo:epsg"]
@pytest.fixture
diff --git a/tests/extensions/test_projection.py b/tests/extensions/test_projection.py
index 74d36cc35..64a395efe 100644
--- a/tests/extensions/test_projection.py
+++ b/tests/extensions/test_projection.py
@@ -92,7 +92,7 @@ def test_apply(self) -> None:
ProjectionExtension.add_to(item)
ProjectionExtension.ext(item).apply(
- 4326,
+ epsg=4326,
wkt2=WKT2,
projjson=PROJJSON,
geometry=item.geometry,
@@ -121,14 +121,15 @@ def test_epsg(self) -> None:
proj_item = pystac.Item.from_file(self.example_uri)
# Get
- self.assertIn("proj:epsg", proj_item.properties)
+ self.assertNotIn("proj:epsg", proj_item.properties)
+ self.assertIn("proj:code", proj_item.properties)
proj_epsg = ProjectionExtension.ext(proj_item).epsg
- self.assertEqual(proj_epsg, proj_item.properties["proj:epsg"])
+ self.assertEqual(f"EPSG:{proj_epsg}", proj_item.properties["proj:code"])
# Set
assert proj_epsg is not None
ProjectionExtension.ext(proj_item).epsg = proj_epsg + 100
- self.assertEqual(proj_epsg + 100, proj_item.properties["proj:epsg"])
+ self.assertEqual(f"EPSG:{proj_epsg + 100}", proj_item.properties["proj:code"])
# Get from Asset
asset_no_prop = proj_item.assets["B1"]
@@ -156,6 +157,7 @@ def test_optional_epsg(self) -> None:
# No proj info on item
self.assertNotIn("proj:epsg", proj_item.properties)
+ self.assertNotIn("proj:code", proj_item.properties)
# Some proj info on assets
asset_no_prop = proj_item.assets["metadata"]
@@ -250,6 +252,7 @@ def test_crs_string(self) -> None:
for key in list(item.properties.keys()):
if key.startswith("proj:"):
item.properties.pop(key)
+ self.assertIsNone(item.properties.get("proj:code"))
self.assertIsNone(item.properties.get("proj:epsg"))
self.assertIsNone(item.properties.get("proj:wkt2"))
self.assertIsNone(item.properties.get("proj:projjson"))
@@ -266,6 +269,9 @@ def test_crs_string(self) -> None:
projection.epsg = 4326
self.assertEqual(projection.crs_string, "EPSG:4326")
+ projection.code = "IAU_2015:49900"
+ self.assertEqual(projection.crs_string, "IAU_2015:49900")
+
@pytest.mark.vcr()
def test_geometry(self) -> None:
proj_item = pystac.Item.from_file(self.example_uri)
@@ -530,8 +536,7 @@ def test_set_summaries(self) -> None:
proj_summaries.epsg = [4326]
col_dict = col.to_dict()
- self.assertEqual(len(col_dict["summaries"]["proj:epsg"]), 1)
- self.assertEqual(col_dict["summaries"]["proj:epsg"][0], 4326)
+ self.assertEqual(col_dict["summaries"]["proj:code"], ["EPSG:4326"])
def test_summaries_adds_uri(self) -> None:
col = pystac.Collection.from_file(self.example_uri)
@@ -549,9 +554,34 @@ def test_summaries_adds_uri(self) -> None:
self.assertNotIn(ProjectionExtension.get_schema_uri(), col.stac_extensions)
+@pytest.mark.vcr()
+def test_get_set_code(projection_landsat8_item: Item) -> None:
+ proj_item = projection_landsat8_item
+ assert proj_item.ext.proj.code == proj_item.properties["proj:code"]
+ assert proj_item.ext.proj.epsg == 32614
+
+ proj_item.ext.proj.code = "IAU_2015:30100"
+ assert proj_item.ext.proj.epsg is None
+ assert proj_item.properties["proj:code"] == "IAU_2015:30100"
+
+
+def test_migrate() -> None:
+ old = "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+ current = "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
+
+ path = TestCases.get_path("data-files/projection/example-with-version-1.1.json")
+ item = Item.from_file(path)
+
+ assert old not in item.stac_extensions
+ assert current in item.stac_extensions
+
+ assert item.ext.proj.epsg == 32614
+ assert item.ext.proj.code == "EPSG:32614"
+
+
def test_older_extension_version(projection_landsat8_item: Item) -> None:
old = "https://stac-extensions.github.io/projection/v1.0.0/schema.json"
- current = "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+ current = "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
stac_extensions = set(projection_landsat8_item.stac_extensions)
stac_extensions.remove(current)
@@ -570,8 +600,8 @@ def test_older_extension_version(projection_landsat8_item: Item) -> None:
def test_newer_extension_version(projection_landsat8_item: Item) -> None:
- new = "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
- current = "https://stac-extensions.github.io/projection/v1.1.0/schema.json"
+ new = "https://stac-extensions.github.io/projection/v2.1.0/schema.json"
+ current = "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
stac_extensions = set(projection_landsat8_item.stac_extensions)
stac_extensions.remove(current)
diff --git a/tests/test_summaries.py b/tests/test_summaries.py
index 208e2632d..a37aabd2d 100644
--- a/tests/test_summaries.py
+++ b/tests/test_summaries.py
@@ -12,7 +12,7 @@ def test_summary(self) -> None:
summaries = Summarizer().summarize(coll.get_items(recursive=True))
summaries_dict = summaries.to_dict()
self.assertEqual(len(summaries_dict["eo:bands"]), 4)
- self.assertEqual(len(summaries_dict["proj:epsg"]), 1)
+ self.assertEqual(len(summaries_dict["proj:code"]), 1)
def test_summary_limit(self) -> None:
coll = TestCases.case_5()
@@ -20,7 +20,7 @@ def test_summary_limit(self) -> None:
summaries.maxcount = 2
summaries_dict = summaries.to_dict()
self.assertIsNone(summaries_dict.get("eo:bands"))
- self.assertEqual(len(summaries_dict["proj:epsg"]), 1)
+ self.assertEqual(len(summaries_dict["proj:code"]), 1)
def test_summary_custom_fields_file(self) -> None:
coll = TestCases.case_5()
@@ -28,21 +28,21 @@ def test_summary_custom_fields_file(self) -> None:
summaries = Summarizer(path).summarize(coll.get_items(recursive=True))
summaries_dict = summaries.to_dict()
self.assertIsNone(summaries_dict.get("eo:bands"))
- self.assertEqual(len(summaries_dict["proj:epsg"]), 1)
+ self.assertEqual(len(summaries_dict["proj:code"]), 1)
def test_summary_custom_fields_dict(self) -> None:
coll = TestCases.case_5()
spec = {
"eo:bands": SummaryStrategy.DONT_SUMMARIZE,
- "proj:epsg": SummaryStrategy.ARRAY,
+ "proj:code": SummaryStrategy.ARRAY,
}
obj = Summarizer(spec)
self.assertTrue("eo:bands" not in obj.summaryfields)
- self.assertEqual(obj.summaryfields["proj:epsg"], SummaryStrategy.ARRAY)
+ self.assertEqual(obj.summaryfields["proj:code"], SummaryStrategy.ARRAY)
summaries = obj.summarize(coll.get_items(recursive=True))
summaries_dict = summaries.to_dict()
self.assertIsNone(summaries_dict.get("eo:bands"))
- self.assertEqual(len(summaries_dict["proj:epsg"]), 1)
+ self.assertEqual(len(summaries_dict["proj:code"]), 1)
def test_summary_wrong_custom_fields_file(self) -> None:
coll = TestCases.case_5()
@@ -77,8 +77,6 @@ def test_clone_summary(self) -> None:
coll = TestCases.case_5()
summaries = Summarizer().summarize(coll.get_items(recursive=True))
summaries_dict = summaries.to_dict()
- self.assertEqual(len(summaries_dict["eo:bands"]), 4)
- self.assertEqual(len(summaries_dict["proj:epsg"]), 1)
clone = summaries.clone()
self.assertTrue(isinstance(clone, Summaries))
clone_dict = clone.to_dict()
diff --git a/tests/utils/test_cases.py b/tests/utils/test_cases.py
index 220814513..97184d836 100644
--- a/tests/utils/test_cases.py
+++ b/tests/utils/test_cases.py
@@ -214,6 +214,6 @@ def case_8() -> Collection:
"""Planet disaster data example catalog, 1.0.0-beta.2"""
return Collection.from_file(
TestCases.get_path(
- "data-files/catalogs/" "planet-example-v1.0.0-beta.2/collection.json"
+ "data-files/catalogs/planet-example-v1.0.0-beta.2/collection.json"
)
)
diff --git a/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case4].yaml b/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case4].yaml
index aceaaed5e..3d018bc90 100644
--- a/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case4].yaml
+++ b/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case4].yaml
@@ -446,7 +446,7 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- '2'
X-Content-Type-Options:
@@ -570,9 +570,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Content-Type-Options:
- nosniff
X-Fastly-Request-ID:
@@ -724,9 +724,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- 4adc29ce9a595db0e8bba4f927f48df14a5e4e3e
X-GitHub-Request-Id:
@@ -791,9 +791,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- 3a296ccae1dad69a0690d0b24dd04ac91cf1ecf3
X-GitHub-Request-Id:
@@ -873,9 +873,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- 2c761f2be337f928d7e8674b82936ecc05009d1e
X-GitHub-Request-Id:
@@ -942,9 +942,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- b85058cd3721293382bb36e0fadc0d504ed1a25a
X-GitHub-Request-Id:
@@ -1006,9 +1006,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- e2c4004ed5992fc7cc4154e5b2f15461b0bd5c16
X-GitHub-Request-Id:
@@ -1081,9 +1081,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- 7617b5f7f04eefc6b5f1dcfe3a488bdbf5e8f608
X-GitHub-Request-Id:
@@ -1236,7 +1236,7 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- '1'
X-Fastly-Request-ID:
@@ -1315,9 +1315,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Content-Type-Options:
- nosniff
X-Fastly-Request-ID:
diff --git a/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case6].yaml b/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case6].yaml
index 3ac41a9d8..1119369e3 100644
--- a/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case6].yaml
+++ b/tests/validation/cassettes/test_validate/TestValidate.test_validate_all_dict[test_case6].yaml
@@ -111,9 +111,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- 3ae2a56212cd0f873dd77a532a6871ecc94b1851
X-GitHub-Request-Id:
@@ -203,9 +203,9 @@ interactions:
Via:
- 1.1 varnish
X-Cache:
- - HIT
+ - MISS
X-Cache-Hits:
- - '1'
+ - '0'
X-Fastly-Request-ID:
- d6995b3c270e8f87558c61daa93178c7ddb21560
X-GitHub-Request-Id: