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: