From dffd6cc525a0e25a731064d6de9b14baab2ba8f8 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Fri, 13 Oct 2023 19:21:24 -0600 Subject: [PATCH 01/31] Starting to refactor towards nd coordinates --- stackstac/coordinates.py | 289 ++++++++++++++++++++++ stackstac/coordinates_utils.py | 122 +++++++++ stackstac/prepare.py | 187 +------------- stackstac/stack.py | 5 +- stackstac/tests/items.json | 1 + stackstac/tests/test_coordinates.py | 22 ++ stackstac/tests/test_coordinates_utils.py | 95 +++++++ 7 files changed, 533 insertions(+), 188 deletions(-) create mode 100644 stackstac/coordinates.py create mode 100644 stackstac/coordinates_utils.py create mode 100644 stackstac/tests/items.json create mode 100644 stackstac/tests/test_coordinates.py create mode 100644 stackstac/tests/test_coordinates_utils.py diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py new file mode 100644 index 0000000..5c498c0 --- /dev/null +++ b/stackstac/coordinates.py @@ -0,0 +1,289 @@ +from __future__ import annotations + +from typing import ( + Literal, + Mapping, + Sequence, + Union, + Tuple, + List, + Dict, + Any, +) + + +import numpy as np +import pandas as pd +import xarray as xr + +from stackstac.coordinates_utils import ( + deduplicate_axes, + descalar_obj_array, + scalar_sequence, + unnest_dicts, +) + +from .raster_spec import RasterSpec + +from .stac_types import ItemSequence +from . import accumulate_metadata + +ASSET_TABLE_DT = np.dtype( + [("url", object), ("bounds", "float64", 4), ("scale_offset", "float64", 2)] +) +Coordinates = Mapping[str, Union[pd.Index, np.ndarray, xr.Variable, list]] + + +def to_coords( + items: ItemSequence, + asset_ids: List[str], + spec: RasterSpec, + xy_coords: Literal["center", "topleft", False] = "topleft", + properties: Union[bool, str, Sequence[str]] = True, + band_coords: bool = True, +) -> Tuple[Coordinates, List[str]]: + + times = pd.to_datetime( + [item["properties"]["datetime"] for item in items], + infer_datetime_format=True, + errors="coerce", + ) + if times.tz is not None: + # xarray can't handle tz-aware DatetimeIndexes, so we convert to UTC and drop the timezone + # https://github.com/pydata/xarray/issues/3291. + # The `tz is None` case is typically a manifestation of https://github.com/pandas-dev/pandas/issues/41047. + # Since all STAC timestamps should be UTC (https://github.com/radiantearth/stac-spec/issues/1095), + # we feel safe assuming that any tz-naive datetimes are already in UTC. + times = times.tz_convert(None) + + dims = ["time", "band", "y", "x"] + coords = { + "time": times, + "id": xr.Variable("time", [item["id"] for item in items]), + "band": asset_ids, + } + + if xy_coords is not False: + if xy_coords == "center": + pixel_center = True + elif xy_coords == "topleft": + pixel_center = False + else: + raise ValueError( + f"xy_coords must be 'center', 'topleft', or False, not {xy_coords!r}" + ) + + transform = spec.transform + # We generate the transform ourselves in `RasterSpec`, and it's always constructed to be rectilinear. + # Someday, this should not always be the case, in order to support non-rectilinear data without warping. + assert ( + transform.is_rectilinear + ), f"Non-rectilinear transform generated: {transform}" + minx, miny, maxx, maxy = spec.bounds + xres, yres = spec.resolutions_xy + + if pixel_center: + half_xpixel, half_ypixel = xres / 2, yres / 2 + minx, miny, maxx, maxy = ( + minx + half_xpixel, + miny - half_ypixel, + maxx + half_xpixel, + maxy - half_ypixel, + ) + + height, width = spec.shape + # Wish pandas had an RangeIndex that supported floats... + # https://github.com/pandas-dev/pandas/issues/46484 + xs = pd.Index(np.linspace(minx, maxx, width, endpoint=False), dtype="float64") + ys = pd.Index(np.linspace(maxy, miny, height, endpoint=False), dtype="float64") + + coords["x"] = xs + coords["y"] = ys + + if properties: + coords.update(items_to_property_coords(items, properties)) + + if band_coords: + coords.update(items_to_band_coords2(items, asset_ids)) + + # Add `epsg` last in case it's also a field in properties; our data model assumes it's a coordinate + coords["epsg"] = spec.epsg + + return coords, dims + + +def items_to_property_coords( + items: ItemSequence, properties: Union[str, Sequence[str], Literal[True]] +) -> Coordinates: + return accumulate_metadata.metadata_to_coords( + (item["properties"] for item in items), + "time", + fields=properties, + skip_fields={"datetime"}, + # skip_fields={"datetime", "providers"}, + ) + + +def items_to_band_coords( + items: ItemSequence, + asset_ids: List[str], +) -> Coordinates: + flattened_metadata_by_asset = [ + accumulate_metadata.accumulate_metadata( + (item["assets"].get(asset_id, {}) for item in items), + # skip_fields={"href", "type", "roles"}, + ) + for asset_id in asset_ids + ] + + eo_by_asset = [] + for meta in flattened_metadata_by_asset: + # NOTE: we look for `eo:bands` in each Asset's metadata, not as an Item-level list. + # This only became available in STAC 1.0.0-beta.1, so we'll fail on older collections. + # See https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#item-fields + eo = meta.pop("eo:bands", {}) + if isinstance(eo, list): + eo = eo[0] if len(eo) == 1 else {} + # ^ `eo:bands` should be a list when present, but >1 item means it's probably a multi-band asset, + # which we can't currently handle, so we ignore it. we don't error here, because + # as long as you don't actually _use_ that asset, everything will be fine. we could + # warn, but that would probably just get annoying. + eo_by_asset.append(eo) + try: + meta["polarization"] = meta.pop("sar:polarizations") + except KeyError: + pass + + coords = accumulate_metadata.metadata_to_coords( + flattened_metadata_by_asset, + "band", + # skip_fields={"href"}, + # skip_fields={"href", "title", "description", "type", "roles"}, + ) + if any(eo_by_asset): + coords.update( + accumulate_metadata.metadata_to_coords( + eo_by_asset, + "band", + fields=["common_name", "center_wavelength", "full_width_half_max"], + ) + ) + return coords + + +# TODO +def items_to_property_coords2( + items: ItemSequence, properties: Union[str, Sequence[str], Literal[True]] +) -> Coordinates: + # How to factor out into shared code? + # TODO use `properties` arg + + unnested_props = [unnest_dicts(item["properties"]) for item in items] + all_fields = set().union(*(p.keys() for p in unnested_props)) + + coords_arrs = { + field: descalar_obj_array( + np.array([scalar_sequence(prop.get(field)) for prop in unnested_props]) + ) + for field in all_fields + } + + deduped = {field: deduplicate_axes(arr) for field, arr in coords_arrs.items()} + + return { + field: xr.Variable(["time"], arr).squeeze() for field, arr in deduped.items() + } + + +def items_to_band_coords2( + items: ItemSequence, + asset_ids: List[str], +) -> Coordinates: + + unnested_assets = [ + {k: unnest_dicts(v) for k, v in item["assets"].items() if k in asset_ids} + for item in items + ] + all_fields = sorted( + set().union(*(asset.keys() for ia in unnested_assets for asset in ia.values())) + ) + + # Simplest/most high-level might would be + # asset_arr = [ + # [ + # [ia[aid][f] for f in all_fields] + # for aid in asset_ids + # ] + # for ia in unnested_assets + # ] + # da = xr.DataArray( + # asset_arr, + # coords={ + # "asset": assets_ids, + # "field": asset_fields, + # }, + # dims=["time", "asset", "field"], + # ) + # ds = da.to_dataset("field") + # ds.map(deduplicate) + # return ds.variables + + # Building up arrays like: + # { + # "field 0": np.array([ + # [ # item 0 + # value_for_asset_0, value_for_asset_1, ... + # ], + # [ # item 1 + # value_for_asset_0, value_for_asset_1, ... + # ], + # ... + # ]) + # ... + # } + coords_arrs = { + field: descalar_obj_array( + np.array( + [ + [ + scalar_sequence(assets.get(id, {}).get(field)) + for id in asset_ids + # desequence because if the field contains a list, we want to + # treat that as though it's a scalar value. + ] + for assets in unnested_assets + ] + ) + ) + for field in all_fields + } + + # # Maybe a way to improve locality and not iterate over all items many times. + # # TODO: benchmark + # coords_lists = collections.defaultdict(list) + # for assets in unnested_assets: + # values = collections.defaultdict(list) + # for id in asset_ids: + # asset = assets.get(id, {}) + # for field in all_fields: + # values[field].append(desequence(asset.get(field))) + # for k, v in values.items(): + # coords_lists[k].append(v) + + deduped = {field: deduplicate_axes(arr) for field, arr in coords_arrs.items()} + + return { + field: xr.Variable(["time", "band"], arr).squeeze() + for field, arr in deduped.items() + } + + +def spec_to_attrs(spec: RasterSpec) -> Dict[str, Any]: + attrs = {"spec": spec, "crs": f"epsg:{spec.epsg}", "transform": spec.transform} + + resolutions = spec.resolutions_xy + if resolutions[0] == resolutions[1]: + attrs["resolution"] = resolutions[0] + else: + attrs["resolution_xy"] = resolutions + return attrs diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py new file mode 100644 index 0000000..950e5bb --- /dev/null +++ b/stackstac/coordinates_utils.py @@ -0,0 +1,122 @@ +from __future__ import annotations + +import numpy as np + + +def deduplicate_axes(arr: np.ndarray) -> np.ndarray: + "Flatten dimensions to length 1 where all values are duplicated" + if arr.size <= 1: + return arr + for axis in range(arr.ndim): + if arr.shape[axis] <= 1: + continue + first = arr.take([0], axis=axis) + # ^ note `[0]` instead of `0`: that keeps the dimension + # as length 1 instead of dropping it + allsame = (arr == first).all(axis=axis) + if allsame.all(): + return deduplicate_axes(first) + return arr + + +def unnest_dicts(item, prefix=(), sep="_"): + """ + Flatten nested dicts, prefixing sub-keys with the name of their parent key. + + Example + ------- + >>> unnest_dicts({ + ... "foo": 1, + ... "bar": { + ... "a": 2, + ... "foo": 3, + ... }, + ... }) + { + "foo": 1, + "bar_a": 2, + "bar_foo": 3, + } + """ + if isinstance(item, dict): + result = {} + for k, v in item.items(): + sub_prefix = prefix + (k,) + unnested = unnest_dicts(v, prefix=sub_prefix, sep=sep) + if isinstance(unnested, dict): + result.update(unnested) + else: + result[sep.join(sub_prefix)] = unnested + return result + + if isinstance(item, (list, tuple)) and len(item) == 1: + return unnest_dicts(item[0], prefix=prefix, sep=sep) + + # Note that we don't descend into lists/tuples. For the purposes of STAC metadata, + # there'd be no reason to do this: we're not going to make an xarray coordinate like + # `classification:bitfields_0_name`, `classification:bitfields_0_fill`, ..., + # `classification:bitfields_8_name`, `classification:bitfields_0_fill` + # and unpack a separate coordinate for every field in a sequence. Rather, we rely on + # `scalar_sequence` to preserve anything that's a sequence into a single coordinate. + + return item + + +def scalar_sequence(x): + """ + Convert sequence inputs into NumPy scalars. + + Use this to wrap inputs to `np.array` that you don't want to be treated as + additional axes in the array. + + Example + ------- + >>> s = scalar_sequence([1, 2]) + >>> s + array(list([1, 2]), dtype=object) + >>> s.shape + () + >>> s.item() + [1, 2] + >>> arr = np.array([s]) + >>> arr + >>> arr.shape + (1,) + >>> # for comparision, if we hadn't wrapped it: + >>> np.array([[1, 2]]).shape + >>> (1, 2) + """ + if not isinstance(x, (list, tuple)): + return x + + scalar = np.empty((), dtype=object) # basically a pointer + scalar[()] = x + return scalar + + +def descalar_obj_array(arr: np.ndarray) -> np.ndarray: + """ + In an object array containing NumPy object scalars, unpack the scalars. + + Note that this may mutate the array. + + Example + ------- + >>> s = scalar_sequence([1, 2]) + >>> arr = np.array([s]) + >>> arr[0] + array(list([1, 2]), dtype=object) + >>> # remove the indirection of the NumPy scalar + >>> unpacked = descalar_obj_array(arr) + >>> unpacked[0] + >>> [1, 2] + + """ + if arr.dtype.kind != "O": + return arr + + for idx in np.ndindex(arr.shape): + x = arr[idx] + if isinstance(x, np.ndarray) and x.shape == (): + arr[idx] = x.item() + return arr diff --git a/stackstac/prepare.py b/stackstac/prepare.py index 704fd3e..e6c8bf0 100644 --- a/stackstac/prepare.py +++ b/stackstac/prepare.py @@ -3,29 +3,23 @@ import collections from typing import ( AbstractSet, - Literal, NamedTuple, - Sequence, Optional, Set, Union, Tuple, List, - Dict, - Any, ) import warnings import affine import numpy as np -import pandas as pd -import xarray as xr from .raster_spec import IntFloat, Bbox, Resolutions, RasterSpec from .stac_types import ItemSequence -from . import accumulate_metadata, geom_utils +from . import geom_utils ASSET_TABLE_DT = np.dtype( [("url", object), ("bounds", "float64", 4), ("scale_offset", "float64", 2)] @@ -394,182 +388,3 @@ def prepare_items( items = [item for item, isnan in zip(items, item_isnan) if not isnan] return asset_table, spec, asset_ids, items - - -def to_coords( - items: ItemSequence, - asset_ids: List[str], - spec: RasterSpec, - xy_coords: Literal["center", "topleft", False] = "topleft", - properties: Union[bool, str, Sequence[str]] = True, - band_coords: bool = True, -) -> Tuple[Dict[str, Union[pd.Index, np.ndarray, list]], List[str]]: - - times = pd.to_datetime( - [item["properties"]["datetime"] for item in items], - infer_datetime_format=True, - errors="coerce", - ) - if times.tz is not None: - # xarray can't handle tz-aware DatetimeIndexes, so we convert to UTC and drop the timezone - # https://github.com/pydata/xarray/issues/3291. - # The `tz is None` case is typically a manifestation of https://github.com/pandas-dev/pandas/issues/41047. - # Since all STAC timestamps should be UTC (https://github.com/radiantearth/stac-spec/issues/1095), - # we feel safe assuming that any tz-naive datetimes are already in UTC. - times = times.tz_convert(None) - - dims = ["time", "band", "y", "x"] - coords = { - "time": times, - "id": xr.Variable("time", [item["id"] for item in items]), - "band": asset_ids, - } - - if xy_coords is not False: - if xy_coords == "center": - pixel_center = True - elif xy_coords == "topleft": - pixel_center = False - else: - raise ValueError( - f"xy_coords must be 'center', 'topleft', or False, not {xy_coords!r}" - ) - - transform = spec.transform - # We generate the transform ourselves in `RasterSpec`, and it's always constructed to be rectilinear. - # Someday, this should not always be the case, in order to support non-rectilinear data without warping. - assert ( - transform.is_rectilinear - ), f"Non-rectilinear transform generated: {transform}" - minx, miny, maxx, maxy = spec.bounds - xres, yres = spec.resolutions_xy - - if pixel_center: - half_xpixel, half_ypixel = xres / 2, yres / 2 - minx, miny, maxx, maxy = ( - minx + half_xpixel, - miny - half_ypixel, - maxx + half_xpixel, - maxy - half_ypixel, - ) - - height, width = spec.shape - # Wish pandas had an RangeIndex that supported floats... - # https://github.com/pandas-dev/pandas/issues/46484 - xs = pd.Index(np.linspace(minx, maxx, width, endpoint=False), dtype="float64") - ys = pd.Index(np.linspace(maxy, miny, height, endpoint=False), dtype="float64") - - coords["x"] = xs - coords["y"] = ys - - if properties: - coords.update( - accumulate_metadata.metadata_to_coords( - (item["properties"] for item in items), - "time", - fields=properties, - skip_fields={"datetime"}, - # skip_fields={"datetime", "providers"}, - ) - ) - - # Property-merging code using awkward array. Slightly shorter, not sure if it's faster, - # probably not worth the dependency - - # import awkward as ak - - # awk_props = ak.Array([item._data for item in items]).properties - # for field, props in zip(ak.fields(awk_props), ak.unzip(awk_props)): - # if field == "datetime": - # continue - - # # if all values are the same, collapse to a 0D coordinate - # try: - # if len(ak.run_lengths(props)) == 1: - # props = ak.to_list(props[0]) - # # ^ NOTE: `to_list` because `ak.to_numpy` on string scalars (`ak.CharBehavior`) - # # turns them into an int array of the characters! - # except NotImplementedError: - # # generally because it's an OptionArray (so there's >1 value anyway) - # pass - - # try: - # props = np.squeeze(ak.to_numpy(props)) - # except ValueError: - # continue - - # coords[field] = xr.Variable( - # (("time",) + tuple(f"dim_{i}" for i in range(1, props.ndim))) - # if np.ndim(props) > 0 - # else (), - # props, - # ) - # else: - # # For now don't use awkward when the field names are already known, - # # mostly so users don't have to have it installed. - # if isinstance(properties, str): - # properties = (properties,) - # for prop in properties: # type: ignore (`properties` cannot be True at this point) - # coords[prop] = xr.Variable( - # "time", [item["properties"].get(prop) for item in items] - # ) - - if band_coords: - flattened_metadata_by_asset = [ - accumulate_metadata.accumulate_metadata_only_allsame( - (item["assets"].get(asset_id, {}) for item in items), - skip_fields={"href", "type", "roles"}, - ) - for asset_id in asset_ids - ] - - eo_by_asset = [] - for meta in flattened_metadata_by_asset: - # NOTE: we look for `eo:bands` in each Asset's metadata, not as an Item-level list. - # This only became available in STAC 1.0.0-beta.1, so we'll fail on older collections. - # See https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#item-fields - eo = meta.pop("eo:bands", {}) - if isinstance(eo, list): - eo = eo[0] if len(eo) == 1 else {} - # ^ `eo:bands` should be a list when present, but >1 item means it's probably a multi-band asset, - # which we can't currently handle, so we ignore it. we don't error here, because - # as long as you don't actually _use_ that asset, everything will be fine. we could - # warn, but that would probably just get annoying. - eo_by_asset.append(eo) - try: - meta["polarization"] = meta.pop("sar:polarizations") - except KeyError: - pass - - coords.update( - accumulate_metadata.metadata_to_coords( - flattened_metadata_by_asset, - "band", - skip_fields={"href"}, - # skip_fields={"href", "title", "description", "type", "roles"}, - ) - ) - if any(eo_by_asset): - coords.update( - accumulate_metadata.metadata_to_coords( - eo_by_asset, - "band", - fields=["common_name", "center_wavelength", "full_width_half_max"], - ) - ) - - # Add `epsg` last in case it's also a field in properties; our data model assumes it's a coordinate - coords["epsg"] = spec.epsg - - return coords, dims - - -def to_attrs(spec: RasterSpec) -> Dict[str, Any]: - attrs = {"spec": spec, "crs": f"epsg:{spec.epsg}", "transform": spec.transform} - - resolutions = spec.resolutions_xy - if resolutions[0] == resolutions[1]: - attrs["resolution"] = resolutions[0] - else: - attrs["resolution_xy"] = resolutions - return attrs diff --git a/stackstac/stack.py b/stackstac/stack.py index dc85fd9..0b77de7 100644 --- a/stackstac/stack.py +++ b/stackstac/stack.py @@ -8,7 +8,8 @@ from rasterio import RasterioIOError from rasterio.enums import Resampling -from .prepare import prepare_items, to_attrs, to_coords +from .prepare import prepare_items +from .coordinates import spec_to_attrs, to_coords from .raster_spec import Bbox, IntFloat, Resolutions from .reader_protocol import Reader from .rio_env import LayeredEnv @@ -321,6 +322,6 @@ def stack( properties=properties, band_coords=band_coords, ), - attrs=to_attrs(spec), + attrs=spec_to_attrs(spec), name="stackstac-" + dask.base.tokenize(arr), ) diff --git a/stackstac/tests/items.json b/stackstac/tests/items.json new file mode 100644 index 0000000..5eae714 --- /dev/null +++ b/stackstac/tests/items.json @@ -0,0 +1 @@ +[{"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SR_089113_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:37.761406Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:55:50.758410Z", "platform": "landsat-9", "proj:epsg": 3031, "proj:shape": [8521, 8561], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 100.0, "proj:transform": [30.0, 0.0, 1281585.0, 0.0, -30.0, -768885.0], "view:off_nadir": 0, "landsat:wrs_row": "113", "landsat:scene_id": "LC90891132023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 57.77711452, "landsat:correction": "L2SR", "view:sun_elevation": 14.52884281, "landsat:cloud_cover_land": 100.0, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[117.85828738204097, -74.91546031511366], [123.45165341938181, -75.90706707244007], [126.92671495037585, -74.4169985484992], [121.6271365631418, -73.50930124810642], [117.85828738204097, -74.91546031511366]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SR_089113_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SR_089113_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SR_089113_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/113/LC09_L2SR_089113_20231008_20231009_02_T2/LC09_L2SR_089113_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SR_089113_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SR_089113_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [116.55639833960868, -76.30742313880607, 128.63828549276474, -73.10729686119393], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SR_089107_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:36.587787Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:53:26.785390Z", "platform": "landsat-9", "proj:epsg": 3031, "proj:shape": [8601, 8641], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 0.0, "proj:transform": [30.0, 0.0, 1664685.0, 0.0, -30.0, -1666785.0], "view:off_nadir": 0, "landsat:wrs_row": "107", "landsat:scene_id": "LC90891072023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 47.70012127, "landsat:correction": "L2SR", "view:sun_elevation": 22.33626001, "landsat:cloud_cover_land": 0.0, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[132.09492601977166, -67.38828537970564], [136.26452866906143, -68.07252297748113], [137.87052420898567, -66.44880657248781], [133.9154224447596, -65.80276281624032], [132.09492601977166, -67.38828537970564]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SR_089107_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SR_089107_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SR_089107_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/107/LC09_L2SR_089107_20231008_20231009_02_T2/LC09_L2SR_089107_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SR_089107_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SR_089107_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [130.9047629593056, -68.56214143494856, 139.14424840232138, -65.32599856505145], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SR_089106_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:34.823855Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:53:02.796947Z", "platform": "landsat-9", "proj:epsg": 3031, "proj:shape": [8631, 8661], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 0.23, "proj:transform": [30.0, 0.0, 1726485.0, 0.0, -30.0, -1819485.0], "view:off_nadir": 0, "landsat:wrs_row": "106", "landsat:scene_id": "LC90891062023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 46.81191966, "landsat:correction": "L2SR", "view:sun_elevation": 23.62914765, "landsat:cloud_cover_land": 1.13, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[133.63850690072664, -66.05912692827563], [137.6220400205191, -66.71222230949411], [139.07084690485593, -65.07700698987814], [135.29177754940739, -64.45901490531365], [133.63850690072664, -66.05912692827563]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SR_089106_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SR_089106_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SR_089106_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/106/LC09_L2SR_089106_20231008_20231009_02_T2/LC09_L2SR_089106_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SR_089106_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SR_089106_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [132.4906951027959, -67.20793936961373, 140.28379484020786, -63.97897063038627], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089090_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:33.356968Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:46:39.185182Z", "platform": "landsat-9", "proj:epsg": 32655, "proj:shape": [7971, 7971], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 63.54, "proj:transform": [30.0, 0.0, 518685.0, 0.0, -30.0, -4663485.0], "view:off_nadir": 0, "landsat:wrs_row": "090", "landsat:scene_id": "LC90890902023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 45.92547217, "landsat:correction": "L2SP", "view:sun_elevation": 43.67886871, "landsat:cloud_cover_land": 23.51, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[147.87648207739898, -42.12606566243376], [147.2610936856132, -43.82324967317384], [149.5642251869038, -44.24312981817644], [150.11636971776875, -42.53579080901558], [147.87648207739898, -42.12606566243376]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089090_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089090_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089090_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089090_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/090/LC09_L2SP_089090_20231008_20231009_02_T1/LC09_L2SP_089090_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089090_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089090_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [147.22604221119562, -44.276545017072074, 150.2281913131689, -42.081124982927925], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089089_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:31.813028Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:46:15.226391Z", "platform": "landsat-9", "proj:epsg": 32655, "proj:shape": [7981, 7981], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 30.4, "proj:transform": [30.0, 0.0, 561585.0, 0.0, -30.0, -4505985.0], "view:off_nadir": 0, "landsat:wrs_row": "089", "landsat:scene_id": "LC90890892023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 46.48320638, "landsat:correction": "L2SP", "view:sun_elevation": 44.86704207, "landsat:cloud_cover_land": 19.96, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[148.36891538226746, -40.70287283896582], [147.77825553595605, -42.40317331503521], [150.02734369287217, -42.816690729962744], [150.561106591739, -41.10723177129297], [148.36891538226746, -40.70287283896582]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089089_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089089_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089089_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089089_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/089/LC09_L2SP_089089_20231008_20231009_02_T1/LC09_L2SP_089089_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089089_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089089_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [147.72899660164487, -42.85883504611419, 150.6810573741759, -40.649854953885814], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089088_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:30.887963Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:45:51.259128Z", "platform": "landsat-9", "proj:epsg": 32655, "proj:shape": [7991, 7981], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 81.05, "proj:transform": [30.0, 0.0, 604785.0, 0.0, -30.0, -4348485.0], "view:off_nadir": 0, "landsat:wrs_row": "088", "landsat:scene_id": "LC90890882023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 47.11095038, "landsat:correction": "L2SP", "view:sun_elevation": 46.04379318, "landsat:cloud_cover_land": 79.91, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[148.84573269678998, -39.277315181949184], [148.27478218329708, -40.97987078857434], [150.47488846689168, -41.3881427002278], [150.9920768881778, -39.67685372845644], [148.84573269678998, -39.277315181949184]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089088_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089088_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089088_20231008_20231009_02_T2_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089088_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/088/LC09_L2SP_089088_20231008_20231009_02_T2/LC09_L2SP_089088_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089088_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089088_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [148.21487069070469, -41.438675071398386, 151.1156037020142, -39.217444928601616], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089087_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:29.976600Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:45:27.304572Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7691, 7661], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 85.57, "proj:transform": [30.0, 0.0, 132885.0, 0.0, -30.0, -4195185.0], "view:off_nadir": 0, "landsat:wrs_row": "087", "landsat:scene_id": "LC90890872023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 47.81058463, "landsat:correction": "L2SP", "view:sun_elevation": 47.20690351, "landsat:cloud_cover_land": -1.0, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[149.30679881545137, -37.850820075924894], [148.75404546115507, -39.555712294238624], [150.90801972212364, -39.95884532104302], [151.40988428438646, -38.24572757071645], [149.30679881545137, -37.850820075924894]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089087_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089087_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089087_20231008_20231009_02_T2_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089087_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/087/LC09_L2SP_089087_20231008_20231009_02_T2/LC09_L2SP_089087_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089087_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089087_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [148.7059445916247, -39.97225497389541, 151.4386303862689, -37.83025502610459], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089086_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:28.625505Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:45:03.345781Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7711, 7671], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 69.54, "proj:transform": [30.0, 0.0, 166185.0, 0.0, -30.0, -4034985.0], "view:off_nadir": 0, "landsat:wrs_row": "086", "landsat:scene_id": "LC90890862023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 48.58526764, "landsat:correction": "L2SP", "view:sun_elevation": 48.35605616, "landsat:cloud_cover_land": 38.05, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[149.7549718842705, -36.42248764666776], [149.2181935231899, -38.12959796163799], [151.3286680401952, -38.52791782323826], [151.81669986051384, -36.81285310740075], [149.7549718842705, -36.42248764666776]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089086_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089086_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089086_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089086_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/086/LC09_L2SP_089086_20231008_20231009_02_T1/LC09_L2SP_089086_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089086_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089086_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [149.17332807859512, -38.53920504365022, 151.84291722494592, -36.40207495634978], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089085_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:26.885020Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:44:39.386990Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7721, 7691], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 19.89, "proj:transform": [30.0, 0.0, 199785.0, 0.0, -30.0, -3875085.0], "view:off_nadir": 0, "landsat:wrs_row": "085", "landsat:scene_id": "LC90890852023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 49.43760162, "landsat:correction": "L2SP", "view:sun_elevation": 49.48978503, "landsat:cloud_cover_land": 7.39, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[150.1877173809787, -34.992314083138645], [149.66773723684295, -36.7014846453755], [151.73737439470727, -37.09570426045264], [152.21287012539872, -35.378879282189374], [150.1877173809787, -34.992314083138645]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089085_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089085_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089085_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089085_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/085/LC09_L2SP_089085_20231008_20231009_02_T1/LC09_L2SP_089085_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089085_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089085_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [149.6238413381897, -37.104175105510556, 152.23839427557922, -34.97385489448944], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089084_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:25.167057Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:44:15.428198Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7731, 7691], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 1.36, "proj:transform": [30.0, 0.0, 233985.0, 0.0, -30.0, -3715485.0], "view:off_nadir": 0, "landsat:wrs_row": "084", "landsat:scene_id": "LC90890842023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 50.37150651, "landsat:correction": "L2SP", "view:sun_elevation": 50.60643025, "landsat:cloud_cover_land": 0.23, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[150.60979335263818, -33.56084916124722], [150.10454536041468, -35.272114062531784], [152.13552559154382, -35.66209450074464], [152.59933559046695, -33.94369224286309], [150.60979335263818, -33.56084916124722]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089084_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089084_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089084_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089084_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/084/LC09_L2SP_089084_20231008_20231009_02_T1/LC09_L2SP_089084_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089084_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089084_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [150.06237437919168, -35.66997516065725, 152.61978152469678, -33.54590483934275], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089083_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:23.770461Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:43:51.469408Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7751, 7701], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 0.02, "proj:transform": [30.0, 0.0, 268785.0, 0.0, -30.0, -3555585.0], "view:off_nadir": 0, "landsat:wrs_row": "083", "landsat:scene_id": "LC90890832023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 51.39004439, "landsat:correction": "L2SP", "view:sun_elevation": 51.70468283, "landsat:cloud_cover_land": 0.04, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[151.01992233206138, -32.12795006883272], [150.52778650659945, -33.84108125867678], [152.52373244135796, -34.227240786546524], [152.97727065299955, -32.50744834654253], [151.01992233206138, -32.12795006883272]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089083_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089083_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089083_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089083_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/083/LC09_L2SP_089083_20231008_20231009_02_T1/LC09_L2SP_089083_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089083_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089083_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [150.49041722081395, -34.23411521006458, 152.99803895074646, -32.11295478993542], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089082_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:22.253919Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:43:27.519088Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7761, 7701], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 2.83, "proj:transform": [30.0, 0.0, 303885.0, 0.0, -30.0, -3395985.0], "view:off_nadir": 0, "landsat:wrs_row": "082", "landsat:scene_id": "LC90890822023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 52.49761005, "landsat:correction": "L2SP", "view:sun_elevation": 52.78219117, "landsat:cloud_cover_land": 3.63, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[151.4212480592221, -30.69437179396642], [150.94013259688333, -32.408878109362824], [152.90286680192156, -32.79211182248074], [153.34681862031394, -31.070844444956563], [151.4212480592221, -30.69437179396642]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089082_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089082_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089082_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089082_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/082/LC09_L2SP_089082_20231008_20231009_02_T1/LC09_L2SP_089082_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089082_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089082_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [150.90600987517442, -32.796735254310846, 153.37289655303957, -30.68052474568915], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089081_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:20.949945Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:43:03.568769Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7761, 7711], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 9.33, "proj:transform": [30.0, 0.0, 339285.0, 0.0, -30.0, -3236685.0], "view:off_nadir": 0, "landsat:wrs_row": "081", "landsat:scene_id": "LC90890812023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 53.69853117, "landsat:correction": "L2SP", "view:sun_elevation": 53.83763785, "landsat:cloud_cover_land": 10.99, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[151.81210644847218, -29.25944246129185], [151.3434437471939, -30.97596069212953], [153.27405044990513, -31.355510945138548], [153.7090253243089, -29.63295583133579], [151.81210644847218, -29.25944246129185]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089081_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089081_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089081_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089081_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/081/LC09_L2SP_089081_20231008_20231009_02_T1/LC09_L2SP_089081_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089081_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089081_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [151.31045235289008, -31.357985294112588, 153.7424643214463, -29.248804705887412], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089080_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:19.648555Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:42:39.618449Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7781, 7711], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 20.65, "proj:transform": [30.0, 0.0, 374985.0, 0.0, -30.0, -3077085.0], "view:off_nadir": 0, "landsat:wrs_row": "080", "landsat:scene_id": "LC90890802023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 54.99790618, "landsat:correction": "L2SP", "view:sun_elevation": 54.86874217, "landsat:cloud_cover_land": 22.38, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[152.19362936457983, -27.823078809177193], [151.73606867996003, -29.54138561380626], [153.63769221765688, -29.918135375916304], [154.06455676981582, -28.194210463181665], [152.19362936457983, -27.823078809177193]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089080_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089080_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089080_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089080_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/080/LC09_L2SP_089080_20231008_20231009_02_T1/LC09_L2SP_089080_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089080_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089080_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [151.70491465955132, -29.92076533009785, 154.10139223910429, -27.812564669902148], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089079_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:18.312068Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:42:15.672367Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7781, 7721], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 25.31, "proj:transform": [30.0, 0.0, 410985.0, 0.0, -30.0, -2917785.0], "view:off_nadir": 0, "landsat:wrs_row": "079", "landsat:scene_id": "LC90890792023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 56.40049187, "landsat:correction": "L2SP", "view:sun_elevation": 55.87305133, "landsat:cloud_cover_land": 27.37, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[152.56806547069152, -26.386007059767337], [152.11945029557995, -28.105884831550735], [153.9947799524794, -28.480140683563068], [154.41433318127056, -26.754763344837123], [152.56806547069152, -26.386007059767337]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089079_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089079_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089079_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089079_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/079/LC09_L2SP_089079_20231008_20231009_02_T1/LC09_L2SP_089079_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089079_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089079_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [152.09058681276252, -28.48452536279421, 154.45689030618703, -26.37302463720579], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SP_089078_20231008_02_T1", "properties": {"gsd": 30, "created": "2023-10-10T09:16:17.115048Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:41:51.722047Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7791, 7721], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 59.97, "proj:transform": [30.0, 0.0, 447285.0, 0.0, -30.0, -2758485.0], "view:off_nadir": 0, "landsat:wrs_row": "078", "landsat:scene_id": "LC90890782023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 57.91154082, "landsat:correction": "L2SP", "view:sun_elevation": 56.84856004, "landsat:cloud_cover_land": 63.71, "landsat:collection_number": "02", "landsat:collection_category": "T1"}, "geometry": {"type": "Polygon", "coordinates": [[[152.93457318759982, -24.94758030208811], [152.4952512274229, -26.668827514856304], [154.34531550596262, -27.040605890345457], [154.7583162891317, -25.314237069607266], [152.93457318759982, -24.94758030208811]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SP_089078_20231008_02_T1", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SP_089078_20231008_20231009_02_T1_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-st/items/LC09_L2SP_089078_20231008_20231009_02_T1_ST", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SP_089078_20231008_02_T1", "type": "text/html", "title": "Map of item"}], "assets": {"qa": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_QA.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Quality Assessment Band", "description": "Collection 2 Level-2 Quality Assessment Band (ST_QA) Surface Temperature Product", "raster:bands": [{"unit": "kelvin", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "drad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_DRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Downwelled Radiance Band", "description": "Collection 2 Level-2 Downwelled Radiance Band (ST_DRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emis": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_EMIS.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Band", "description": "Collection 2 Level-2 Emissivity Band (ST_EMIS) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "emsd": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_EMSD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Emissivity Standard Deviation Band", "description": "Collection 2 Level-2 Emissivity Standard Deviation Band (ST_EMSD) Surface Temperature Product", "raster:bands": [{"unit": "emissivity coefficient", "scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "trad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_TRAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Thermal Radiance Band", "description": "Collection 2 Level-2 Thermal Radiance Band (ST_TRAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "urad": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_URAD.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Upwelled Radiance Band", "description": "Collection 2 Level-2 Upwelled Radiance Band (ST_URAD) Surface Temperature Product", "raster:bands": [{"unit": "watt/steradian/square_meter/micrometer", "scale": 0.001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "atran": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_ATRAN.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Atmospheric Transmittance Band", "description": "Collection 2 Level-2 Atmospheric Transmittance Band (ST_ATRAN) Surface Temperature Product", "raster:bands": [{"scale": 0.0001, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "cdist": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_CDIST.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Cloud Distance Band", "description": "Collection 2 Level-2 Cloud Distance Band (ST_CDIST) Surface Temperature Product", "raster:bands": [{"unit": "kilometer", "scale": 0.01, "nodata": -9999, "data_type": "int16", "spatial_resolution": 30}], "roles": ["data"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "lwir11": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_ST_B10.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Surface Temperature Band", "description": "Collection 2 Level-2 Thermal Infrared Band (ST_B10) Surface Temperature", "gsd": 100, "eo:bands": [{"name": "TIRS_B10", "common_name": "lwir11", "description": "Long-wave infrared", "center_wavelength": 10.9, "full_width_half_max": 0.59}], "raster:bands": [{"unit": "kelvin", "scale": 0.00341802, "nodata": 0, "offset": 149.0, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "temperature"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/078/LC09_L2SP_089078_20231008_20231009_02_T1/LC09_L2SP_089078_20231008_20231009_02_T1_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SP_089078_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SP_089078_20231008_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [152.46844881245445, -27.051175392615118, 154.80376851169237, -24.93110460738488], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SR_089076_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:15.546041Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:41:03.834116Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7801, 7721], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 45.85, "proj:transform": [30.0, 0.0, 520485.0, 0.0, -30.0, -2439885.0], "view:off_nadir": 0, "landsat:wrs_row": "076", "landsat:scene_id": "LC90890762023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 61.2785957, "landsat:correction": "L2SR", "view:sun_elevation": 58.70032192, "landsat:cloud_cover_land": -1.0, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[153.64925281615012, -22.068982633780895], [153.2246411753464, -23.79261913907137], [155.03028641208957, -24.16025105979156], [155.43136962993344, -22.431669934527164], [153.64925281615012, -22.068982633780895]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SR_089076_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SR_089076_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SR_089076_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/076/LC09_L2SR_089076_20231008_20231009_02_T2/LC09_L2SR_089076_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SR_089076_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SR_089076_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [153.19854239585393, -24.17769544520539, 155.48124531304242, -22.04553455479461], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SR_089075_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:13.999159Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:40:39.888033Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7811, 7721], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 51.75, "proj:transform": [30.0, 0.0, 557385.0, 0.0, -30.0, -2280585.0], "view:off_nadir": 0, "landsat:wrs_row": "075", "landsat:scene_id": "LC90890752023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 63.14501413, "landsat:correction": "L2SR", "view:sun_elevation": 59.57075158, "landsat:cloud_cover_land": 64.91, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[153.99766698415704, -20.62807121637969], [153.57976073291172, -22.352730641031684], [155.36517607996805, -22.718675129954796], [155.76141947663893, -20.98913842722947], [153.99766698415704, -20.62807121637969]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SR_089075_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SR_089075_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SR_089075_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/075/LC09_L2SR_089075_20231008_20231009_02_T2/LC09_L2SR_089075_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SR_089075_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SR_089075_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [153.5507839890535, -22.74061546854795, 155.81352389780616, -20.602204531452053], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SR_089074_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:13.037324Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:40:15.946185Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7811, 7721], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 42.59, "proj:transform": [30.0, 0.0, 594285.0, 0.0, -30.0, -2121285.0], "view:off_nadir": 0, "landsat:wrs_row": "074", "landsat:scene_id": "LC90890742023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 65.13836297, "landsat:correction": "L2SR", "view:sun_elevation": 60.39960603, "landsat:cloud_cover_land": 90.48, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[154.34131328673675, -19.186761631411716], [153.9294404565144, -20.912512034433043], [155.69625592639946, -21.277004553030924], [156.08796013840737, -19.546166929221243], [154.34131328673675, -19.186761631411716]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SR_089074_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SR_089074_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SR_089074_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/074/LC09_L2SR_089074_20231008_20231009_02_T2/LC09_L2SR_089074_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SR_089074_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SR_089074_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [153.89677546134985, -21.299935490269522, 156.14052259872196, -19.15873450973048], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}, {"type": "Feature", "stac_version": "1.0.0", "id": "LC09_L2SR_089073_20231008_02_T2", "properties": {"gsd": 30, "created": "2023-10-10T09:16:12.107143Z", "sci:doi": "10.5066/P9OGBGM6", "datetime": "2023-10-08T23:39:52.008574Z", "platform": "landsat-9", "proj:epsg": 32656, "proj:shape": [7821, 7721], "description": "Landsat Collection 2 Level-2", "instruments": ["oli", "tirs"], "eo:cloud_cover": 44.51, "proj:transform": [30.0, 0.0, 631185.0, 0.0, -30.0, -1961985.0], "view:off_nadir": 0, "landsat:wrs_row": "073", "landsat:scene_id": "LC90890732023281LGN00", "landsat:wrs_path": "089", "landsat:wrs_type": "2", "view:sun_azimuth": 67.26210267, "landsat:correction": "L2SR", "view:sun_elevation": 61.18316502, "landsat:cloud_cover_land": -1.0, "landsat:collection_number": "02", "landsat:collection_category": "T2"}, "geometry": {"type": "Polygon", "coordinates": [[[154.67953507918756, -17.744689716603126], [154.27362368322568, -19.47186565565001], [156.02310070869976, -19.8346013637545], [156.41084742828352, -18.10265545071854], [154.67953507918756, -17.744689716603126]]]}, "links": [{"rel": "collection", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "parent", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2", "type": "application/json"}, {"rel": "root", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/", "type": "application/json", "title": "Microsoft Planetary Computer STAC API"}, {"rel": "self", "href": "https://planetarycomputer.microsoft.com/api/stac/v1/collections/landsat-c2-l2/items/LC09_L2SR_089073_20231008_02_T2", "type": "application/geo+json"}, {"rel": "cite-as", "href": "https://doi.org/10.5066/P9OGBGM6", "title": "Landsat 8-9 OLI/TIRS Collection 2 Level-2"}, {"rel": "via", "href": "https://landsatlook.usgs.gov/stac-server/collections/landsat-c2l2-sr/items/LC09_L2SR_089073_20231008_20231009_02_T2_SR", "type": "application/json", "title": "USGS STAC Item"}, {"rel": "preview", "href": "https://planetarycomputer.microsoft.com/api/data/v1/item/map?collection=landsat-c2-l2&item=LC09_L2SR_089073_20231008_02_T2", "type": "text/html", "title": "Map of item"}], "assets": {"ang": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_ANG.txt", "type": "text/plain", "title": "Angle Coefficients File", "description": "Collection 2 Level-1 Angle Coefficients File", "roles": ["metadata"]}, "red": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Red Band", "description": "Collection 2 Level-2 Red Band (SR_B4) Surface Reflectance", "eo:bands": [{"name": "OLI_B4", "center_wavelength": 0.65, "full_width_half_max": 0.04, "common_name": "red", "description": "Visible red"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "blue": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_B2.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Blue Band", "description": "Collection 2 Level-2 Blue Band (SR_B2) Surface Reflectance", "eo:bands": [{"name": "OLI_B2", "center_wavelength": 0.48, "full_width_half_max": 0.06, "common_name": "blue", "description": "Visible blue"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "green": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_B3.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Green Band", "description": "Collection 2 Level-2 Green Band (SR_B3) Surface Reflectance", "eo:bands": [{"name": "OLI_B3", "full_width_half_max": 0.06, "common_name": "green", "description": "Visible green", "center_wavelength": 0.56}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "nir08": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Near Infrared Band 0.8", "description": "Collection 2 Level-2 Near Infrared Band 0.8 (SR_B5) Surface Reflectance", "eo:bands": [{"name": "OLI_B5", "center_wavelength": 0.87, "full_width_half_max": 0.03, "common_name": "nir08", "description": "Near infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir16": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_B6.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 1.6", "description": "Collection 2 Level-2 Short-wave Infrared Band 1.6 (SR_B6) Surface Reflectance", "eo:bands": [{"name": "OLI_B6", "center_wavelength": 1.61, "full_width_half_max": 0.09, "common_name": "swir16", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "swir22": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_B7.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Short-wave Infrared Band 2.2", "description": "Collection 2 Level-2 Short-wave Infrared Band 2.2 (SR_B7) Surface Reflectance", "eo:bands": [{"name": "OLI_B7", "center_wavelength": 2.2, "full_width_half_max": 0.19, "common_name": "swir22", "description": "Short-wave infrared"}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "coastal": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_B1.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Coastal/Aerosol Band", "description": "Collection 2 Level-2 Coastal/Aerosol Band (SR_B1) Surface Reflectance", "eo:bands": [{"name": "OLI_B1", "common_name": "coastal", "description": "Coastal/Aerosol", "center_wavelength": 0.44, "full_width_half_max": 0.02}], "raster:bands": [{"scale": 2.75e-05, "nodata": 0, "offset": -0.2, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["data", "reflectance"]}, "mtl.txt": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_MTL.txt", "type": "text/plain", "title": "Product Metadata File (txt)", "description": "Collection 2 Level-2 Product Metadata File (txt)", "roles": ["metadata"]}, "mtl.xml": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_MTL.xml", "type": "application/xml", "title": "Product Metadata File (xml)", "description": "Collection 2 Level-2 Product Metadata File (xml)", "roles": ["metadata"]}, "mtl.json": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_MTL.json", "type": "application/json", "title": "Product Metadata File (json)", "description": "Collection 2 Level-2 Product Metadata File (json)", "roles": ["metadata"]}, "qa_pixel": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Pixel Quality Assessment Band", "description": "Collection 2 Level-1 Pixel Quality Assessment Band (QA_PIXEL)", "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Image data"}, {"name": "fill", "value": 1, "description": "Fill data"}], "description": "Image or fill data"}, {"name": "dilated_cloud", "length": 1, "offset": 1, "classes": [{"name": "not_dilated", "value": 0, "description": "Cloud is not dilated or no cloud"}, {"name": "dilated", "value": 1, "description": "Cloud dilation"}], "description": "Dilated cloud"}, {"name": "cirrus", "length": 1, "offset": 2, "classes": [{"name": "not_cirrus", "value": 0, "description": "Cirrus confidence is not high"}, {"name": "cirrus", "value": 1, "description": "High confidence cirrus"}], "description": "Cirrus mask"}, {"name": "cloud", "length": 1, "offset": 3, "classes": [{"name": "not_cloud", "value": 0, "description": "Cloud confidence is not high"}, {"name": "cloud", "value": 1, "description": "High confidence cloud"}], "description": "Cloud mask"}, {"name": "cloud_shadow", "length": 1, "offset": 4, "classes": [{"name": "not_shadow", "value": 0, "description": "Cloud shadow confidence is not high"}, {"name": "shadow", "value": 1, "description": "High confidence cloud shadow"}], "description": "Cloud shadow mask"}, {"name": "snow", "length": 1, "offset": 5, "classes": [{"name": "not_snow", "value": 0, "description": "Snow/Ice confidence is not high"}, {"name": "snow", "value": 1, "description": "High confidence snow cover"}], "description": "Snow/Ice mask"}, {"name": "clear", "length": 1, "offset": 6, "classes": [{"name": "not_clear", "value": 0, "description": "Cloud or dilated cloud bits are set"}, {"name": "clear", "value": 1, "description": "Cloud and dilated cloud bits are not set"}], "description": "Clear mask"}, {"name": "water", "length": 1, "offset": 7, "classes": [{"name": "not_water", "value": 0, "description": "Land or cloud"}, {"name": "water", "value": 1, "description": "Water"}], "description": "Water mask"}, {"name": "cloud_confidence", "length": 2, "offset": 8, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud"}, {"name": "medium", "value": 2, "description": "Medium confidence cloud"}, {"name": "high", "value": 3, "description": "High confidence cloud"}], "description": "Cloud confidence levels"}, {"name": "cloud_shadow_confidence", "length": 2, "offset": 10, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cloud shadow"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cloud shadow"}], "description": "Cloud shadow confidence levels"}, {"name": "snow_confidence", "length": 2, "offset": 12, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence snow/ice"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence snow/ice"}], "description": "Snow/Ice confidence levels"}, {"name": "cirrus_confidence", "length": 2, "offset": 14, "classes": [{"name": "not_set", "value": 0, "description": "No confidence level set"}, {"name": "low", "value": 1, "description": "Low confidence cirrus"}, {"name": "reserved", "value": 2, "description": "Reserved - value not used"}, {"name": "high", "value": 3, "description": "High confidence cirrus"}], "description": "Cirrus confidence levels"}], "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint16", "spatial_resolution": 30}], "roles": ["cloud", "cloud-shadow", "snow-ice", "water-mask"]}, "qa_radsat": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_QA_RADSAT.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", "description": "Collection 2 Level-1 Radiometric Saturation and Terrain Occlusion Quality Assessment Band (QA_RADSAT)", "classification:bitfields": [{"name": "band1", "length": 1, "offset": 0, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 1 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 1 saturated"}], "description": "Band 1 radiometric saturation"}, {"name": "band2", "length": 1, "offset": 1, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 2 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 2 saturated"}], "description": "Band 2 radiometric saturation"}, {"name": "band3", "length": 1, "offset": 2, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 3 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 3 saturated"}], "description": "Band 3 radiometric saturation"}, {"name": "band4", "length": 1, "offset": 3, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 4 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 4 saturated"}], "description": "Band 4 radiometric saturation"}, {"name": "band5", "length": 1, "offset": 4, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 5 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 5 saturated"}], "description": "Band 5 radiometric saturation"}, {"name": "band6", "length": 1, "offset": 5, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 6 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 6 saturated"}], "description": "Band 6 radiometric saturation"}, {"name": "band7", "length": 1, "offset": 6, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 7 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 7 saturated"}], "description": "Band 7 radiometric saturation"}, {"name": "band9", "length": 1, "offset": 8, "classes": [{"name": "not_saturated", "value": 0, "description": "Band 9 not saturated"}, {"name": "saturated", "value": 1, "description": "Band 9 saturated"}], "description": "Band 9 radiometric saturation"}, {"name": "occlusion", "length": 1, "offset": 11, "classes": [{"name": "not_occluded", "value": 0, "description": "Terrain is not occluded"}, {"name": "occluded", "value": 1, "description": "Terrain is occluded"}], "description": "Terrain not visible from sensor due to intervening terrain"}], "raster:bands": [{"unit": "bit index", "data_type": "uint16", "spatial_resolution": 30}], "roles": ["saturation"]}, "qa_aerosol": {"href": "https://landsateuwest.blob.core.windows.net/landsat-c2/level-2/standard/oli-tirs/2023/089/073/LC09_L2SR_089073_20231008_20231009_02_T2/LC09_L2SR_089073_20231008_20231009_02_T2_SR_QA_AEROSOL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "title": "Aerosol Quality Assessment Band", "description": "Collection 2 Level-2 Aerosol Quality Assessment Band (SR_QA_AEROSOL) Surface Reflectance Product", "raster:bands": [{"unit": "bit index", "nodata": 1, "data_type": "uint8", "spatial_resolution": 30}], "classification:bitfields": [{"name": "fill", "length": 1, "offset": 0, "classes": [{"name": "not_fill", "value": 0, "description": "Pixel is not fill"}, {"name": "fill", "value": 1, "description": "Pixel is fill"}], "description": "Image or fill data"}, {"name": "retrieval", "length": 1, "offset": 1, "classes": [{"name": "not_valid", "value": 0, "description": "Pixel retrieval is not valid"}, {"name": "valid", "value": 1, "description": "Pixel retrieval is valid"}], "description": "Valid aerosol retrieval"}, {"name": "water", "length": 1, "offset": 2, "classes": [{"name": "not_water", "value": 0, "description": "Pixel is not water"}, {"name": "water", "value": 1, "description": "Pixel is water"}], "description": "Water mask"}, {"name": "interpolated", "length": 1, "offset": 5, "classes": [{"name": "not_interpolated", "value": 0, "description": "Pixel is not interpolated aerosol"}, {"name": "interpolated", "value": 1, "description": "Pixel is interpolated aerosol"}], "description": "Aerosol interpolation"}, {"name": "level", "length": 2, "offset": 6, "classes": [{"name": "climatology", "value": 0, "description": "No aerosol correction applied"}, {"name": "low", "value": 1, "description": "Low aerosol level"}, {"name": "medium", "value": 2, "description": "Medium aerosol level"}, {"name": "high", "value": 3, "description": "High aerosol level"}], "description": "Aerosol level"}], "roles": ["data-mask", "water-mask"]}, "tilejson": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/tilejson.json?collection=landsat-c2-l2&item=LC09_L2SR_089073_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "application/json", "title": "TileJSON with default rendering", "roles": ["tiles"]}, "rendered_preview": {"href": "https://planetarycomputer.microsoft.com/api/data/v1/item/preview.png?collection=landsat-c2-l2&item=LC09_L2SR_089073_20231008_02_T2&assets=red&assets=green&assets=blue&color_formula=gamma+RGB+2.7%2C+saturation+1.5%2C+sigmoidal+RGB+15+0.55&format=png", "type": "image/png", "title": "Rendered preview", "rel": "preview", "roles": ["overview"]}}, "bbox": [154.23732681235387, -19.861255510506375, 156.4631214114148, -17.715294489493626], "stac_extensions": ["https://stac-extensions.github.io/raster/v1.1.0/schema.json", "https://stac-extensions.github.io/eo/v1.0.0/schema.json", "https://stac-extensions.github.io/view/v1.0.0/schema.json", "https://stac-extensions.github.io/projection/v1.1.0/schema.json", "https://landsat.usgs.gov/stac/landsat-extension/v1.1.1/schema.json", "https://stac-extensions.github.io/classification/v1.0.0/schema.json", "https://stac-extensions.github.io/scientific/v1.0.0/schema.json"], "collection": "landsat-c2-l2"}] \ No newline at end of file diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py new file mode 100644 index 0000000..04e84f8 --- /dev/null +++ b/stackstac/tests/test_coordinates.py @@ -0,0 +1,22 @@ +import json + +import pytest + +from stackstac.coordinates import ( + items_to_band_coords, + items_to_band_coords2, +) + + +@pytest.fixture +def stac_json(): + with open("stackstac/tests/items.json") as f: + return json.load(f) + + +def test_band_coords(stac_json): + ids = ["red", "green", "qa_pixel", "qa_radsat"] + coords = items_to_band_coords(stac_json, ids) + c2 = items_to_band_coords2(stac_json, ids) + print(coords) + print(c2) diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py new file mode 100644 index 0000000..cd5b17f --- /dev/null +++ b/stackstac/tests/test_coordinates_utils.py @@ -0,0 +1,95 @@ +from string import printable +import pytest + +import numpy as np +from hypothesis import given +import hypothesis.strategies as st + +from stackstac.coordinates_utils import ( + descalar_obj_array, + deduplicate_axes, + scalar_sequence, + unnest_dicts, +) + + +def test_deduplicate_axes(): + a1 = np.arange(5) + d = deduplicate_axes(a1) + np.testing.assert_equal(d, a1) + + a1_d0 = np.repeat(1, 5) + d = deduplicate_axes(a1_d0) + assert d.shape == (1,) + np.testing.assert_equal(d, [1]) + + a2 = np.arange(3 * 4).reshape(3, 4) + d = deduplicate_axes(a2) + np.testing.assert_equal(d, a2) + + a2_d0 = np.stack([np.arange(4)] * 3) + d = deduplicate_axes(a2_d0) + assert d.shape == (1, a2_d0.shape[1]) + np.testing.assert_equal(d, a2_d0[[0]]) + + a2_d1 = a2_d0.T + d = deduplicate_axes(a2_d1) + assert d.shape == (a2_d1.shape[0], 1) + np.testing.assert_equal(d, a2_d1[:, [0]]) + + a2_d01 = np.broadcast_to(1, (3, 4)) + d = deduplicate_axes(a2_d01) + assert d.shape == (1, 1) + np.testing.assert_equal(d, np.broadcast_to(1, (1, 1))) + + +@pytest.mark.parametrize( + "input, expected", + [ + # Unchanged, no nesting + ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), + # Single level nesting + ({"a": 1, "b": {"a": "foo"}}, {"a": 1, "b_a": "foo"}), + # Single level nesting, multiple subkeys + ({"a": 1, "b": {"a": "foo", "b": "bar"}}, {"a": 1, "b_a": "foo", "b_b": "bar"}), + ( + # Double level nesting + {"a": 1, "b": {"a": "foo", "b": {"x": 0}}}, + {"a": 1, "b_a": "foo", "b_b_x": 0}, + ), + ( + # Sequences are _not_ traversed + [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], + [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], + ), + # Basics are unchanged + ("abc", "abc"), + (1, 1), + (None, None), + ([1, 2, "foo", True], [1, 2, "foo", True]), + ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), + ], +) +def test_unnest_dicts(input, expected): + assert unnest_dicts(input) == expected + + +jsons = st.recursive( + st.none() + | st.booleans() + | st.integers() + | st.floats() + | st.datetimes() + | st.text(printable), + lambda children: st.lists(children) | st.dictionaries(st.text(printable), children), +) +# Modified from https://hypothesis.readthedocs.io/en/latest/data.html#recursive-data + + +@given(jsons) +def test_scalar_sequence_roundtrip(x): + wrapped = scalar_sequence(x) + arr = np.array([wrapped]) + assert arr.shape == (1,) + descalared = descalar_obj_array(arr) + assert descalared[0] == x From db6d6cfb0a93e099ea7a0af31c1dab4b0641ea83 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Wed, 25 Oct 2023 15:51:49 -0600 Subject: [PATCH 02/31] driveby: copy-paste error excluding bad assets --- stackstac/prepare.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stackstac/prepare.py b/stackstac/prepare.py index e6c8bf0..ac343e6 100644 --- a/stackstac/prepare.py +++ b/stackstac/prepare.py @@ -151,6 +151,8 @@ def prepare_items( "Multi-band rasters are not currently supported.\n" "If you don't care about this asset, you can skip it by giving a list " "of asset IDs you *do* want in `assets=`, and leaving this one out." + "For example:\n" + f"`assets={[x for x in asset_ids if x != id]!r}`" ) asset_scale = raster_bands[0].get("scale", 1) asset_offset = raster_bands[0].get("offset", 0) From 0ee4c5c472c0475b47b8554ec93c50f6db3e361f Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Wed, 25 Oct 2023 15:52:24 -0600 Subject: [PATCH 03/31] eo:bands is actually a list types are so messed up, idk what to do with this, or if it matters --- stackstac/stac_types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stackstac/stac_types.py b/stackstac/stac_types.py index 738c4c5..a1f9636 100644 --- a/stackstac/stac_types.py +++ b/stackstac/stac_types.py @@ -91,7 +91,7 @@ class EOBand(TypedDict, total=False): Tuple[int, int, int, int, int, int], Tuple[int, int, int, int, int, int, int, int, int], ], - "eo:bands": EOBand, + "eo:bands": List[EOBand], "sar:polarizations": List[str], }, total=False, From f6de475a7ed36f127ee4883eb7e7f04164aaa60b Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Wed, 25 Oct 2023 15:53:41 -0600 Subject: [PATCH 04/31] multiple working nd coords methods, but 10x slower --- pdm.lock | 25 +++- pyproject.toml | 1 + stackstac/coordinates.py | 130 +++++++++++++----- stackstac/coordinates_utils.py | 38 ++++- .../{items.json => items-landsat-c2-l2.json} | 0 stackstac/tests/test_coordinates.py | 125 ++++++++++++++++- stackstac/tests/test_coordinates_utils.py | 48 ++++++- 7 files changed, 318 insertions(+), 49 deletions(-) rename stackstac/tests/{items.json => items-landsat-c2-l2.json} (100%) diff --git a/pdm.lock b/pdm.lock index 29b2f6c..3b95373 100644 --- a/pdm.lock +++ b/pdm.lock @@ -6,7 +6,7 @@ groups = ["default", "style", "util", "docs-examples", "test", "viz", "docs"] cross_platform = true static_urls = false lock_version = "4.3" -content_hash = "sha256:661044947a135c2fd35f044894672183f425c2c57b03ca9c93abece419035faf" +content_hash = "sha256:0e38487854e1451fdecd5f46000ad0cc1d3e002b71cdba92ef9770a9a69beb53" [[package]] name = "affine" @@ -2375,6 +2375,15 @@ files = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +summary = "Get CPU info with pure Python" +files = [ + {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, + {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, +] + [[package]] name = "py-spy" version = "0.3.14" @@ -2652,6 +2661,20 @@ files = [ {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] +[[package]] +name = "pytest-benchmark" +version = "4.0.0" +requires_python = ">=3.7" +summary = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." +dependencies = [ + "py-cpuinfo", + "pytest>=3.8", +] +files = [ + {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, + {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, +] + [[package]] name = "python-dateutil" version = "2.8.2" diff --git a/pyproject.toml b/pyproject.toml index c1e772c..400240e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,7 @@ style = [ test = [ "hypothesis<7.0.0,>=6.35.0", "pytest<7.0.0,>=6.2.5", + "pytest-benchmark>=4.0.0", ] util = [ "py-spy", diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index 5c498c0..b1c89a0 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -1,16 +1,6 @@ from __future__ import annotations -from typing import ( - Literal, - Mapping, - Sequence, - Union, - Tuple, - List, - Dict, - Any, -) - +from typing import Any, Dict, List, Literal, Mapping, Sequence, Tuple, Union import numpy as np import pandas as pd @@ -21,18 +11,28 @@ descalar_obj_array, scalar_sequence, unnest_dicts, + unpack_per_band_asset_fields, ) +from . import accumulate_metadata from .raster_spec import RasterSpec - from .stac_types import ItemSequence -from . import accumulate_metadata ASSET_TABLE_DT = np.dtype( [("url", object), ("bounds", "float64", 4), ("scale_offset", "float64", 2)] ) Coordinates = Mapping[str, Union[pd.Index, np.ndarray, xr.Variable, list]] +# Asset fields which are a list with one item per band in the asset. +# For one-band assets, they should be a list of length 1. +# We'll unpack those 1-length lists, so the subfields can be flattened into +# top-level coordinates. +# This is how we get `eo:bands_common_name` or `raster:bands_scale` coordinates. +PER_BAND_ASSET_FIELDS = { + "eo:bands", + "raster:bands", +} + def to_coords( items: ItemSequence, @@ -201,33 +201,17 @@ def items_to_band_coords2( ) -> Coordinates: unnested_assets = [ - {k: unnest_dicts(v) for k, v in item["assets"].items() if k in asset_ids} + { + k: unnest_dicts(unpack_per_band_asset_fields(v, PER_BAND_ASSET_FIELDS)) + for k, v in item["assets"].items() + if k in asset_ids + } for item in items ] all_fields = sorted( set().union(*(asset.keys() for ia in unnested_assets for asset in ia.values())) ) - # Simplest/most high-level might would be - # asset_arr = [ - # [ - # [ia[aid][f] for f in all_fields] - # for aid in asset_ids - # ] - # for ia in unnested_assets - # ] - # da = xr.DataArray( - # asset_arr, - # coords={ - # "asset": assets_ids, - # "field": asset_fields, - # }, - # dims=["time", "asset", "field"], - # ) - # ds = da.to_dataset("field") - # ds.map(deduplicate) - # return ds.variables - # Building up arrays like: # { # "field 0": np.array([ @@ -278,6 +262,84 @@ def items_to_band_coords2( } +def items_to_band_coords_simple( + items: ItemSequence, + asset_ids: List[str], +) -> Coordinates: + # Interestingly this is slightly faster in benchmarking than `items_to_band_coords2` + unnested_assets = [ + { + k: unnest_dicts(unpack_per_band_asset_fields(v, PER_BAND_ASSET_FIELDS)) + for k, v in item["assets"].items() + if k in asset_ids + } + for item in items + ] + all_fields = sorted( + set().union(*(asset.keys() for ia in unnested_assets for asset in ia.values())) + ) + + asset_arr = [ + [[ia.get(aid, {}).get(f) for f in all_fields] for aid in asset_ids] + for ia in unnested_assets + ] + da = xr.DataArray( + asset_arr, + coords={ + "band": asset_ids, + "field": all_fields, + }, + dims=["time", "band", "field"], + ) + ds = da.to_dataset("field") + ds = ds.map( + # TODO better way? + lambda da: xr.DataArray(deduplicate_axes(da.data), dims=da.dims).squeeze() + ) + return ds.variables + + +# def items_to_band_locality( +# items: ItemSequence, +# asset_ids: List[str], +# ) -> Coordinates: +# # Maybe a way to improve locality and not iterate over all items many times. +# # TODO: benchmark +# # {field: [ +# # [v_asset_0, v_asset_1, ...], # item 0 +# # [v_asset_0, v_asset_1, ...], # item 1 +# # ]} +# coords_lists = {} +# for ii, item in enumerate(items): +# # {field: [v_asset_0, v_asset_1, ...]} for just this item. +# field_values = {} +# for ai, id in enumerate(asset_ids): +# asset = item.get(id, {}) +# for field, value in asset.items(): +# if not (values := field_values.get(field)): +# field_values[field] = values = [None] * ai + +# # TODO: un-nest `value` if a dict +# values.append(scalar_sequence(value)) + +# for missing_field in field_values.keys() - asset.keys(): +# field_values[missing_field].append(None) + +# # At the end of each asset, all field values should be the same length +# lens = {k: len(vs) for k, vs, in field_values.items()} +# assert len(set(lens.values())) == 1, lens + +# # TODO got to here +# for field, values in field_values.items(): +# if not (all_values := coords_lists.get(field)): +# coords_lists[field] = values = [None] * ai + +# coords_lists[k].append(v) + +# for missing_field in coords_lists.keys() - asset.keys(): +# field_values[missing_field].append(None) + + def spec_to_attrs(spec: RasterSpec) -> Dict[str, Any]: attrs = {"spec": spec, "crs": f"epsg:{spec.epsg}", "transform": spec.transform} diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 950e5bb..d168500 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -1,5 +1,7 @@ from __future__ import annotations +from typing import Iterable + import numpy as np @@ -49,9 +51,6 @@ def unnest_dicts(item, prefix=(), sep="_"): result[sep.join(sub_prefix)] = unnested return result - if isinstance(item, (list, tuple)) and len(item) == 1: - return unnest_dicts(item[0], prefix=prefix, sep=sep) - # Note that we don't descend into lists/tuples. For the purposes of STAC metadata, # there'd be no reason to do this: we're not going to make an xarray coordinate like # `classification:bitfields_0_name`, `classification:bitfields_0_fill`, ..., @@ -120,3 +119,36 @@ def descalar_obj_array(arr: np.ndarray) -> np.ndarray: if isinstance(x, np.ndarray) and x.shape == (): arr[idx] = x.item() return arr + + +def unpack_per_band_asset_fields(asset: dict, fields: Iterable) -> dict: + """ + Unpack 1-length list/tuple values for the given ``fields``. + + For keys of ``asset`` in ``fields``, if the value is a 1-length + list or tuple, use its single value. Otherwise, use an empty dict. + """ + # NOTE: this will have to change a lot when we support multi-band assets; + # this is predicated on each asset having exactly 1 band. + asset = asset.copy() + # ^ modifying in-place would be nicer, but user may have passed in + # their own dict of STAC items. + for field in fields: + try: + v = asset[field] + except KeyError: + continue + if isinstance(v, (list, tuple)): + if len(v) == 1: + asset[field] = v[0] + else: + # For >1 band, drop metadata entirely (you can't use the data anyway). + # Otherwise, coordinates would be a mess: both unpacked `eo:bands` + # fields like `eo:bands_common_name`, and plain `eo:bands` which would + # be None for all 1-band assets, and contain the dicts for multi-band + # assets. + v = None + + if v is None: + del asset[field] + return asset diff --git a/stackstac/tests/items.json b/stackstac/tests/items-landsat-c2-l2.json similarity index 100% rename from stackstac/tests/items.json rename to stackstac/tests/items-landsat-c2-l2.json diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index 04e84f8..c3a4fd2 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -1,22 +1,133 @@ import json import pytest +import xarray as xr from stackstac.coordinates import ( items_to_band_coords, items_to_band_coords2, + items_to_band_coords_simple, ) +from stackstac.coordinates_utils import scalar_sequence @pytest.fixture -def stac_json(): - with open("stackstac/tests/items.json") as f: +def landsat_c2_l2_json(): + with open("stackstac/tests/items-landsat-c2-l2.json") as f: return json.load(f) -def test_band_coords(stac_json): +def test_band_coords(landsat_c2_l2_json): ids = ["red", "green", "qa_pixel", "qa_radsat"] - coords = items_to_band_coords(stac_json, ids) - c2 = items_to_band_coords2(stac_json, ids) - print(coords) - print(c2) + # coords = items_to_band_coords(landsat_c2_l2_json, ids) + coords = items_to_band_coords_simple(landsat_c2_l2_json, ids) + # print(coords) + + # 0D coordinate + type = coords["type"] + assert isinstance(type, xr.Variable) + assert type.shape == () + assert type.item() == "image/tiff; application=geotiff; profile=cloud-optimized" + + # 1D coordinate along bands + title = coords["title"] + assert isinstance(title, xr.Variable) + assert ( + title + == [ + "Red Band", + "Green Band", + "Pixel Quality Assessment Band", + "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", + ] + ).all() + + # 1D coordinate along bands, where each element is a variable-length list + roles = coords["roles"] + assert isinstance(roles, xr.Variable) + assert roles.shape == (len(ids),) + # `roles` is an array of lists: + # + # array([list(['data', 'reflectance']), list(['data', 'reflectance']), + # list(['cloud', 'cloud-shadow', 'snow-ice', 'water-mask']), + # list(['saturation'])], dtype=object) + # + # Actually working with this in xarray is awkward. I'm not sure how users + # would ever usefully interact with this besides printing it, because + # just an equality check requires wrapping your list in `scalar_sequence`, + # and if you wanted to do some sort of set operation (only 'data' roles, say), + # I don't think it's even possible in xarray. + assert roles[0] == scalar_sequence(["data", "reflectance"]) + assert roles[2] == scalar_sequence( + ["cloud", "cloud-shadow", "snow-ice", "water-mask"] + ) + assert roles[3] == scalar_sequence(["saturation"]) + + # Here's a 2D coordinate along both time and band + href = coords["href"] + assert isinstance(href, xr.Variable) + assert href.dims == ("time", "band") + assert href.shape == (len(landsat_c2_l2_json), len(ids)) + + # `eo:bands` should be unpacked + # TODO: for backwards compatibility, we should de-prefix `eo:bands` and `sar:` + assert "eo:bands" not in coords + assert "eo:bands_description" in coords + common_name = coords["eo:bands_common_name"] + assert isinstance(common_name, xr.Variable) + assert common_name.dims == ("band",) + + # `raster:bands` is also unpacked + assert "raster:bands" not in coords + data_type = coords["raster:bands_data_type"] + assert isinstance(data_type, xr.Variable) + assert data_type.shape == () + assert data_type == "uint16" + + # missing values in `raster:bands_unit` are imputed with None + unit = coords["raster:bands_unit"] + assert isinstance(unit, xr.Variable) + assert (unit == [None, None, "bit index", "bit index"]).all() + + # `classification:bitfields` contains scalar sequences of dicts. + # Again, quite awkward to work with in xarray, but at least it's properly there? + bitfields = coords["classification:bitfields"] + assert isinstance(bitfields, xr.Variable) + assert bitfields.dims == ("band",) + assert bitfields[0] == None + c2 = bitfields[2].item() + assert isinstance(c2, list) + assert len(c2) == 12 + assert all([isinstance(c, dict) for c in c2]) + + +@pytest.mark.parametrize( + "func", + [ + items_to_band_coords, + items_to_band_coords2, + items_to_band_coords_simple, + ], +) +def test_benchmark_band_coords(func, landsat_c2_l2_json, benchmark): + ids = [ + "ang", + "red", + "blue", + "green", + "nir08", + "swir16", + "swir22", + "coastal", + "mtl.txt", + "mtl.xml", + "mtl.json", + "qa_pixel", + "qa_radsat", + "qa_aerosol", + "tilejson", + "rendered_preview", + ] + bigger = landsat_c2_l2_json * 10 # 200 items + benchmark(func, bigger, ids) + # print(benchmark.stats) diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index cd5b17f..53b1e28 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -1,15 +1,16 @@ from string import printable -import pytest +import hypothesis.strategies as st import numpy as np +import pytest from hypothesis import given -import hypothesis.strategies as st from stackstac.coordinates_utils import ( - descalar_obj_array, deduplicate_axes, + descalar_obj_array, scalar_sequence, unnest_dicts, + unpack_per_band_asset_fields, ) @@ -83,7 +84,7 @@ def test_unnest_dicts(input, expected): | st.text(printable), lambda children: st.lists(children) | st.dictionaries(st.text(printable), children), ) -# Modified from https://hypothesis.readthedocs.io/en/latest/data.html#recursive-data +# ^ modified from https://hypothesis.readthedocs.io/en/latest/data.html#recursive-data @given(jsons) @@ -93,3 +94,42 @@ def test_scalar_sequence_roundtrip(x): assert arr.shape == (1,) descalared = descalar_obj_array(arr) assert descalared[0] == x + + +@pytest.mark.parametrize( + "input, fields, expected", + [ + # No fields + ({"a": None}, [], {"a": None}), + # `None` value is dropped + ({"a": None}, ["a"], {}), + # Not a sequence + ({"a": 1}, ["a"], {"a": 1}), + # Dropped: not 1-length + ({"a": []}, ["a"], {}), + # Unpacked: 1-length + ({"a": [1]}, ["a"], {"a": 1}), + # Dropped: not 1-length + ({"a": [1, 2]}, ["a"], {}), + # No fields match + ({"a": None}, ["b"], {"a": None}), + # No fields match + ({"a": [1]}, ["b"], {"a": [1]}), + # Unpacked: 1-length, with extraneous fields + ({"a": [1]}, ["a", "b"], {"a": 1}), + # Dropped: not 1-length, with extraneous fields + ({"a": [1, 2]}, ["a", "b"], {}), + # Multiple fields: unpacked, not sequence + ({"a": [1], "b": 2}, ["a", "b"], {"a": 1, "b": 2}), + # Multiple fields: unpacked, dropped + ({"a": [1], "b": ()}, ["a", "b"], {"a": 1}), + # Multiple fields: unpacked, not matched + ({"a": [1], "c": ()}, ["a", "b"], {"a": 1, "c": ()}), + # Multiple fields: unpacked, unpacked + ({"a": [1], "b": (2,)}, ["a", "b"], {"a": 1, "b": 2}), + ], +) +def test_unpack_per_band_asset_fields(input, fields, expected): + result = unpack_per_band_asset_fields(input, fields) + assert result is not input + assert result == expected From 01eaca09a9b5f9795c4cccb5597c90bc1f2741c3 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Wed, 25 Oct 2023 17:01:30 -0600 Subject: [PATCH 05/31] wip appendage --- stackstac/coordinates.py | 80 ++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index b1c89a0..1de8e74 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -299,45 +299,47 @@ def items_to_band_coords_simple( return ds.variables -# def items_to_band_locality( -# items: ItemSequence, -# asset_ids: List[str], -# ) -> Coordinates: -# # Maybe a way to improve locality and not iterate over all items many times. -# # TODO: benchmark -# # {field: [ -# # [v_asset_0, v_asset_1, ...], # item 0 -# # [v_asset_0, v_asset_1, ...], # item 1 -# # ]} -# coords_lists = {} -# for ii, item in enumerate(items): -# # {field: [v_asset_0, v_asset_1, ...]} for just this item. -# field_values = {} -# for ai, id in enumerate(asset_ids): -# asset = item.get(id, {}) -# for field, value in asset.items(): -# if not (values := field_values.get(field)): -# field_values[field] = values = [None] * ai - -# # TODO: un-nest `value` if a dict -# values.append(scalar_sequence(value)) - -# for missing_field in field_values.keys() - asset.keys(): -# field_values[missing_field].append(None) - -# # At the end of each asset, all field values should be the same length -# lens = {k: len(vs) for k, vs, in field_values.items()} -# assert len(set(lens.values())) == 1, lens - -# # TODO got to here -# for field, values in field_values.items(): -# if not (all_values := coords_lists.get(field)): -# coords_lists[field] = values = [None] * ai - -# coords_lists[k].append(v) - -# for missing_field in coords_lists.keys() - asset.keys(): -# field_values[missing_field].append(None) +def items_to_band_locality( + items: ItemSequence, + asset_ids: List[str], +) -> Coordinates: + # Maybe a way to improve locality and not iterate over all items many times. + # TODO: benchmark + # {field: [ + # [v_asset_0, v_asset_1, ...], # item 0 + # [v_asset_0, v_asset_1, ...], # item 1 + # ]} + coords_lists = {} + + for ii, item in enumerate(items): + # {field: [v_asset_0, v_asset_1, ...]} for just this item. + field_values = {} + for ai, id in enumerate(asset_ids): + asset = item.get(id, {}) + for field, value in asset.items(): + if not (values := field_values.get(field)): + field_values[field] = values = [None] * len(asset_ids) + + # TODO: un-nest `value` if a dict + values[ai] = scalar_sequence(value) + + # for missing_field in field_values.keys() - asset.keys(): + # field_values[missing_field].append(None) + + # At the end of each asset, all field values should be the same length + lens = {k: len(vs) for k, vs, in field_values.items()} + assert len(set(lens.values())) == 1, lens + assert all(len(vs) for vs in field_values.values()) == len(asset_ids), (lens, len(asset_ids)) + + for field, values in field_values.items(): + if not (all_values := coords_lists.get(field)): + # TODO got to here + coords_lists[field] = values = [None] * len(asset_ids) + + coords_lists[k].append(v) + + for missing_field in coords_lists.keys() - asset.keys(): + field_values[missing_field].append(None) def spec_to_attrs(spec: RasterSpec) -> Dict[str, Any]: From 2a0084634327e92e461ab6b654cf89e2c139069d Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Thu, 26 Oct 2023 14:04:54 -0600 Subject: [PATCH 06/31] locality working; fastest but still 2x slower - unnesting is slow. can optimize. - could probably move into inner loop, so we don't have to iterate over values twice - deobjectifying is slowest. --- stackstac/coordinates.py | 64 ++++++++++++++--------------- stackstac/tests/test_coordinates.py | 8 +++- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index 1de8e74..dda1a86 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -299,47 +299,47 @@ def items_to_band_coords_simple( return ds.variables -def items_to_band_locality( +def items_to_band_coords_locality( items: ItemSequence, asset_ids: List[str], ) -> Coordinates: - # Maybe a way to improve locality and not iterate over all items many times. - # TODO: benchmark - # {field: [ - # [v_asset_0, v_asset_1, ...], # item 0 - # [v_asset_0, v_asset_1, ...], # item 1 - # ]} - coords_lists = {} - + # {field: + # [ + # [v_asset_0, v_asset_1, ...], # item 0 + # [v_asset_0, v_asset_1, ...], # item 1 + # ] + # } + fields = {} for ii, item in enumerate(items): - # {field: [v_asset_0, v_asset_1, ...]} for just this item. - field_values = {} for ai, id in enumerate(asset_ids): - asset = item.get(id, {}) - for field, value in asset.items(): - if not (values := field_values.get(field)): - field_values[field] = values = [None] * len(asset_ids) - - # TODO: un-nest `value` if a dict - values[ai] = scalar_sequence(value) - - # for missing_field in field_values.keys() - asset.keys(): - # field_values[missing_field].append(None) + try: + asset = item["assets"][id] + except KeyError: + continue + + # todo un-nest better? just un-nest values? + unpacked = unnest_dicts( + unpack_per_band_asset_fields(asset, PER_BAND_ASSET_FIELDS) + ) + for field, value in unpacked.items(): - # At the end of each asset, all field values should be the same length - lens = {k: len(vs) for k, vs, in field_values.items()} - assert len(set(lens.values())) == 1, lens - assert all(len(vs) for vs in field_values.values()) == len(asset_ids), (lens, len(asset_ids)) + try: + values = fields[field] + except KeyError: + values = fields[field] = np.empty( + (len(items), len(asset_ids)), dtype=object + ) - for field, values in field_values.items(): - if not (all_values := coords_lists.get(field)): - # TODO got to here - coords_lists[field] = values = [None] * len(asset_ids) + values[ii, ai] = value - coords_lists[k].append(v) + # TODO un-object-ify each field + # fields = {field: np.array(arr.tolist()) for field, arr in fields.items()} + deduped = {field: deduplicate_axes(arr) for field, arr in fields.items()} - for missing_field in coords_lists.keys() - asset.keys(): - field_values[missing_field].append(None) + return { + field: xr.Variable(["time", "band"], arr).squeeze() + for field, arr in deduped.items() + } def spec_to_attrs(spec: RasterSpec) -> Dict[str, Any]: diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index c3a4fd2..cfda029 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -2,11 +2,13 @@ import pytest import xarray as xr +import numpy as np from stackstac.coordinates import ( items_to_band_coords, items_to_band_coords2, items_to_band_coords_simple, + items_to_band_coords_locality, ) from stackstac.coordinates_utils import scalar_sequence @@ -20,7 +22,7 @@ def landsat_c2_l2_json(): def test_band_coords(landsat_c2_l2_json): ids = ["red", "green", "qa_pixel", "qa_radsat"] # coords = items_to_band_coords(landsat_c2_l2_json, ids) - coords = items_to_band_coords_simple(landsat_c2_l2_json, ids) + coords = items_to_band_coords_locality(landsat_c2_l2_json, ids) # print(coords) # 0D coordinate @@ -28,10 +30,12 @@ def test_band_coords(landsat_c2_l2_json): assert isinstance(type, xr.Variable) assert type.shape == () assert type.item() == "image/tiff; application=geotiff; profile=cloud-optimized" + assert np.issubdtype(type.dtype, str) # shouldn't be `O`, should be `U56` # 1D coordinate along bands title = coords["title"] assert isinstance(title, xr.Variable) + assert np.issubdtype(title.dtype, str) # also shouldn't be `O` assert ( title == [ @@ -76,6 +80,7 @@ def test_band_coords(landsat_c2_l2_json): common_name = coords["eo:bands_common_name"] assert isinstance(common_name, xr.Variable) assert common_name.dims == ("band",) + assert (common_name == ['red', 'green', None, None]).all() # `raster:bands` is also unpacked assert "raster:bands" not in coords @@ -107,6 +112,7 @@ def test_band_coords(landsat_c2_l2_json): items_to_band_coords, items_to_band_coords2, items_to_band_coords_simple, + items_to_band_coords_locality ], ) def test_benchmark_band_coords(func, landsat_c2_l2_json, benchmark): From 81b50ed9be8b0329adb875f4c951f7639f6748e8 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Thu, 26 Oct 2023 14:36:21 -0600 Subject: [PATCH 07/31] unnest dicts in generator makes surprisingly little difference. even with micro-optimization, this is just slow python. could maybe replace `isinstance` with `type is`; beyond that, idk. --- stackstac/coordinates.py | 12 +++---- stackstac/coordinates_utils.py | 43 +++++++++++++++++++++-- stackstac/tests/test_coordinates_utils.py | 32 +++++++++++++++++ 3 files changed, 78 insertions(+), 9 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index dda1a86..1acaf50 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -11,6 +11,7 @@ descalar_obj_array, scalar_sequence, unnest_dicts, + unnested_dict_items, unpack_per_band_asset_fields, ) @@ -317,12 +318,9 @@ def items_to_band_coords_locality( except KeyError: continue - # todo un-nest better? just un-nest values? - unpacked = unnest_dicts( - unpack_per_band_asset_fields(asset, PER_BAND_ASSET_FIELDS) - ) - for field, value in unpacked.items(): - + # TODO unpack in generator as well + unpacked = unpack_per_band_asset_fields(asset, PER_BAND_ASSET_FIELDS) + for field, value in unnested_dict_items(unpacked): try: values = fields[field] except KeyError: @@ -333,7 +331,7 @@ def items_to_band_coords_locality( values[ii, ai] = value # TODO un-object-ify each field - # fields = {field: np.array(arr.tolist()) for field, arr in fields.items()} + fields = {field: np.array(arr.tolist()) for field, arr in fields.items()} deduped = {field: deduplicate_axes(arr) for field, arr in fields.items()} return { diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index d168500..d5ac434 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Iterable +from typing import Iterable, Iterator, Mapping, TypeVar import numpy as np @@ -54,13 +54,52 @@ def unnest_dicts(item, prefix=(), sep="_"): # Note that we don't descend into lists/tuples. For the purposes of STAC metadata, # there'd be no reason to do this: we're not going to make an xarray coordinate like # `classification:bitfields_0_name`, `classification:bitfields_0_fill`, ..., - # `classification:bitfields_8_name`, `classification:bitfields_0_fill` + # `classification:bitfields_8_name`, `classification:bitfields_8_fill` # and unpack a separate coordinate for every field in a sequence. Rather, we rely on # `scalar_sequence` to preserve anything that's a sequence into a single coordinate. return item +VT = TypeVar("VT") + + +def unnested_dict_items( + item: Mapping[str, VT], prefix: tuple[str, ...] = (), sep: str = "_" +) -> Iterator[tuple[str, VT]]: + """ + Iterate over flattened dicts, prefixing sub-keys with the name of their parent key. + + Example + ------- + >>> list(unnested_dict_items({ + ... "foo": 1, + ... "bar": { + ... "a": 2, + ... "foo": 3, + ... }, + ... })) + [ + ("foo", 1), + ("bar_a", 2), + ("bar_foo", 3), + ] + """ + assert isinstance(item, dict) + for k, v in item.items(): + if isinstance(v, dict): + yield from unnested_dict_items(v, prefix=prefix + (k,), sep=sep) + else: + yield sep.join(prefix + (k,)) if prefix else k, v + + # Note that we don't descend into lists/tuples. For the purposes of STAC metadata, + # there'd be no reason to do this: we're not going to make an xarray coordinate like + # `classification:bitfields_0_name`, `classification:bitfields_0_fill`, ..., + # `classification:bitfields_8_name`, `classification:bitfields_8_fill` + # and unpack a separate coordinate for every field in a sequence. Rather, we rely on + # `scalar_sequence` to preserve anything that's a sequence into a single coordinate. + + def scalar_sequence(x): """ Convert sequence inputs into NumPy scalars. diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 53b1e28..f85fe0d 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -10,6 +10,7 @@ descalar_obj_array, scalar_sequence, unnest_dicts, + unnested_dict_items, unpack_per_band_asset_fields, ) @@ -75,6 +76,37 @@ def test_unnest_dicts(input, expected): assert unnest_dicts(input) == expected +@pytest.mark.parametrize( + "input, expected", + [ + # Unchanged, no nesting + ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), + # Single level nesting + ({"a": 1, "b": {"a": "foo"}}, {"a": 1, "b_a": "foo"}), + # Single level nesting, multiple subkeys + ({"a": 1, "b": {"a": "foo", "b": "bar"}}, {"a": 1, "b_a": "foo", "b_b": "bar"}), + ( + # Double level nesting + {"a": 1, "b": {"a": "foo", "b": {"x": 0}}}, + {"a": 1, "b_a": "foo", "b_b_x": 0}, + ), + # ( + # # Sequences are _not_ traversed + # [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], + # [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], + # ), + # # Basics are unchanged + # ("abc", "abc"), + # (1, 1), + # (None, None), + # ([1, 2, "foo", True], [1, 2, "foo", True]), + # ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), + ], +) +def test_unnested_dict_items(input, expected): + assert list(unnested_dict_items(input)) == list(expected.items()) + + jsons = st.recursive( st.none() | st.booleans() From d023cbe89d4ff2d8c7bfee08fd301eacbd5a5d50 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Thu, 26 Oct 2023 14:58:11 -0600 Subject: [PATCH 08/31] unpack per band assets in generator --- stackstac/coordinates.py | 9 +++-- stackstac/coordinates_utils.py | 42 +++++++++++++++++---- stackstac/tests/test_coordinates_utils.py | 45 +++++++++++++++++++++-- 3 files changed, 82 insertions(+), 14 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index 1acaf50..f2ae5b5 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -11,8 +11,9 @@ descalar_obj_array, scalar_sequence, unnest_dicts, - unnested_dict_items, + unnested_items, unpack_per_band_asset_fields, + unpacked_per_band_asset_fields, ) from . import accumulate_metadata @@ -318,9 +319,9 @@ def items_to_band_coords_locality( except KeyError: continue - # TODO unpack in generator as well - unpacked = unpack_per_band_asset_fields(asset, PER_BAND_ASSET_FIELDS) - for field, value in unnested_dict_items(unpacked): + for field, value in unnested_items( + unpacked_per_band_asset_fields(asset.items(), PER_BAND_ASSET_FIELDS) + ): try: values = fields[field] except KeyError: diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index d5ac434..da92d49 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Iterable, Iterator, Mapping, TypeVar +from typing import Any, Container, Iterable, Iterator, TypeVar import numpy as np @@ -64,8 +64,8 @@ def unnest_dicts(item, prefix=(), sep="_"): VT = TypeVar("VT") -def unnested_dict_items( - item: Mapping[str, VT], prefix: tuple[str, ...] = (), sep: str = "_" +def unnested_items( + items: Iterable[tuple[str, VT]], prefix: tuple[str, ...] = (), sep: str = "_" ) -> Iterator[tuple[str, VT]]: """ Iterate over flattened dicts, prefixing sub-keys with the name of their parent key. @@ -78,17 +78,16 @@ def unnested_dict_items( ... "a": 2, ... "foo": 3, ... }, - ... })) + ... }.items())) [ ("foo", 1), ("bar_a", 2), ("bar_foo", 3), ] """ - assert isinstance(item, dict) - for k, v in item.items(): + for k, v in items: if isinstance(v, dict): - yield from unnested_dict_items(v, prefix=prefix + (k,), sep=sep) + yield from unnested_items(v.items(), prefix=prefix + (k,), sep=sep) else: yield sep.join(prefix + (k,)) if prefix else k, v @@ -191,3 +190,32 @@ def unpack_per_band_asset_fields(asset: dict, fields: Iterable) -> dict: if v is None: del asset[field] return asset + + +def unpacked_per_band_asset_fields( + asset: Iterable[tuple[str, Any]], fields: Container +) -> Iterator[tuple[str, Any]]: + """ + Unpack 1-length list/tuple values for the given ``fields``. + + For keys of ``asset`` in ``fields``, if the value is a 1-length + list or tuple, use its single value. Otherwise, use an empty dict. + """ + # NOTE: this will have to change a lot when we support multi-band assets; + # this is predicated on each asset having exactly 1 band. + for k, v in asset: + if k in fields: + if isinstance(v, (list, tuple)): + if len(v) == 1: + v = v[0] + else: + # For >1 band, drop metadata entirely (you can't use the data anyway). + # Otherwise, coordinates would be a mess: both unpacked `eo:bands` + # fields like `eo:bands_common_name`, and plain `eo:bands` which would + # be None for all 1-band assets, and contain the dicts for multi-band + # assets. + continue + elif v is None: + continue + + yield k, v diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index f85fe0d..54162ba 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -10,8 +10,9 @@ descalar_obj_array, scalar_sequence, unnest_dicts, - unnested_dict_items, + unnested_items, unpack_per_band_asset_fields, + unpacked_per_band_asset_fields, ) @@ -103,8 +104,8 @@ def test_unnest_dicts(input, expected): # ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), ], ) -def test_unnested_dict_items(input, expected): - assert list(unnested_dict_items(input)) == list(expected.items()) +def test_unnested_items(input, expected): + assert list(unnested_items(input)) == list(expected.items()) jsons = st.recursive( @@ -165,3 +166,41 @@ def test_unpack_per_band_asset_fields(input, fields, expected): result = unpack_per_band_asset_fields(input, fields) assert result is not input assert result == expected + + +@pytest.mark.parametrize( + "input, fields, expected", + [ + # No fields + ({"a": None}, [], {"a": None}), + # `None` value is dropped + ({"a": None}, ["a"], {}), + # Not a sequence + ({"a": 1}, ["a"], {"a": 1}), + # Dropped: not 1-length + ({"a": []}, ["a"], {}), + # Unpacked: 1-length + ({"a": [1]}, ["a"], {"a": 1}), + # Dropped: not 1-length + ({"a": [1, 2]}, ["a"], {}), + # No fields match + ({"a": None}, ["b"], {"a": None}), + # No fields match + ({"a": [1]}, ["b"], {"a": [1]}), + # Unpacked: 1-length, with extraneous fields + ({"a": [1]}, ["a", "b"], {"a": 1}), + # Dropped: not 1-length, with extraneous fields + ({"a": [1, 2]}, ["a", "b"], {}), + # Multiple fields: unpacked, not sequence + ({"a": [1], "b": 2}, ["a", "b"], {"a": 1, "b": 2}), + # Multiple fields: unpacked, dropped + ({"a": [1], "b": ()}, ["a", "b"], {"a": 1}), + # Multiple fields: unpacked, not matched + ({"a": [1], "c": ()}, ["a", "b"], {"a": 1, "c": ()}), + # Multiple fields: unpacked, unpacked + ({"a": [1], "b": (2,)}, ["a", "b"], {"a": 1, "b": 2}), + ], +) +def test_unpacked_per_band_asset_fields(input, fields, expected): + result = list(unpacked_per_band_asset_fields(input.items(), fields)) + assert result == list(expected.items()) From 713e242fe9385a7506da3df93850409758d261c8 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Thu, 26 Oct 2023 16:45:51 -0600 Subject: [PATCH 09/31] fix unnesting with empty dict values --- stackstac/coordinates_utils.py | 2 +- stackstac/tests/test_coordinates_utils.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index da92d49..93934b3 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -86,7 +86,7 @@ def unnested_items( ] """ for k, v in items: - if isinstance(v, dict): + if isinstance(v, dict) and v: yield from unnested_items(v.items(), prefix=prefix + (k,), sep=sep) else: yield sep.join(prefix + (k,)) if prefix else k, v diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 54162ba..63e9bee 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -91,6 +91,8 @@ def test_unnest_dicts(input, expected): {"a": 1, "b": {"a": "foo", "b": {"x": 0}}}, {"a": 1, "b_a": "foo", "b_b_x": 0}, ), + # Empty dicts are preserved + ({"a": {}, "b": {"c": {}}}, {"a": {}, "b_c": {}}) # ( # # Sequences are _not_ traversed # [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], @@ -105,7 +107,7 @@ def test_unnest_dicts(input, expected): ], ) def test_unnested_items(input, expected): - assert list(unnested_items(input)) == list(expected.items()) + assert list(unnested_items(input.items())) == list(expected.items()) jsons = st.recursive( From abe0f2555db6b052ddc1e1c9ff17a14178f89795 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Thu, 26 Oct 2023 16:54:30 -0600 Subject: [PATCH 10/31] create typed arrays initially this gets us to just 3x slower (was 4-5x before, with deobjectifying) string fields are now left as objects, mostly because we'd have to scan them to see if any values were missing before `astype('U')`, because otherwise missing values would just be the string `'None'` --- stackstac/coordinates.py | 40 +++++++++++++--- stackstac/tests/test_coordinates.py | 74 +++++++++++++++++++++++++++-- 2 files changed, 104 insertions(+), 10 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index f2ae5b5..cf35d78 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -305,13 +305,13 @@ def items_to_band_coords_locality( items: ItemSequence, asset_ids: List[str], ) -> Coordinates: + fields = {} # {field: # [ # [v_asset_0, v_asset_1, ...], # item 0 # [v_asset_0, v_asset_1, ...], # item 1 # ] # } - fields = {} for ii, item in enumerate(items): for ai, id in enumerate(asset_ids): try: @@ -325,14 +325,42 @@ def items_to_band_coords_locality( try: values = fields[field] except KeyError: - values = fields[field] = np.empty( - (len(items), len(asset_ids)), dtype=object + # Haven't seen this field before, so create the array of its values. + # We guess whether the dtype will be numeric, or str/object, based + # on this first value. + if isinstance(value, (int, float)): + dtype = float + fill = np.nan + # NOTE: we don't use int64, even for ints, because there'd be no + # way to represent missing values. Using pandas nullable arrays + # could be interesting at some point. + else: + dtype = object + fill = None + + values = fields[field] = np.full( + (len(items), len(asset_ids)), fill, dtype=dtype ) - values[ii, ai] = value + try: + values[ii, ai] = value + except (TypeError, ValueError): + # If our dtype guess was wrong, or a field has values of multiple types, + # promote the whole array to a more generic dtype. + # A `ValueError` might be "could not convert string to float". + # (so if there did happen to be string values that could be parsed as numbers, + # we'd do that, which is probably ok?) + try: + new_dtype = np.result_type(value, values) + except TypeError: + # Thrown when "no common DType exists for the given inputs. + # For example they cannot be stored in a single array unless the + # dtype is `object`" + new_dtype = object + + values = fields[field] = values.astype(new_dtype) + values[ii, ai] = value - # TODO un-object-ify each field - fields = {field: np.array(arr.tolist()) for field, arr in fields.items()} deduped = {field: deduplicate_axes(arr) for field, arr in fields.items()} return { diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index cfda029..e16712c 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -30,12 +30,10 @@ def test_band_coords(landsat_c2_l2_json): assert isinstance(type, xr.Variable) assert type.shape == () assert type.item() == "image/tiff; application=geotiff; profile=cloud-optimized" - assert np.issubdtype(type.dtype, str) # shouldn't be `O`, should be `U56` # 1D coordinate along bands title = coords["title"] assert isinstance(title, xr.Variable) - assert np.issubdtype(title.dtype, str) # also shouldn't be `O` assert ( title == [ @@ -80,7 +78,7 @@ def test_band_coords(landsat_c2_l2_json): common_name = coords["eo:bands_common_name"] assert isinstance(common_name, xr.Variable) assert common_name.dims == ("band",) - assert (common_name == ['red', 'green', None, None]).all() + assert (common_name == ["red", "green", None, None]).all() # `raster:bands` is also unpacked assert "raster:bands" not in coords @@ -106,13 +104,81 @@ def test_band_coords(landsat_c2_l2_json): assert all([isinstance(c, dict) for c in c2]) +def test_band_coords_type_promotion(): + stac = [ + { + "assets": { + "foo": { + "complex_field": 0, + "numeric": 0, + "mixed_numeric_object": 0, + "mixed_numeric_str": 0, + } + } + }, + { + "assets": { + "foo": { + "complex_field": 2 - 4.0j, + "numeric": None, + "mixed_numeric_object": [], + "mixed_numeric_str": "baz", + "partially_missing_str": "woof", + "partially_missing_numeric": -1, + "partially_missing_object": {}, + } + } + }, + ] + coords = items_to_band_coords_locality(stac, ["foo"]) + + complex = coords["complex_field"] + assert isinstance(complex, xr.Variable) + assert complex.dtype.kind == "c" + assert (complex == [0, 2 - 4.0j]).all() + + numeric = coords["numeric"] + assert isinstance(numeric, xr.Variable) + assert numeric.dtype == np.dtype(float) + assert numeric[0] == 0 + assert np.isnan(numeric[1]) + + mixed_numeric_object = coords["mixed_numeric_object"] + assert isinstance(mixed_numeric_object, xr.Variable) + assert mixed_numeric_object.dtype == np.dtype(object) + assert (mixed_numeric_object == [0, []]).all() + + mixed_numeric_str = coords["mixed_numeric_str"] + assert isinstance(mixed_numeric_str, xr.Variable) + assert mixed_numeric_str.dtype == np.dtype(object) + assert (mixed_numeric_str == np.array([0.0, "baz"], dtype=object)).all() + # ^ without explicitly specifying `dtype=object`, NumPy would weirdly have + # turned our list into a string array (` Date: Fri, 27 Oct 2023 13:11:07 -0600 Subject: [PATCH 11/31] starting to generalize for properties as well --- stackstac/coordinates.py | 93 ++++++++++++---------------------- stackstac/coordinates_utils.py | 69 ++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 61 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index cf35d78..08a8ac9 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -1,14 +1,16 @@ from __future__ import annotations -from typing import Any, Dict, List, Literal, Mapping, Sequence, Tuple, Union +from typing import Any, Dict, List, Literal, Sequence, Tuple, Union import numpy as np import pandas as pd import xarray as xr from stackstac.coordinates_utils import ( + Coordinates, deduplicate_axes, descalar_obj_array, + items_to_coords, scalar_sequence, unnest_dicts, unnested_items, @@ -23,7 +25,6 @@ ASSET_TABLE_DT = np.dtype( [("url", object), ("bounds", "float64", 4), ("scale_offset", "float64", 2)] ) -Coordinates = Mapping[str, Union[pd.Index, np.ndarray, xr.Variable, list]] # Asset fields which are a list with one item per band in the asset. # For one-band assets, they should be a list of length 1. @@ -305,68 +306,40 @@ def items_to_band_coords_locality( items: ItemSequence, asset_ids: List[str], ) -> Coordinates: - fields = {} - # {field: - # [ - # [v_asset_0, v_asset_1, ...], # item 0 - # [v_asset_0, v_asset_1, ...], # item 1 - # ] - # } - for ii, item in enumerate(items): - for ai, id in enumerate(asset_ids): - try: - asset = item["assets"][id] - except KeyError: - continue - - for field, value in unnested_items( - unpacked_per_band_asset_fields(asset.items(), PER_BAND_ASSET_FIELDS) - ): + def fields_values_generator(): + for ii, item in enumerate(items): + for ai, id in enumerate(asset_ids): try: - values = fields[field] + asset = item["assets"][id] except KeyError: - # Haven't seen this field before, so create the array of its values. - # We guess whether the dtype will be numeric, or str/object, based - # on this first value. - if isinstance(value, (int, float)): - dtype = float - fill = np.nan - # NOTE: we don't use int64, even for ints, because there'd be no - # way to represent missing values. Using pandas nullable arrays - # could be interesting at some point. - else: - dtype = object - fill = None - - values = fields[field] = np.full( - (len(items), len(asset_ids)), fill, dtype=dtype - ) + continue - try: - values[ii, ai] = value - except (TypeError, ValueError): - # If our dtype guess was wrong, or a field has values of multiple types, - # promote the whole array to a more generic dtype. - # A `ValueError` might be "could not convert string to float". - # (so if there did happen to be string values that could be parsed as numbers, - # we'd do that, which is probably ok?) - try: - new_dtype = np.result_type(value, values) - except TypeError: - # Thrown when "no common DType exists for the given inputs. - # For example they cannot be stored in a single array unless the - # dtype is `object`" - new_dtype = object - - values = fields[field] = values.astype(new_dtype) - values[ii, ai] = value - - deduped = {field: deduplicate_axes(arr) for field, arr in fields.items()} + for field, value in unnested_items( + unpacked_per_band_asset_fields(asset.items(), PER_BAND_ASSET_FIELDS) + ): + yield (ii, ai), field, value - return { - field: xr.Variable(["time", "band"], arr).squeeze() - for field, arr in deduped.items() - } + return items_to_coords( + fields_values_generator(), + shape=(len(items), len(asset_ids)), + dims=("time", "band"), + ) + + +def items_to_property_coords_locality( + items: ItemSequence, properties: Union[str, Sequence[str], Literal[True]] +) -> Coordinates: + assert properties is True + return items_to_coords( + ( + ((i,), k, v) + for i, item in enumerate(items) + # TODO: should we unnest items? + for k, v in item["properties"].items() + ), + shape=(len(items),), + dims=("time",), + ) def spec_to_attrs(spec: RasterSpec) -> Dict[str, Any]: diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 93934b3..5d883b1 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -1,8 +1,75 @@ from __future__ import annotations -from typing import Any, Container, Iterable, Iterator, TypeVar +from typing import Any, Container, Iterable, Iterator, Mapping, TypeVar, Union import numpy as np +import pandas as pd +import xarray as xr + +Coordinates = Mapping[str, Union[pd.Index, np.ndarray, xr.Variable, list]] + + +def items_to_coords( + items: Iterable[tuple[tuple[int, ...], str, object]], + *, + shape: tuple[int, ...], + dims: tuple[str, ...], +) -> Coordinates: + assert len(shape) == len( + dims + ), f"{shape=} has {len(shape)} dimensions; {dims=} has {len(dims)}" + + fields = {} + # {field: + # [ + # [v_asset_0, v_asset_1, ...], # item 0 + # [v_asset_0, v_asset_1, ...], # item 1 + # ] + # } + for idx, field, value in items: + assert len(idx) == len( + shape + ), f"Expected {len(shape)}-dimensional index, got {idx}" + try: + values = fields[field] + except KeyError: + # Haven't seen this field before, so create the array of its values. + # We guess whether the dtype will be numeric, or str/object, based + # on this first value. + if isinstance(value, (int, float)): + dtype = float + fill = np.nan + # NOTE: we don't use int64, even for ints, because there'd be no + # way to represent missing values. Using pandas nullable arrays + # could be interesting at some point. + else: + dtype = object + fill = None + + values = fields[field] = np.full(shape, fill, dtype=dtype) + + try: + values[idx] = value + except (TypeError, ValueError): + # If our dtype guess was wrong, or a field has values of multiple types, + # promote the whole array to a more generic dtype. + # A `ValueError` might be "could not convert string to float". + # (so if there did happen to be string values that could be parsed as numbers, + # we'd do that, which is probably ok?) + try: + new_dtype = np.result_type(value, values) + except TypeError: + # Thrown when "no common DType exists for the given inputs. + # For example they cannot be stored in a single array unless the + # dtype is `object`" + new_dtype = object + + values = fields[field] = values.astype(new_dtype) + values[idx] = value + + deduped = {field: deduplicate_axes(arr) for field, arr in fields.items()} + + return {field: xr.Variable(dims, arr).squeeze() for field, arr in deduped.items()} def deduplicate_axes(arr: np.ndarray) -> np.ndarray: From fe8af5b2bd3ce8e24adb0be31577472eb04436d6 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Fri, 27 Oct 2023 13:54:22 -0600 Subject: [PATCH 12/31] remove unused stuff --- stackstac/coordinates.py | 137 +--------------------- stackstac/coordinates_utils.py | 73 ------------ stackstac/tests/test_coordinates.py | 4 - stackstac/tests/test_coordinates_utils.py | 72 ------------ 4 files changed, 2 insertions(+), 284 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index 08a8ac9..2b668a8 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -8,13 +8,8 @@ from stackstac.coordinates_utils import ( Coordinates, - deduplicate_axes, - descalar_obj_array, items_to_coords, - scalar_sequence, - unnest_dicts, unnested_items, - unpack_per_band_asset_fields, unpacked_per_band_asset_fields, ) @@ -104,10 +99,10 @@ def to_coords( coords["y"] = ys if properties: - coords.update(items_to_property_coords(items, properties)) + coords.update(items_to_property_coords_locality(items, properties)) if band_coords: - coords.update(items_to_band_coords2(items, asset_ids)) + coords.update(items_to_band_coords_locality(items, asset_ids)) # Add `epsg` last in case it's also a field in properties; our data model assumes it's a coordinate coords["epsg"] = spec.epsg @@ -174,134 +169,6 @@ def items_to_band_coords( return coords -# TODO -def items_to_property_coords2( - items: ItemSequence, properties: Union[str, Sequence[str], Literal[True]] -) -> Coordinates: - # How to factor out into shared code? - # TODO use `properties` arg - - unnested_props = [unnest_dicts(item["properties"]) for item in items] - all_fields = set().union(*(p.keys() for p in unnested_props)) - - coords_arrs = { - field: descalar_obj_array( - np.array([scalar_sequence(prop.get(field)) for prop in unnested_props]) - ) - for field in all_fields - } - - deduped = {field: deduplicate_axes(arr) for field, arr in coords_arrs.items()} - - return { - field: xr.Variable(["time"], arr).squeeze() for field, arr in deduped.items() - } - - -def items_to_band_coords2( - items: ItemSequence, - asset_ids: List[str], -) -> Coordinates: - - unnested_assets = [ - { - k: unnest_dicts(unpack_per_band_asset_fields(v, PER_BAND_ASSET_FIELDS)) - for k, v in item["assets"].items() - if k in asset_ids - } - for item in items - ] - all_fields = sorted( - set().union(*(asset.keys() for ia in unnested_assets for asset in ia.values())) - ) - - # Building up arrays like: - # { - # "field 0": np.array([ - # [ # item 0 - # value_for_asset_0, value_for_asset_1, ... - # ], - # [ # item 1 - # value_for_asset_0, value_for_asset_1, ... - # ], - # ... - # ]) - # ... - # } - coords_arrs = { - field: descalar_obj_array( - np.array( - [ - [ - scalar_sequence(assets.get(id, {}).get(field)) - for id in asset_ids - # desequence because if the field contains a list, we want to - # treat that as though it's a scalar value. - ] - for assets in unnested_assets - ] - ) - ) - for field in all_fields - } - - # # Maybe a way to improve locality and not iterate over all items many times. - # # TODO: benchmark - # coords_lists = collections.defaultdict(list) - # for assets in unnested_assets: - # values = collections.defaultdict(list) - # for id in asset_ids: - # asset = assets.get(id, {}) - # for field in all_fields: - # values[field].append(desequence(asset.get(field))) - # for k, v in values.items(): - # coords_lists[k].append(v) - - deduped = {field: deduplicate_axes(arr) for field, arr in coords_arrs.items()} - - return { - field: xr.Variable(["time", "band"], arr).squeeze() - for field, arr in deduped.items() - } - - -def items_to_band_coords_simple( - items: ItemSequence, - asset_ids: List[str], -) -> Coordinates: - # Interestingly this is slightly faster in benchmarking than `items_to_band_coords2` - unnested_assets = [ - { - k: unnest_dicts(unpack_per_band_asset_fields(v, PER_BAND_ASSET_FIELDS)) - for k, v in item["assets"].items() - if k in asset_ids - } - for item in items - ] - all_fields = sorted( - set().union(*(asset.keys() for ia in unnested_assets for asset in ia.values())) - ) - - asset_arr = [ - [[ia.get(aid, {}).get(f) for f in all_fields] for aid in asset_ids] - for ia in unnested_assets - ] - da = xr.DataArray( - asset_arr, - coords={ - "band": asset_ids, - "field": all_fields, - }, - dims=["time", "band", "field"], - ) - ds = da.to_dataset("field") - ds = ds.map( - # TODO better way? - lambda da: xr.DataArray(deduplicate_axes(da.data), dims=da.dims).squeeze() - ) - return ds.variables - - def items_to_band_coords_locality( items: ItemSequence, asset_ids: List[str], diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 5d883b1..401b290 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -88,46 +88,6 @@ def deduplicate_axes(arr: np.ndarray) -> np.ndarray: return arr -def unnest_dicts(item, prefix=(), sep="_"): - """ - Flatten nested dicts, prefixing sub-keys with the name of their parent key. - - Example - ------- - >>> unnest_dicts({ - ... "foo": 1, - ... "bar": { - ... "a": 2, - ... "foo": 3, - ... }, - ... }) - { - "foo": 1, - "bar_a": 2, - "bar_foo": 3, - } - """ - if isinstance(item, dict): - result = {} - for k, v in item.items(): - sub_prefix = prefix + (k,) - unnested = unnest_dicts(v, prefix=sub_prefix, sep=sep) - if isinstance(unnested, dict): - result.update(unnested) - else: - result[sep.join(sub_prefix)] = unnested - return result - - # Note that we don't descend into lists/tuples. For the purposes of STAC metadata, - # there'd be no reason to do this: we're not going to make an xarray coordinate like - # `classification:bitfields_0_name`, `classification:bitfields_0_fill`, ..., - # `classification:bitfields_8_name`, `classification:bitfields_8_fill` - # and unpack a separate coordinate for every field in a sequence. Rather, we rely on - # `scalar_sequence` to preserve anything that's a sequence into a single coordinate. - - return item - - VT = TypeVar("VT") @@ -226,39 +186,6 @@ def descalar_obj_array(arr: np.ndarray) -> np.ndarray: return arr -def unpack_per_band_asset_fields(asset: dict, fields: Iterable) -> dict: - """ - Unpack 1-length list/tuple values for the given ``fields``. - - For keys of ``asset`` in ``fields``, if the value is a 1-length - list or tuple, use its single value. Otherwise, use an empty dict. - """ - # NOTE: this will have to change a lot when we support multi-band assets; - # this is predicated on each asset having exactly 1 band. - asset = asset.copy() - # ^ modifying in-place would be nicer, but user may have passed in - # their own dict of STAC items. - for field in fields: - try: - v = asset[field] - except KeyError: - continue - if isinstance(v, (list, tuple)): - if len(v) == 1: - asset[field] = v[0] - else: - # For >1 band, drop metadata entirely (you can't use the data anyway). - # Otherwise, coordinates would be a mess: both unpacked `eo:bands` - # fields like `eo:bands_common_name`, and plain `eo:bands` which would - # be None for all 1-band assets, and contain the dicts for multi-band - # assets. - v = None - - if v is None: - del asset[field] - return asset - - def unpacked_per_band_asset_fields( asset: Iterable[tuple[str, Any]], fields: Container ) -> Iterator[tuple[str, Any]]: diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index e16712c..323e554 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -6,8 +6,6 @@ from stackstac.coordinates import ( items_to_band_coords, - items_to_band_coords2, - items_to_band_coords_simple, items_to_band_coords_locality, ) from stackstac.coordinates_utils import scalar_sequence @@ -176,8 +174,6 @@ def test_band_coords_type_promotion(): "func", [ items_to_band_coords, - items_to_band_coords2, - items_to_band_coords_simple, items_to_band_coords_locality, ], ) diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 63e9bee..f5397c6 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -9,9 +9,7 @@ deduplicate_axes, descalar_obj_array, scalar_sequence, - unnest_dicts, unnested_items, - unpack_per_band_asset_fields, unpacked_per_band_asset_fields, ) @@ -46,37 +44,6 @@ def test_deduplicate_axes(): np.testing.assert_equal(d, np.broadcast_to(1, (1, 1))) -@pytest.mark.parametrize( - "input, expected", - [ - # Unchanged, no nesting - ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), - # Single level nesting - ({"a": 1, "b": {"a": "foo"}}, {"a": 1, "b_a": "foo"}), - # Single level nesting, multiple subkeys - ({"a": 1, "b": {"a": "foo", "b": "bar"}}, {"a": 1, "b_a": "foo", "b_b": "bar"}), - ( - # Double level nesting - {"a": 1, "b": {"a": "foo", "b": {"x": 0}}}, - {"a": 1, "b_a": "foo", "b_b_x": 0}, - ), - ( - # Sequences are _not_ traversed - [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], - [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], - ), - # Basics are unchanged - ("abc", "abc"), - (1, 1), - (None, None), - ([1, 2, "foo", True], [1, 2, "foo", True]), - ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), - ], -) -def test_unnest_dicts(input, expected): - assert unnest_dicts(input) == expected - - @pytest.mark.parametrize( "input, expected", [ @@ -131,45 +98,6 @@ def test_scalar_sequence_roundtrip(x): assert descalared[0] == x -@pytest.mark.parametrize( - "input, fields, expected", - [ - # No fields - ({"a": None}, [], {"a": None}), - # `None` value is dropped - ({"a": None}, ["a"], {}), - # Not a sequence - ({"a": 1}, ["a"], {"a": 1}), - # Dropped: not 1-length - ({"a": []}, ["a"], {}), - # Unpacked: 1-length - ({"a": [1]}, ["a"], {"a": 1}), - # Dropped: not 1-length - ({"a": [1, 2]}, ["a"], {}), - # No fields match - ({"a": None}, ["b"], {"a": None}), - # No fields match - ({"a": [1]}, ["b"], {"a": [1]}), - # Unpacked: 1-length, with extraneous fields - ({"a": [1]}, ["a", "b"], {"a": 1}), - # Dropped: not 1-length, with extraneous fields - ({"a": [1, 2]}, ["a", "b"], {}), - # Multiple fields: unpacked, not sequence - ({"a": [1], "b": 2}, ["a", "b"], {"a": 1, "b": 2}), - # Multiple fields: unpacked, dropped - ({"a": [1], "b": ()}, ["a", "b"], {"a": 1}), - # Multiple fields: unpacked, not matched - ({"a": [1], "c": ()}, ["a", "b"], {"a": 1, "c": ()}), - # Multiple fields: unpacked, unpacked - ({"a": [1], "b": (2,)}, ["a", "b"], {"a": 1, "b": 2}), - ], -) -def test_unpack_per_band_asset_fields(input, fields, expected): - result = unpack_per_band_asset_fields(input, fields) - assert result is not input - assert result == expected - - @pytest.mark.parametrize( "input, fields, expected", [ From 8d4120fd31c430f055744bb0b9d7f44b34d0e4df Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Fri, 27 Oct 2023 14:14:13 -0600 Subject: [PATCH 13/31] 3d coords test. works except missing values. --- stackstac/coordinates_utils.py | 3 +- stackstac/tests/test_coordinates_utils.py | 172 ++++++++++++++++++++++ 2 files changed, 174 insertions(+), 1 deletion(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 401b290..f34c585 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -14,7 +14,7 @@ def items_to_coords( *, shape: tuple[int, ...], dims: tuple[str, ...], -) -> Coordinates: +) -> dict[str, xr.Variable]: assert len(shape) == len( dims ), f"{shape=} has {len(shape)} dimensions; {dims=} has {len(dims)}" @@ -74,6 +74,7 @@ def items_to_coords( def deduplicate_axes(arr: np.ndarray) -> np.ndarray: "Flatten dimensions to length 1 where all values are duplicated" + # TODO: handle NaNs if arr.size <= 1: return arr for axis in range(arr.ndim): diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index f5397c6..7cd3712 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -8,6 +8,7 @@ from stackstac.coordinates_utils import ( deduplicate_axes, descalar_obj_array, + items_to_coords, scalar_sequence, unnested_items, unpacked_per_band_asset_fields, @@ -134,3 +135,174 @@ def test_scalar_sequence_roundtrip(x): def test_unpacked_per_band_asset_fields(input, fields, expected): result = list(unpacked_per_band_asset_fields(input.items(), fields)) assert result == list(expected.items()) + + +def test_items_to_coords_3d(): + data = [ + { + "smallsat": { + "red": { + "type": "geotiff", + "desc": "red-ish", + "resolution": 15, + "id": "smallsat-red-00", + "cloud_fraction": 0.2, + }, + "nir": { + "type": "geotiff", + "desc": "near infrared", + "resolution": 30, + "id": "smallsat-nir-00", + "cloud_fraction": 0.2, + }, + }, + "bigsat": { + "red": { + "type": "geotiff", + "desc": "red-ish", + "resolution": 5, + "id": "bigsat-red-00", + "cloud_fraction": 0.1, + }, + "nir": { + "type": "geotiff", + "desc": "near infrared", + "resolution": 10, + "id": "bigsat-nir-00", + "cloud_fraction": 0.1, + }, + "cloud": { + "type": "geotiff", + "desc": "cloud mask", + "id": "bigsat-cloud-00", + }, + }, + }, + { + "smallsat": { + "red": { + "type": "geotiff", + "desc": "red-ish", + "resolution": 15, + "id": "smallsat-red-01", + "cloud_fraction": 0.6, + }, + "nir": { + "type": "geotiff", + "desc": "near infrared", + "resolution": 30, + "id": "smallsat-nir-01", + "cloud_fraction": 0.6, + }, + }, + "bigsat": { + "red": { + "type": "geotiff", + "desc": "red-ish", + "resolution": 5, + "id": "bigsat-red-01", + "cloud_fraction": 0.3, + }, + "nir": { + "type": "geotiff", + "desc": "near infrared", + "resolution": 10, + "id": "bigsat-nir-01", + "cloud_fraction": 0.3, + }, + "cloud": { + "type": "geotiff", + "desc": "cloud mask", + "id": "bigsat-cloud-01", + }, + }, + }, + { + "smallsat": { + "red": { + "type": "geotiff", + "desc": "red-ish", + "resolution": 15, + "id": "smallsat-red-02", + "cloud_fraction": 0.0, + }, + "nir": { + "type": "geotiff", + "desc": "near infrared", + "resolution": 30, + "id": "smallsat-nir-02", + "cloud_fraction": 0.0, + }, + }, + "bigsat": { + "red": { + "type": "geotiff", + "desc": "red-ish", + "resolution": 5, + "id": "bigsat-red-02", + "cloud_fraction": 0.0, + }, + "nir": { + "type": "geotiff", + "desc": "near infrared", + "resolution": 10, + "id": "bigsat-nir-02", + "cloud_fraction": 0.0, + }, + "cloud": { + "type": "geotiff", + "desc": "cloud mask", + "id": "bigsat-cloud-02", + }, + }, + }, + ] + + coords = items_to_coords( + ( + ((i, j, k), field, value) + for i, item in enumerate(data) + for j, (sat_key, assets) in enumerate(item.items()) + for k, (asset_id, asset) in enumerate(assets.items()) + for field, value in asset.items() + ), + shape=(len(data), 2, 3), + dims=("time", "platform", "band"), + ) + + assert coords.keys() == {"type", "desc", "resolution", "id", "cloud_fraction"} + + ids = coords["id"] + assert ids.dims == ("time", "platform", "band") + assert ids.shape == (len(data), 2, 3) + assert ids[0, 0, 0] == "smallsat-red-00" + assert ids[-1, -1, -1] == "bigsat-cloud-02" + + desc = coords["desc"] + assert desc.dims == ("platform", "band") + assert ( + desc + == [ + ["red-ish", "near infrared", None], + ["red-ish", "near infrared", "cloud mask"], + ] + ).all() + + # TODO handle NaNs while deduplicating + + # resolution = coords["resolution"] + # assert resolution.dims == ("platform", "band") + # assert (resolution == [[15, 30], [5, 10]]).all() + + # TODO because there's no cloud mask band for smallsat, + # it's None, which I suppose is correct/fair, but slightly annoying. + + # type_ = coords["type"] + # assert type_.dims == () + # assert type_ == "geotiff" + + # TODO handle NaNs while deduplicating + + # cloud_fraction = coords["cloud_fraction"] + # assert cloud_fraction.dims == ("time", "platform") + # assert (cloud_fraction == [[0.2, 0.1], [0.6, 0.3], [0.0, 0.0]]).all() From 77ed8b575283247af0a918db0a6e3f34bb5ddefe Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 7 Nov 2023 17:56:08 -0700 Subject: [PATCH 14/31] crappy handling of deduping with nans tests aren't quite there --- stackstac/coordinates_utils.py | 32 ++++++++++++++++++++++- stackstac/tests/test_coordinates_utils.py | 30 +++++++++++++++------ 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index f34c585..afa9357 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -74,9 +74,16 @@ def items_to_coords( def deduplicate_axes(arr: np.ndarray) -> np.ndarray: "Flatten dimensions to length 1 where all values are duplicated" - # TODO: handle NaNs + if arr.dtype.kind in ("f", "c"): + arr_nan = np.isnan(arr) + return _nandeduplicate_axes(arr, arr_nan, np.where(arr_nan, True, arr)) + return _deduplicate_axes(arr) + + +def _deduplicate_axes(arr: np.ndarray) -> np.ndarray: if arr.size <= 1: return arr + for axis in range(arr.ndim): if arr.shape[axis] <= 1: continue @@ -89,6 +96,29 @@ def deduplicate_axes(arr: np.ndarray) -> np.ndarray: return arr +def _nandeduplicate_axes( + arr: np.ndarray, arr_nan: np.ndarray, arr_filled: np.ndarray +) -> np.ndarray: + if arr.size <= 1: + return arr + + for axis in range(arr.ndim): + if arr.shape[axis] <= 1: + continue + first_nan = arr_nan.take([0], axis=axis) + first_filled = arr_filled.take([0], axis=axis) + # ^ note `[0]` instead of `0`: that keeps the dimension + # as length 1 instead of dropping it + allsame = (arr_filled == first_filled).all(axis=axis) & ( + arr_nan == first_nan + ).all(axis=axis) + if allsame.all(): + return _nandeduplicate_axes( + arr.take([0], axis=axis), first_nan, first_filled + ) + return arr + + VT = TypeVar("VT") diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 7cd3712..261a1af 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -45,6 +45,18 @@ def test_deduplicate_axes(): np.testing.assert_equal(d, np.broadcast_to(1, (1, 1))) +def test_deduplicate_axes_nan(): + a2_d0 = np.stack([np.array([1, np.nan, 2])] * 3) + d = deduplicate_axes(a2_d0) + assert d.shape == (1, a2_d0.shape[1]) + np.testing.assert_equal(d, a2_d0[[0]]) + + a2_d1 = a2_d0.T + d = deduplicate_axes(a2_d1) + assert d.shape == (a2_d1.shape[0], 1) + np.testing.assert_equal(d, a2_d1[:, [0]]) + + @pytest.mark.parametrize( "input, expected", [ @@ -60,7 +72,7 @@ def test_deduplicate_axes(): {"a": 1, "b_a": "foo", "b_b_x": 0}, ), # Empty dicts are preserved - ({"a": {}, "b": {"c": {}}}, {"a": {}, "b_c": {}}) + ({"a": {}, "b": {"c": {}}}, {"a": {}, "b_c": {}}), # ( # # Sequences are _not_ traversed # [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], @@ -82,7 +94,7 @@ def test_unnested_items(input, expected): st.none() | st.booleans() | st.integers() - | st.floats() + | st.floats(allow_nan=False, allow_infinity=False, allow_subnormal=False) | st.datetimes() | st.text(printable), lambda children: st.lists(children) | st.dictionaries(st.text(printable), children), @@ -288,11 +300,9 @@ def test_items_to_coords_3d(): ] ).all() - # TODO handle NaNs while deduplicating - - # resolution = coords["resolution"] - # assert resolution.dims == ("platform", "band") - # assert (resolution == [[15, 30], [5, 10]]).all() + resolution = coords["resolution"] + assert resolution.dims == ("platform", "band") + np.testing.assert_equal(resolution.values, [[15, 30, np.nan], [5, 10, np.nan]]) # TODO because there's no cloud mask band for smallsat, # it's None, which I suppose is correct/fair, but slightly annoying. @@ -302,7 +312,11 @@ def test_items_to_coords_3d(): # assert type_ == "geotiff" # TODO handle NaNs while deduplicating + # also this test is wrong # cloud_fraction = coords["cloud_fraction"] # assert cloud_fraction.dims == ("time", "platform") - # assert (cloud_fraction == [[0.2, 0.1], [0.6, 0.3], [0.0, 0.0]]).all() + # np.testing.assert_equal( + # cloud_fraction.values, + # [[0.2, 0.1, np.nan], [0.6, 0.3, np.nan], [0.0, 0.0, np.nan]], + # ) From 1f1cfef91f55a44fc98142087f2514fc1b820887 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 7 Nov 2023 19:07:30 -0700 Subject: [PATCH 15/31] docstring for `items_to_coords` --- stackstac/coordinates_utils.py | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index afa9357..ce30ba6 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -15,6 +15,70 @@ def items_to_coords( shape: tuple[int, ...], dims: tuple[str, ...], ) -> dict[str, xr.Variable]: + """ + Create coordinates from ``(index, field, value)`` tuples. + + Say you want to make coordinates for a 2x2 DataArray with dimensions ``time, band``. + Your metadata might look like:: + + ((0, 0), "color", "red"), + ((0, 0), "day", "mon"), + ((0, 0), "href", "0/red"), + + ((0, 1), "color", "green"), + ((0, 1), "day", "mon"), + ((0, 1), "href", "0/green"), + + ((1, 0), "color", "red"), + ((1, 0), "day", "tues"), + ((1, 0), "href", "1/red"), + + ((1, 1), "color", "green"), + ((1, 1), "day", "tues"), + # ((1, 1), "href", "1/green") skip this to see how missing values are handled + + This would produce a dict of coordinates like:: + + { + "color": xr.Variable( + dims=["band"], data=["red", "green"], + ), + "day": xr.Variable( + dims=["time"], data=["mon", "tues"], + ), + "href": xr.Variable( + dims=["time", "band"], + data=[ + ["0/red", "0/green"], + ["1/red", None], + ], + ), + } + + Each ``item`` in the iterator gives the value for a particular field at a particular + coordinate in the array. Per field, those are combined and de-duplicated: you can + see how "color" only labels the "band" dimension, because it's the same across all + times; "day" only labels the time dimension, because it's the same across all bands, + and "href" labels both, because it varies across both dimensions. + + Parameters + ---------- + items: + Iterable of ``(index, field, value)`` tuples. ``index`` is a tuple of + integers for the position in the array that this item labels. + ``field`` is the name of a coordinate, and ``value`` is its value. + shape: + The shape of the data being labeled. If a coordinate covered all of the + dimensions, this is the shape it would have. Each ``index`` in ``items`` + must be the same length (same number of dimensions) as ``shape``. + dims: + Dimension names corresponding to ``shape``. Must be the same length + as ``shape``. + + Returns + ------- + coords: dict of xarray Variables, one per unique ``field`` in the items. + """ assert len(shape) == len( dims ), f"{shape=} has {len(shape)} dimensions; {dims=} has {len(dims)}" From 81043319f916439b68c4d2da3c13da10486a0105 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 7 Nov 2023 20:51:57 -0700 Subject: [PATCH 16/31] skip some fields --- stackstac/coordinates.py | 15 ++++++++++----- stackstac/tests/test_coordinates.py | 6 ++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index 2b668a8..cbaddfa 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Dict, List, Literal, Sequence, Tuple, Union +from typing import Any, Collection, Dict, List, Literal, Sequence, Tuple, Union import numpy as np import pandas as pd @@ -129,7 +129,7 @@ def items_to_band_coords( flattened_metadata_by_asset = [ accumulate_metadata.accumulate_metadata( (item["assets"].get(asset_id, {}) for item in items), - # skip_fields={"href", "type", "roles"}, + skip_fields={"href", "type", "roles"}, ) for asset_id in asset_ids ] @@ -172,6 +172,7 @@ def items_to_band_coords( def items_to_band_coords_locality( items: ItemSequence, asset_ids: List[str], + skip_fields: Collection[str] = frozenset(["href", "type"]), ) -> Coordinates: def fields_values_generator(): for ii, item in enumerate(items): @@ -184,7 +185,8 @@ def fields_values_generator(): for field, value in unnested_items( unpacked_per_band_asset_fields(asset.items(), PER_BAND_ASSET_FIELDS) ): - yield (ii, ai), field, value + if field not in skip_fields: + yield (ii, ai), field, value return items_to_coords( fields_values_generator(), @@ -194,15 +196,18 @@ def fields_values_generator(): def items_to_property_coords_locality( - items: ItemSequence, properties: Union[str, Sequence[str], Literal[True]] + items: ItemSequence, + properties: Union[str, Sequence[str], Literal[True]], + skip_fields: Collection[str] = frozenset(["datetime", "id"]), ) -> Coordinates: assert properties is True return items_to_coords( ( ((i,), k, v) for i, item in enumerate(items) - # TODO: should we unnest items? + # TODO: should we unnest properties? for k, v in item["properties"].items() + if k not in skip_fields ), shape=(len(items),), dims=("time",), diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index 323e554..2780dd6 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -20,8 +20,10 @@ def landsat_c2_l2_json(): def test_band_coords(landsat_c2_l2_json): ids = ["red", "green", "qa_pixel", "qa_radsat"] # coords = items_to_band_coords(landsat_c2_l2_json, ids) - coords = items_to_band_coords_locality(landsat_c2_l2_json, ids) - # print(coords) + coords = items_to_band_coords_locality(landsat_c2_l2_json, ids, skip_fields=set()) + + # Note that we intentionally keep some coordinates that would normally be dropped, + # since they're handy for testing # 0D coordinate type = coords["type"] From eb33dc9011defb55601fd1a88537307d6a3e5c1e Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 19:19:47 -0700 Subject: [PATCH 17/31] backwards compatible field de-prefixing --- stackstac/coordinates.py | 13 +++++++++++++ stackstac/tests/test_coordinates.py | 28 +++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index cbaddfa..da1dcd1 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -185,6 +185,7 @@ def fields_values_generator(): for field, value in unnested_items( unpacked_per_band_asset_fields(asset.items(), PER_BAND_ASSET_FIELDS) ): + field = rename_some_band_fields(field) if field not in skip_fields: yield (ii, ai), field, value @@ -195,6 +196,18 @@ def fields_values_generator(): ) +def rename_some_band_fields(field: str) -> str: + """ + Apply renamings to band fields for "convenience". + + This is just for backwards compatibility. + These renamings should probably be removed for simplicity and consistency. + """ + if field == "sar:polarizations": + return "polarization" + return field.removeprefix("eo:bands_") + + def items_to_property_coords_locality( items: ItemSequence, properties: Union[str, Sequence[str], Literal[True]], diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index 2780dd6..bb1a8ef 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -7,6 +7,7 @@ from stackstac.coordinates import ( items_to_band_coords, items_to_band_coords_locality, + rename_some_band_fields, ) from stackstac.coordinates_utils import scalar_sequence @@ -72,10 +73,12 @@ def test_band_coords(landsat_c2_l2_json): assert href.shape == (len(landsat_c2_l2_json), len(ids)) # `eo:bands` should be unpacked - # TODO: for backwards compatibility, we should de-prefix `eo:bands` and `sar:` + # NOTE: for backwards compatibility, we de-prefix `eo:bands`. + # I'd like to remove this; `eo:bands` doesn't deserve more special + # treatment than `raster:bands`, for instance. assert "eo:bands" not in coords - assert "eo:bands_description" in coords - common_name = coords["eo:bands_common_name"] + assert "description" in coords + common_name = coords["common_name"] assert isinstance(common_name, xr.Variable) assert common_name.dims == ("band",) assert (common_name == ["red", "green", None, None]).all() @@ -172,6 +175,25 @@ def test_band_coords_type_promotion(): assert (partially_missing_object == [None, {}]).all() +@pytest.mark.parametrize( + "input, expected", + [ + ("sar:polarizations", "polarization"), + ("eo:bands_common_name", "common_name"), + ("eo:bands_foobar", "foobar"), + ("sar:frequency_band", "sar:frequency_band"), + ("eo:cloud_cover", "eo:cloud_cover"), + ( + "somethingsomething_sar:polarizations", + "somethingsomething_sar:polarizations", + ), + ("somethingsomething_eo:bands_name", "somethingsomething_eo:bands_name"), + ], +) +def test_rename_band_fields(input: str, expected: str): + assert rename_some_band_fields(input) == expected + + @pytest.mark.parametrize( "func", [ From a678278c52ee3960e9ce674680d173a0e14bbff3 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 19:55:14 -0700 Subject: [PATCH 18/31] fix small comments --- stackstac/coordinates_utils.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index ce30ba6..8fb0e3f 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -85,10 +85,11 @@ def items_to_coords( fields = {} # {field: - # [ + # np.array([ # [v_asset_0, v_asset_1, ...], # item 0 # [v_asset_0, v_asset_1, ...], # item 1 - # ] + # ..., + # ]) # } for idx, field, value in items: assert len(idx) == len( @@ -217,8 +218,8 @@ def unnested_items( # there'd be no reason to do this: we're not going to make an xarray coordinate like # `classification:bitfields_0_name`, `classification:bitfields_0_fill`, ..., # `classification:bitfields_8_name`, `classification:bitfields_8_fill` - # and unpack a separate coordinate for every field in a sequence. Rather, we rely on - # `scalar_sequence` to preserve anything that's a sequence into a single coordinate. + # and unpack a separate coordinate for every field in a sequence. Rather, we + # `preserve anything that's a sequence as a single element in an object array. def scalar_sequence(x): From 32894f392c0e2a3610d6f7ed130213a998aeecea Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 19:55:37 -0700 Subject: [PATCH 19/31] fix coords utils 3d tests --- stackstac/tests/test_coordinates_utils.py | 166 +++++++++++++++------- 1 file changed, 115 insertions(+), 51 deletions(-) diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 261a1af..7e390ca 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -149,42 +149,135 @@ def test_unpacked_per_band_asset_fields(input, fields, expected): assert result == list(expected.items()) -def test_items_to_coords_3d(): +def test_items_to_coords_3d_same_bands(): + # 3D coordinates don't actually happen in stackstac, but this is a nice stress test that the logic is correct. data = [ { "smallsat": { "red": { "type": "geotiff", + "cloud_fraction": 0.2, + }, + "nir": { + "type": "geotiff", + "cloud_fraction": 0.2, + }, + }, + "bigsat": { + "red": { + "type": "geotiff", + "cloud_fraction": 0.1, + }, + "nir": { + "type": "geotiff", + "cloud_fraction": 0.1, + }, + }, + }, + { + "smallsat": { + "red": { + "type": "geotiff", + "cloud_fraction": 0.6, + }, + "nir": { + "type": "geotiff", + "cloud_fraction": 0.6, + }, + }, + "bigsat": { + "red": { + "type": "geotiff", + "cloud_fraction": 0.3, + }, + "nir": { + "type": "geotiff", + "cloud_fraction": 0.3, + }, + }, + }, + { + "smallsat": { + "red": { + "type": "geotiff", + "cloud_fraction": 0.0, + }, + "nir": { + "type": "geotiff", + "cloud_fraction": 0.0, + }, + }, + "bigsat": { + "red": { + "type": "geotiff", + # "cloud_fraction": 0.0, + }, + "nir": { + "type": "geotiff", + # "cloud_fraction": 0.0, + }, + }, + }, + ] + + coords = items_to_coords( + ( + ((i, j, k), field, value) + for i, item in enumerate(data) + for j, (sat_key, assets) in enumerate(item.items()) + for k, (asset_id, asset) in enumerate(assets.items()) + for field, value in asset.items() + ), + shape=(len(data), 2, 2), + dims=("time", "platform", "band"), + ) + + cloud_fraction = coords["cloud_fraction"] + assert cloud_fraction.dims == ("time", "platform") + np.testing.assert_equal( + cloud_fraction.values, + [ + [0.2, 0.1], + [0.6, 0.3], + [0.0, np.nan], + ], + ) + + # TODO because there's no cloud mask band for smallsat, + # it's None, which I suppose is correct/fair, but slightly annoying. + type_ = coords["type"] + assert type_.dims == () + assert type_ == "geotiff" + + +def test_items_to_coords_3d_different_bands(): + # similar to above, but `bigsat` has a band that `smallsat` doesn't. + data = [ + { + "smallsat": { + "red": { "desc": "red-ish", "resolution": 15, "id": "smallsat-red-00", - "cloud_fraction": 0.2, }, "nir": { - "type": "geotiff", "desc": "near infrared", "resolution": 30, "id": "smallsat-nir-00", - "cloud_fraction": 0.2, }, }, "bigsat": { "red": { - "type": "geotiff", "desc": "red-ish", "resolution": 5, "id": "bigsat-red-00", - "cloud_fraction": 0.1, }, "nir": { - "type": "geotiff", "desc": "near infrared", "resolution": 10, "id": "bigsat-nir-00", - "cloud_fraction": 0.1, }, "cloud": { - "type": "geotiff", "desc": "cloud mask", "id": "bigsat-cloud-00", }, @@ -193,37 +286,28 @@ def test_items_to_coords_3d(): { "smallsat": { "red": { - "type": "geotiff", "desc": "red-ish", "resolution": 15, "id": "smallsat-red-01", - "cloud_fraction": 0.6, }, "nir": { - "type": "geotiff", "desc": "near infrared", "resolution": 30, "id": "smallsat-nir-01", - "cloud_fraction": 0.6, }, }, "bigsat": { "red": { - "type": "geotiff", "desc": "red-ish", "resolution": 5, "id": "bigsat-red-01", - "cloud_fraction": 0.3, }, "nir": { - "type": "geotiff", "desc": "near infrared", "resolution": 10, "id": "bigsat-nir-01", - "cloud_fraction": 0.3, }, "cloud": { - "type": "geotiff", "desc": "cloud mask", "id": "bigsat-cloud-01", }, @@ -232,37 +316,28 @@ def test_items_to_coords_3d(): { "smallsat": { "red": { - "type": "geotiff", "desc": "red-ish", "resolution": 15, "id": "smallsat-red-02", - "cloud_fraction": 0.0, }, "nir": { - "type": "geotiff", "desc": "near infrared", "resolution": 30, "id": "smallsat-nir-02", - "cloud_fraction": 0.0, }, }, "bigsat": { "red": { - "type": "geotiff", "desc": "red-ish", "resolution": 5, "id": "bigsat-red-02", - "cloud_fraction": 0.0, }, "nir": { - "type": "geotiff", "desc": "near infrared", "resolution": 10, "id": "bigsat-nir-02", - "cloud_fraction": 0.0, }, "cloud": { - "type": "geotiff", "desc": "cloud mask", "id": "bigsat-cloud-02", }, @@ -282,7 +357,7 @@ def test_items_to_coords_3d(): dims=("time", "platform", "band"), ) - assert coords.keys() == {"type", "desc", "resolution", "id", "cloud_fraction"} + assert coords.keys() == {"desc", "resolution", "id"} ids = coords["id"] assert ids.dims == ("time", "platform", "band") @@ -292,31 +367,20 @@ def test_items_to_coords_3d(): desc = coords["desc"] assert desc.dims == ("platform", "band") - assert ( - desc - == [ + np.testing.assert_equal( + desc.values, + [ ["red-ish", "near infrared", None], ["red-ish", "near infrared", "cloud mask"], - ] - ).all() + ], + ) resolution = coords["resolution"] assert resolution.dims == ("platform", "band") - np.testing.assert_equal(resolution.values, [[15, 30, np.nan], [5, 10, np.nan]]) - - # TODO because there's no cloud mask band for smallsat, - # it's None, which I suppose is correct/fair, but slightly annoying. - - # type_ = coords["type"] - # assert type_.dims == () - # assert type_ == "geotiff" - - # TODO handle NaNs while deduplicating - # also this test is wrong - - # cloud_fraction = coords["cloud_fraction"] - # assert cloud_fraction.dims == ("time", "platform") - # np.testing.assert_equal( - # cloud_fraction.values, - # [[0.2, 0.1, np.nan], [0.6, 0.3, np.nan], [0.0, 0.0, np.nan]], - # ) + np.testing.assert_equal( + resolution.values, + [ + [15, 30, np.nan], + [5, 10, np.nan], + ], + ) From 11cf046f706bd443376399b5b64a3f7439f58747 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 20:00:53 -0700 Subject: [PATCH 20/31] remove `descalar_obj_array` --- stackstac/coordinates_utils.py | 28 ----------------------- stackstac/tests/test_coordinates_utils.py | 27 ---------------------- 2 files changed, 55 deletions(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 8fb0e3f..77b0cef 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -254,34 +254,6 @@ def scalar_sequence(x): return scalar -def descalar_obj_array(arr: np.ndarray) -> np.ndarray: - """ - In an object array containing NumPy object scalars, unpack the scalars. - - Note that this may mutate the array. - - Example - ------- - >>> s = scalar_sequence([1, 2]) - >>> arr = np.array([s]) - >>> arr[0] - array(list([1, 2]), dtype=object) - >>> # remove the indirection of the NumPy scalar - >>> unpacked = descalar_obj_array(arr) - >>> unpacked[0] - >>> [1, 2] - - """ - if arr.dtype.kind != "O": - return arr - - for idx in np.ndindex(arr.shape): - x = arr[idx] - if isinstance(x, np.ndarray) and x.shape == (): - arr[idx] = x.item() - return arr - - def unpacked_per_band_asset_fields( asset: Iterable[tuple[str, Any]], fields: Container ) -> Iterator[tuple[str, Any]]: diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 7e390ca..231e10d 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -1,15 +1,9 @@ -from string import printable - -import hypothesis.strategies as st import numpy as np import pytest -from hypothesis import given from stackstac.coordinates_utils import ( deduplicate_axes, - descalar_obj_array, items_to_coords, - scalar_sequence, unnested_items, unpacked_per_band_asset_fields, ) @@ -90,27 +84,6 @@ def test_unnested_items(input, expected): assert list(unnested_items(input.items())) == list(expected.items()) -jsons = st.recursive( - st.none() - | st.booleans() - | st.integers() - | st.floats(allow_nan=False, allow_infinity=False, allow_subnormal=False) - | st.datetimes() - | st.text(printable), - lambda children: st.lists(children) | st.dictionaries(st.text(printable), children), -) -# ^ modified from https://hypothesis.readthedocs.io/en/latest/data.html#recursive-data - - -@given(jsons) -def test_scalar_sequence_roundtrip(x): - wrapped = scalar_sequence(x) - arr = np.array([wrapped]) - assert arr.shape == (1,) - descalared = descalar_obj_array(arr) - assert descalared[0] == x - - @pytest.mark.parametrize( "input, fields, expected", [ From b8a7666c4b19f12042cddf1223c97389abc8dda7 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 20:23:38 -0700 Subject: [PATCH 21/31] out with the old! --- stackstac/accumulate_metadata.py | 196 ---------------------------- stackstac/coordinates.py | 100 +++----------- stackstac/stack.py | 14 +- stackstac/tests/test_coordinates.py | 37 +----- 4 files changed, 29 insertions(+), 318 deletions(-) delete mode 100644 stackstac/accumulate_metadata.py diff --git a/stackstac/accumulate_metadata.py b/stackstac/accumulate_metadata.py deleted file mode 100644 index eb96404..0000000 --- a/stackstac/accumulate_metadata.py +++ /dev/null @@ -1,196 +0,0 @@ -from typing import ( - Container, - Dict, - Hashable, - Iterable, - Literal, - Mapping, - Sequence, - Union, - TypeVar, -) - -import numpy as np -import xarray as xr - - -# properties can contain lists; need some way to tell them a singleton list -# apart from the list of properties we're collecting -class _ourlist(list): - pass - - -def metadata_to_coords( - items: Iterable[Mapping[str, object]], - dim_name: str, - fields: Union[str, Sequence[str], Literal[True]] = True, - skip_fields: Container[str] = (), -) -> Dict[str, xr.Variable]: - return dict_to_coords( - accumulate_metadata( - items, - fields=[fields] if isinstance(fields, str) else fields, - skip_fields=skip_fields, - ), - dim_name, - ) - - -T = TypeVar("T", bound=Hashable) - - -def accumulate_metadata( - items: Iterable[Mapping[T, object]], - fields: Union[Sequence[T], Literal[True]] = True, - skip_fields: Container[T] = (), -) -> Dict[T, object]: - """ - Accumulate a sequence of multiple similar dicts into a single dict of lists. - - Each field will contain a list of all the values for that field (equal length to ``items``). - For items where the field didn't exist, None is used. - - Fields with only one unique value are flattened down to just that single value. - - Parameters - ---------- - items: - Iterable of dicts to accumulate - fields: - Only use these fields. If True, use all fields. - skip_fields: - Skip these fields. - """ - all_fields: Dict[T, object] = {} - for i, item in enumerate(items): - # Inductive case: update existing fields - for existing_field, existing_value in all_fields.items(): - new_value = item.get(existing_field, None) - if new_value == existing_value: - # leave fields that are the same for every item as singletons - continue - if isinstance(existing_value, _ourlist): - # we already have a list going; add to it - existing_value.append(new_value) - else: - # all prior values were the same; this is the first different one - all_fields[existing_field] = _ourlist( - [existing_value] * i + [new_value] - ) - - # Base case 1: add any never-before-seen fields, when inferring field names - if fields is True: - for new_field in item.keys() - all_fields.keys(): - if new_field in skip_fields: - continue - value = item[new_field] - all_fields[new_field] = ( - value if i == 0 else _ourlist([None] * i + [value]) - ) - # Base case 2: initialize with predefined fields - elif i == 0: - all_fields.update( - (field, item.get(field, None)) - for field in fields - if field not in skip_fields - ) - - return all_fields - - -def accumulate_metadata_only_allsame( - items: Iterable[Mapping[T, object]], - skip_fields: Container[T] = (), -) -> Dict[T, object]: - """ - Accumulate multiple similar dicts into a single flattened dict of only consistent values. - - If the value of a field differs between items, the field is dropped. - If the value of a field is the same for all items that contain that field, the field is kept. - - Note this means that missing fields are ignored, not treated as different. - - Parameters - ---------- - items: - Iterable of dicts to accumulate - skip_fields: - Skip these fields when ``fields`` is True. - """ - all_fields: Dict[T, object] = {} - for item in items: - for field, value in item.items(): - if field in skip_fields: - continue - if field not in all_fields: - all_fields[field] = value - else: - if value != all_fields[field]: - all_fields[field] = None - - return {field: value for field, value in all_fields.items() if value is not None} - - -def dict_to_coords( - metadata: Dict[str, object], dim_name: str -) -> Dict[str, xr.Variable]: - """ - Convert the output of `accumulate_metadata` into a dict of xarray Variables. - - 1-length lists and scalar values become 0D variables. - - Instances of ``_ourlist`` become 1D variables for ``dim_name``. - - Any other things with >= 1 dimension are dropped, because they probably don't line up - with the other dimensions of the final array. - """ - coords = {} - for field, props in metadata.items(): - while isinstance(props, list) and not isinstance(props, _ourlist): - # a list scalar (like `instruments = ['OLI', 'TIRS']`). - - # first, unpack (arbitrarily-nested) 1-element lists. - # keep re-checking if it's still a list - if len(props) == 1: - props = props[0] - continue - - # for now, treat multi-item lists as a set so xarray can interpret them as 0D variables. - # (numpy very much does not like to create object arrays containing python lists; - # `set` is basically a hack to make a 0D ndarray containing a Python object with multiple items.) - try: - props = set(props) - except TypeError: - # if it's not set-able, just give up - break - - props_arr = np.squeeze( - np.array( - props, - # Avoid DeprecationWarning creating ragged arrays when elements are lists/tuples of different lengths - dtype="object" - if ( - isinstance(props, _ourlist) - and len(set(len(x) if isinstance(x, (list, tuple)) else type(x) for x in props)) - > 1 - ) - else None, - ) - ) - - if ( - props_arr.ndim > 1 - or props_arr.ndim == 1 - and not isinstance(props, _ourlist) - ): - # probably a list-of-lists situation. the other dims likely don't correspond to - # our "bands", "y", and "x" dimensions, and xarray won't let us use unrelated - # dimensions. so just skip it for now. - continue - - coords[field] = xr.Variable( - (dim_name,) if props_arr.ndim == 1 else (), - props_arr, - ) - - return coords diff --git a/stackstac/coordinates.py b/stackstac/coordinates.py index da1dcd1..646d85a 100644 --- a/stackstac/coordinates.py +++ b/stackstac/coordinates.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Collection, Dict, List, Literal, Sequence, Tuple, Union +from typing import Any, Collection, Dict, List, Literal, Tuple import numpy as np import pandas as pd @@ -13,7 +13,6 @@ unpacked_per_band_asset_fields, ) -from . import accumulate_metadata from .raster_spec import RasterSpec from .stac_types import ItemSequence @@ -37,10 +36,9 @@ def to_coords( asset_ids: List[str], spec: RasterSpec, xy_coords: Literal["center", "topleft", False] = "topleft", - properties: Union[bool, str, Sequence[str]] = True, + properties: bool = True, band_coords: bool = True, ) -> Tuple[Coordinates, List[str]]: - times = pd.to_datetime( [item["properties"]["datetime"] for item in items], infer_datetime_format=True, @@ -99,10 +97,15 @@ def to_coords( coords["y"] = ys if properties: - coords.update(items_to_property_coords_locality(items, properties)) + assert properties is True, ( + "Passing specific properties is no longer supported. " + "The `properties` argument must only be True or False. " + "If you have a use case for this, please open an issue." + ) + coords.update(items_to_property_coords(items)) if band_coords: - coords.update(items_to_band_coords_locality(items, asset_ids)) + coords.update(items_to_band_coords(items, asset_ids)) # Add `epsg` last in case it's also a field in properties; our data model assumes it's a coordinate coords["epsg"] = spec.epsg @@ -111,65 +114,23 @@ def to_coords( def items_to_property_coords( - items: ItemSequence, properties: Union[str, Sequence[str], Literal[True]] -) -> Coordinates: - return accumulate_metadata.metadata_to_coords( - (item["properties"] for item in items), - "time", - fields=properties, - skip_fields={"datetime"}, - # skip_fields={"datetime", "providers"}, - ) - - -def items_to_band_coords( items: ItemSequence, - asset_ids: List[str], + skip_fields: Collection[str] = frozenset(["datetime", "id"]), ) -> Coordinates: - flattened_metadata_by_asset = [ - accumulate_metadata.accumulate_metadata( - (item["assets"].get(asset_id, {}) for item in items), - skip_fields={"href", "type", "roles"}, - ) - for asset_id in asset_ids - ] - - eo_by_asset = [] - for meta in flattened_metadata_by_asset: - # NOTE: we look for `eo:bands` in each Asset's metadata, not as an Item-level list. - # This only became available in STAC 1.0.0-beta.1, so we'll fail on older collections. - # See https://github.com/radiantearth/stac-spec/tree/master/extensions/eo#item-fields - eo = meta.pop("eo:bands", {}) - if isinstance(eo, list): - eo = eo[0] if len(eo) == 1 else {} - # ^ `eo:bands` should be a list when present, but >1 item means it's probably a multi-band asset, - # which we can't currently handle, so we ignore it. we don't error here, because - # as long as you don't actually _use_ that asset, everything will be fine. we could - # warn, but that would probably just get annoying. - eo_by_asset.append(eo) - try: - meta["polarization"] = meta.pop("sar:polarizations") - except KeyError: - pass - - coords = accumulate_metadata.metadata_to_coords( - flattened_metadata_by_asset, - "band", - # skip_fields={"href"}, - # skip_fields={"href", "title", "description", "type", "roles"}, + return items_to_coords( + ( + ((i,), k, v) + for i, item in enumerate(items) + # TODO: should we unnest properties? + for k, v in item["properties"].items() + if k not in skip_fields + ), + shape=(len(items),), + dims=("time",), ) - if any(eo_by_asset): - coords.update( - accumulate_metadata.metadata_to_coords( - eo_by_asset, - "band", - fields=["common_name", "center_wavelength", "full_width_half_max"], - ) - ) - return coords -def items_to_band_coords_locality( +def items_to_band_coords( items: ItemSequence, asset_ids: List[str], skip_fields: Collection[str] = frozenset(["href", "type"]), @@ -208,25 +169,6 @@ def rename_some_band_fields(field: str) -> str: return field.removeprefix("eo:bands_") -def items_to_property_coords_locality( - items: ItemSequence, - properties: Union[str, Sequence[str], Literal[True]], - skip_fields: Collection[str] = frozenset(["datetime", "id"]), -) -> Coordinates: - assert properties is True - return items_to_coords( - ( - ((i,), k, v) - for i, item in enumerate(items) - # TODO: should we unnest properties? - for k, v in item["properties"].items() - if k not in skip_fields - ), - shape=(len(items),), - dims=("time",), - ) - - def spec_to_attrs(spec: RasterSpec) -> Dict[str, Any]: attrs = {"spec": spec, "crs": f"epsg:{spec.epsg}", "transform": spec.transform} diff --git a/stackstac/stack.py b/stackstac/stack.py index 0b77de7..a821c9b 100644 --- a/stackstac/stack.py +++ b/stackstac/stack.py @@ -43,7 +43,7 @@ def stack( rescale: bool = True, sortby_date: Literal["asc", "desc", False] = "asc", xy_coords: Literal["center", "topleft", False] = "topleft", - properties: Union[bool, str, Sequence[str]] = True, + properties: bool = True, band_coords: bool = True, gdal_env: Optional[LayeredEnv] = None, errors_as_nodata: Tuple[Exception, ...] = ( @@ -229,18 +229,14 @@ def stack( If False, ``x`` and ``y`` will just be indexed by row/column numbers, saving a small amount of time and local memory. properties: - Which fields from each STAC Item's ``properties`` to add as coordinates to the DataArray, indexing the "time" - dimension. + Whether to use each STAC Item's ``properties`` as coordinates for the DataArray, indexing the "time" dimension. - If None (default), all properties will be used. If a string or sequence of strings, only those fields - will be used. For each Item missing a particular field, its value for that Item will be None. - - If False, no properties will be added. + If False, only ``time`` and ``id`` will be added. band_coords: Whether to include Asset-level metadata as coordinates for the ``bands`` dimension. - If True (default), for each asset ID, the field(s) that have the same value across all Items - will be added as coordinates. + Fields that have the same value across all Assets in an Item, or all Items, will be + deduplicated and collapsed down as appropriate. The ``eo:bands`` field is also unpacked if present, and ``sar:polarizations`` is renamed to ``polarization`` for convenience. diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index bb1a8ef..7301456 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -6,7 +6,7 @@ from stackstac.coordinates import ( items_to_band_coords, - items_to_band_coords_locality, + items_to_band_coords, rename_some_band_fields, ) from stackstac.coordinates_utils import scalar_sequence @@ -21,7 +21,7 @@ def landsat_c2_l2_json(): def test_band_coords(landsat_c2_l2_json): ids = ["red", "green", "qa_pixel", "qa_radsat"] # coords = items_to_band_coords(landsat_c2_l2_json, ids) - coords = items_to_band_coords_locality(landsat_c2_l2_json, ids, skip_fields=set()) + coords = items_to_band_coords(landsat_c2_l2_json, ids, skip_fields=set()) # Note that we intentionally keep some coordinates that would normally be dropped, # since they're handy for testing @@ -133,7 +133,7 @@ def test_band_coords_type_promotion(): } }, ] - coords = items_to_band_coords_locality(stac, ["foo"]) + coords = items_to_band_coords(stac, ["foo"]) complex = coords["complex_field"] assert isinstance(complex, xr.Variable) @@ -192,34 +192,3 @@ def test_band_coords_type_promotion(): ) def test_rename_band_fields(input: str, expected: str): assert rename_some_band_fields(input) == expected - - -@pytest.mark.parametrize( - "func", - [ - items_to_band_coords, - items_to_band_coords_locality, - ], -) -def test_benchmark_band_coords(func, landsat_c2_l2_json, benchmark): - ids = [ - "ang", - "red", - "blue", - "green", - "nir08", - "swir16", - "swir22", - "coastal", - "mtl.txt", - "mtl.xml", - "mtl.json", - "qa_pixel", - "qa_radsat", - "qa_aerosol", - "tilejson", - "rendered_preview", - ] - bigger = landsat_c2_l2_json * 10 # 200 items - benchmark(func, bigger, ids) - # print(benchmark.stats) From 7d5e6930c3cd60a3432e5f1267c801fd923e1d2d Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 20:25:59 -0700 Subject: [PATCH 22/31] driveby: fix small type errors in stack.py --- stackstac/stac_types.py | 9 ++++----- stackstac/stack.py | 13 ++++--------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/stackstac/stac_types.py b/stackstac/stac_types.py index a1f9636..63279ad 100644 --- a/stackstac/stac_types.py +++ b/stackstac/stac_types.py @@ -131,13 +131,12 @@ class ItemDict(TypedDict): ItemCollectionIsh = Union[ SatstacItemCollection, PystacCatalog, PystacItemCollection, ItemSequence ] +ItemsIsh = Union[ + ItemCollectionIsh, ItemIsh, Sequence[PystacItem], Sequence[SatstacItem] +] -def items_to_plain( - items: Union[ - ItemCollectionIsh, ItemIsh, Sequence[PystacItem], Sequence[SatstacItem] - ] -) -> ItemSequence: +def items_to_plain(items: ItemsIsh) -> ItemSequence: """ Convert something like a collection/Catalog of STAC items into a list of plain dicts diff --git a/stackstac/stack.py b/stackstac/stack.py index a821c9b..c172b37 100644 --- a/stackstac/stack.py +++ b/stackstac/stack.py @@ -1,10 +1,10 @@ from __future__ import annotations -from typing import AbstractSet, List, Literal, Optional, Sequence, Tuple, Type, Union +from typing import AbstractSet, List, Literal, Optional, Tuple, Type, Union import numpy as np import xarray as xr -import dask +import dask.base from rasterio import RasterioIOError from rasterio.enums import Resampling @@ -15,19 +15,14 @@ from .rio_env import LayeredEnv from .rio_reader import AutoParallelRioReader from .stac_types import ( - ItemCollectionIsh, - ItemIsh, - PystacItem, - SatstacItem, + ItemsIsh, items_to_plain, ) from .to_dask import items_to_dask, ChunksParam def stack( - items: Union[ - ItemCollectionIsh, ItemIsh, Sequence[PystacItem], Sequence[SatstacItem] - ], + items: ItemsIsh, assets: Optional[Union[List[str], AbstractSet[str]]] = frozenset( ["image/tiff", "image/x.geotiff", "image/vnd.stac.geotiff", "image/jp2"] ), From 3cdf1955c032e217b00634acc20a801817fe4ee8 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 20:39:40 -0700 Subject: [PATCH 23/31] fix type errors in test_coordinates --- stackstac/tests/test_coordinates.py | 36 +++++++++++++++-------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/stackstac/tests/test_coordinates.py b/stackstac/tests/test_coordinates.py index 7301456..6196af4 100644 --- a/stackstac/tests/test_coordinates.py +++ b/stackstac/tests/test_coordinates.py @@ -5,7 +5,6 @@ import numpy as np from stackstac.coordinates import ( - items_to_band_coords, items_to_band_coords, rename_some_band_fields, ) @@ -20,7 +19,6 @@ def landsat_c2_l2_json(): def test_band_coords(landsat_c2_l2_json): ids = ["red", "green", "qa_pixel", "qa_radsat"] - # coords = items_to_band_coords(landsat_c2_l2_json, ids) coords = items_to_band_coords(landsat_c2_l2_json, ids, skip_fields=set()) # Note that we intentionally keep some coordinates that would normally be dropped, @@ -30,20 +28,22 @@ def test_band_coords(landsat_c2_l2_json): type = coords["type"] assert isinstance(type, xr.Variable) assert type.shape == () - assert type.item() == "image/tiff; application=geotiff; profile=cloud-optimized" + assert ( + type.values.item() == "image/tiff; application=geotiff; profile=cloud-optimized" + ) # 1D coordinate along bands title = coords["title"] assert isinstance(title, xr.Variable) - assert ( - title - == [ + np.testing.assert_equal( + title.values, + [ "Red Band", "Green Band", "Pixel Quality Assessment Band", "Radiometric Saturation and Terrain Occlusion Quality Assessment Band", - ] - ).all() + ], + ) # 1D coordinate along bands, where each element is a variable-length list roles = coords["roles"] @@ -81,7 +81,7 @@ def test_band_coords(landsat_c2_l2_json): common_name = coords["common_name"] assert isinstance(common_name, xr.Variable) assert common_name.dims == ("band",) - assert (common_name == ["red", "green", None, None]).all() + np.testing.assert_equal(common_name.values, ["red", "green", None, None]) # `raster:bands` is also unpacked assert "raster:bands" not in coords @@ -93,15 +93,15 @@ def test_band_coords(landsat_c2_l2_json): # missing values in `raster:bands_unit` are imputed with None unit = coords["raster:bands_unit"] assert isinstance(unit, xr.Variable) - assert (unit == [None, None, "bit index", "bit index"]).all() + np.testing.assert_equal(unit.values, [None, None, "bit index", "bit index"]) # `classification:bitfields` contains scalar sequences of dicts. # Again, quite awkward to work with in xarray, but at least it's properly there? bitfields = coords["classification:bitfields"] assert isinstance(bitfields, xr.Variable) assert bitfields.dims == ("band",) - assert bitfields[0] == None - c2 = bitfields[2].item() + assert bitfields[0].values.item() is None + c2 = bitfields[2].values.item() assert isinstance(c2, list) assert len(c2) == 12 assert all([isinstance(c, dict) for c in c2]) @@ -138,7 +138,7 @@ def test_band_coords_type_promotion(): complex = coords["complex_field"] assert isinstance(complex, xr.Variable) assert complex.dtype.kind == "c" - assert (complex == [0, 2 - 4.0j]).all() + np.testing.assert_equal(complex.values, [0, 2 - 4.0j]) numeric = coords["numeric"] assert isinstance(numeric, xr.Variable) @@ -149,19 +149,21 @@ def test_band_coords_type_promotion(): mixed_numeric_object = coords["mixed_numeric_object"] assert isinstance(mixed_numeric_object, xr.Variable) assert mixed_numeric_object.dtype == np.dtype(object) - assert (mixed_numeric_object == [0, []]).all() + np.testing.assert_equal(mixed_numeric_object.values, [0, []]) mixed_numeric_str = coords["mixed_numeric_str"] assert isinstance(mixed_numeric_str, xr.Variable) assert mixed_numeric_str.dtype == np.dtype(object) - assert (mixed_numeric_str == np.array([0.0, "baz"], dtype=object)).all() + np.testing.assert_equal( + mixed_numeric_str.values, np.array([0.0, "baz"], dtype=object) + ) # ^ without explicitly specifying `dtype=object`, NumPy would weirdly have # turned our list into a string array (` Date: Tue, 14 Nov 2023 20:40:29 -0700 Subject: [PATCH 24/31] driveby: fix NameError with multi band rasters --- stackstac/prepare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stackstac/prepare.py b/stackstac/prepare.py index ac343e6..59ee86f 100644 --- a/stackstac/prepare.py +++ b/stackstac/prepare.py @@ -147,7 +147,7 @@ def prepare_items( if raster_bands is not None: if len(raster_bands) != 1: raise ValueError( - f"raster:bands has {len(raster_bands)} elements for asset {asset_id!r}. " + f"raster:bands has {len(raster_bands)} elements for asset {id!r}. " "Multi-band rasters are not currently supported.\n" "If you don't care about this asset, you can skip it by giving a list " "of asset IDs you *do* want in `assets=`, and leaving this one out." From 3067db7be4b0215c00d2b8bf93e1b4f4c13a6a0f Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 14 Nov 2023 20:58:47 -0700 Subject: [PATCH 25/31] remove commented-out test --- stackstac/tests/test_coordinates_utils.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 231e10d..adb031a 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -67,17 +67,6 @@ def test_deduplicate_axes_nan(): ), # Empty dicts are preserved ({"a": {}, "b": {"c": {}}}, {"a": {}, "b_c": {}}), - # ( - # # Sequences are _not_ traversed - # [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], - # [{"a": {"b": "c"}}, {"a2": {"b2": "c2"}}], - # ), - # # Basics are unchanged - # ("abc", "abc"), - # (1, 1), - # (None, None), - # ([1, 2, "foo", True], [1, 2, "foo", True]), - # ({"a": 1, "b": "foo"}, {"a": 1, "b": "foo"}), ], ) def test_unnested_items(input, expected): From 112ca47add3bb84b8a12b1f8ee023477f1fb2016 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Thu, 30 Nov 2023 16:26:48 -0700 Subject: [PATCH 26/31] remove pytest-benchmark --- pdm.lock | 25 +------------------------ pyproject.toml | 1 - 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/pdm.lock b/pdm.lock index 3b95373..29b2f6c 100644 --- a/pdm.lock +++ b/pdm.lock @@ -6,7 +6,7 @@ groups = ["default", "style", "util", "docs-examples", "test", "viz", "docs"] cross_platform = true static_urls = false lock_version = "4.3" -content_hash = "sha256:0e38487854e1451fdecd5f46000ad0cc1d3e002b71cdba92ef9770a9a69beb53" +content_hash = "sha256:661044947a135c2fd35f044894672183f425c2c57b03ca9c93abece419035faf" [[package]] name = "affine" @@ -2375,15 +2375,6 @@ files = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] -[[package]] -name = "py-cpuinfo" -version = "9.0.0" -summary = "Get CPU info with pure Python" -files = [ - {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, - {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, -] - [[package]] name = "py-spy" version = "0.3.14" @@ -2661,20 +2652,6 @@ files = [ {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] -[[package]] -name = "pytest-benchmark" -version = "4.0.0" -requires_python = ">=3.7" -summary = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." -dependencies = [ - "py-cpuinfo", - "pytest>=3.8", -] -files = [ - {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, - {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, -] - [[package]] name = "python-dateutil" version = "2.8.2" diff --git a/pyproject.toml b/pyproject.toml index 400240e..c1e772c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,7 +65,6 @@ style = [ test = [ "hypothesis<7.0.0,>=6.35.0", "pytest<7.0.0,>=6.2.5", - "pytest-benchmark>=4.0.0", ] util = [ "py-spy", From 6fa11c70a2f26fc1e0f40fde2be8125d9d227564 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 19 Dec 2023 10:17:08 -0700 Subject: [PATCH 27/31] factor out DtypeUpdatingArray and start testing --- stackstac/coordinates_utils.py | 78 ++++++++++++++--------- stackstac/tests/test_coordinates_utils.py | 68 ++++++++++++++------ 2 files changed, 98 insertions(+), 48 deletions(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 77b0cef..3176098 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -1,4 +1,5 @@ from __future__ import annotations +from collections import defaultdict from typing import Any, Container, Iterable, Iterator, Mapping, TypeVar, Union @@ -83,7 +84,7 @@ def items_to_coords( dims ), f"{shape=} has {len(shape)} dimensions; {dims=} has {len(dims)}" - fields = {} + fields = defaultdict(lambda: DtypeUpdatingArray(shape)) # {field: # np.array([ # [v_asset_0, v_asset_1, ...], # item 0 @@ -92,29 +93,33 @@ def items_to_coords( # ]) # } for idx, field, value in items: - assert len(idx) == len( - shape - ), f"Expected {len(shape)}-dimensional index, got {idx}" - try: - values = fields[field] - except KeyError: - # Haven't seen this field before, so create the array of its values. - # We guess whether the dtype will be numeric, or str/object, based - # on this first value. - if isinstance(value, (int, float)): - dtype = float - fill = np.nan - # NOTE: we don't use int64, even for ints, because there'd be no - # way to represent missing values. Using pandas nullable arrays - # could be interesting at some point. - else: - dtype = object - fill = None - - values = fields[field] = np.full(shape, fill, dtype=dtype) + values = fields[field] + values[idx] = value + + deduped = {field: deduplicate_axes(arr.arr) for field, arr in fields.items()} + + return {field: xr.Variable(dims, arr).squeeze() for field, arr in deduped.items()} + + +class DtypeUpdatingArray: + _arr: np.ndarray | None + _shape: tuple[int, ...] + def __init__(self, shape: tuple[int, ...]) -> None: + self._arr = None + self._shape = shape + + def __setitem__(self, idx, value) -> None: + assert len(idx) == len( + self._shape + ), f"Expected {len(self._shape)}-dimensional index, got {idx}" + if self._arr is None: + # Based on this first value, we guess whether the dtype will be numeric, or + # str/object. + dtype, fill = self.dtype_fill_for(value) + self._arr = np.full(self._shape, fill, dtype=dtype) try: - values[idx] = value + self._arr[idx] = value except (TypeError, ValueError): # If our dtype guess was wrong, or a field has values of multiple types, # promote the whole array to a more generic dtype. @@ -122,19 +127,32 @@ def items_to_coords( # (so if there did happen to be string values that could be parsed as numbers, # we'd do that, which is probably ok?) try: - new_dtype = np.result_type(value, values) + new_dtype = np.result_type(value, self._arr) except TypeError: # Thrown when "no common DType exists for the given inputs. # For example they cannot be stored in a single array unless the # dtype is `object`" - new_dtype = object - - values = fields[field] = values.astype(new_dtype) - values[idx] = value - - deduped = {field: deduplicate_axes(arr) for field, arr in fields.items()} + new_dtype = np.dtype(object) + + self._arr = self._arr.astype(new_dtype) + self._arr[idx] = value # redo insertion with new dtype + + @staticmethod + def dtype_fill_for(x) -> tuple[type | np.dtype, object]: + if isinstance(x, (int, float)): + # TODO bool, complex + return (float, np.nan) + # NOTE: we don't use int64, even for ints, because there'd be no + # way to represent missing values. Using pandas nullable arrays + # could be interesting at some point. + else: + # TODO datetime? + return (object, None) - return {field: xr.Variable(dims, arr).squeeze() for field, arr in deduped.items()} + @property + def arr(self) -> np.ndarray: + assert self._arr is not None, "Accessing array with no values" + return self._arr def deduplicate_axes(arr: np.ndarray) -> np.ndarray: diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index adb031a..f146483 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -1,7 +1,9 @@ +from datetime import datetime import numpy as np import pytest from stackstac.coordinates_utils import ( + DtypeUpdatingArray, deduplicate_axes, items_to_coords, unnested_items, @@ -118,21 +120,21 @@ def test_items_to_coords_3d_same_bands(): "smallsat": { "red": { "type": "geotiff", - "cloud_fraction": 0.2, + "cloudy": True, }, "nir": { "type": "geotiff", - "cloud_fraction": 0.2, + "cloudy": True, }, }, "bigsat": { "red": { "type": "geotiff", - "cloud_fraction": 0.1, + "cloudy": False, }, "nir": { "type": "geotiff", - "cloud_fraction": 0.1, + "cloudy": False, }, }, }, @@ -140,21 +142,21 @@ def test_items_to_coords_3d_same_bands(): "smallsat": { "red": { "type": "geotiff", - "cloud_fraction": 0.6, + "cloudy": True, }, "nir": { "type": "geotiff", - "cloud_fraction": 0.6, + "cloudy": True, }, }, "bigsat": { "red": { "type": "geotiff", - "cloud_fraction": 0.3, + "cloudy": True, }, "nir": { "type": "geotiff", - "cloud_fraction": 0.3, + "cloudy": True, }, }, }, @@ -162,21 +164,21 @@ def test_items_to_coords_3d_same_bands(): "smallsat": { "red": { "type": "geotiff", - "cloud_fraction": 0.0, + "cloudy": False, }, "nir": { "type": "geotiff", - "cloud_fraction": 0.0, + "cloudy": False, }, }, "bigsat": { "red": { "type": "geotiff", - # "cloud_fraction": 0.0, + # "cloudy": False, }, "nir": { "type": "geotiff", - # "cloud_fraction": 0.0, + # "cloudy": False, }, }, }, @@ -194,14 +196,14 @@ def test_items_to_coords_3d_same_bands(): dims=("time", "platform", "band"), ) - cloud_fraction = coords["cloud_fraction"] - assert cloud_fraction.dims == ("time", "platform") + cloudy = coords["cloudy"] + assert cloudy.dims == ("time", "platform") np.testing.assert_equal( - cloud_fraction.values, + cloudy.values, [ - [0.2, 0.1], - [0.6, 0.3], - [0.0, np.nan], + [True, False], + [True, True], + [False, None], ], ) @@ -346,3 +348,33 @@ def test_items_to_coords_3d_different_bands(): [5, 10, np.nan], ], ) + + +@pytest.mark.parametrize( + "values, expected, dtype", + [ + # NOTE: the array will always be initialized to size 4 + ([3, 4, 5], [3.0, 4.0, 5.0, np.nan], float), + ([3, 4, 5, 6], [3.0, 4.0, 5.0, 6.0], float), + ([3, 4.1, 5.2], [3.0, 4.1, 5.2, np.nan], float), + ([3, "foo"], [3, "foo", None, None], object), + (["foo", 3], ["foo", 3, None, None], object), + ([3, "4", "5"], [3, "4", "5", None], object), + ([2.2, {"x": 1}, 3.3, 4], [2.2, {"x": 1}, 3.3, 4], object), + ([True, True, False], [True, True, False, None], object), + ([1, True, False], [1, True, False, None], object), + ( + [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1)], + [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1), np.nan], + np.datetime64, + ), + ], +) +def test_dtype_updating_array(values, expected, dtype): + a = DtypeUpdatingArray((4,)) + for i, x in enumerate(values): + a[(i,)] = x + + arr = a.arr + np.testing.assert_array_equal(arr, expected) + assert arr.dtype == np.dtype(dtype) From 9db39b3691cb8f3d283fb94234ca0aa479da7596 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 19 Dec 2023 10:17:38 -0700 Subject: [PATCH 28/31] convert NaN fill values to None feels maybe unnecessary? --- stackstac/coordinates_utils.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 3176098..3079aea 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -134,7 +134,15 @@ def __setitem__(self, idx, value) -> None: # dtype is `object`" new_dtype = np.dtype(object) - self._arr = self._arr.astype(new_dtype) + if new_dtype.kind == "O": + # Replace previous NaN fill values with None when converting to object array. + # Of course, this would convert values that were actually None in the data... + assert self._arr.dtype.kind != "O", self._arr.dtype + isnan = np.isnan(self._arr) + self._arr = np.where(isnan, None, self._arr) # type: ignore + else: + self._arr = self._arr.astype(new_dtype) + self._arr[idx] = value # redo insertion with new dtype @staticmethod From f7b9e29463e652ab571c59aa95ec847cbb309fee Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 19 Dec 2023 10:28:46 -0700 Subject: [PATCH 29/31] test for weird cases --- stackstac/tests/test_coordinates_utils.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index f146483..2d1cc34 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -359,15 +359,19 @@ def test_items_to_coords_3d_different_bands(): ([3, 4.1, 5.2], [3.0, 4.1, 5.2, np.nan], float), ([3, "foo"], [3, "foo", None, None], object), (["foo", 3], ["foo", 3, None, None], object), - ([3, "4", "5"], [3, "4", "5", None], object), ([2.2, {"x": 1}, 3.3, 4], [2.2, {"x": 1}, 3.3, 4], object), ([True, True, False], [True, True, False, None], object), - ([1, True, False], [1, True, False, None], object), ( [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1)], [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1), np.nan], np.datetime64, ), + # strings get parsed to numbers if the first value is a number. this isn't ideal + # or something that should be relied on, but we test for it to be aware if the + # behavior changes. + ([3, "4", "5"], [3, 4, 5, np.nan], float), + # if a bool follows a number, it'll get cast. also not ideal, but testing to notice changes. + ([1, True, False], [1.0, 1.0, 0.0, np.nan], float), ], ) def test_dtype_updating_array(values, expected, dtype): From 42bb76f9f79b16d8b9059083c94a951aa1bcb649 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 19 Dec 2023 10:30:21 -0700 Subject: [PATCH 30/31] treat datetimes as objects for now --- stackstac/coordinates_utils.py | 14 +++++++++++--- stackstac/tests/test_coordinates_utils.py | 10 +++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 3079aea..8d9aa65 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -1,5 +1,6 @@ from __future__ import annotations from collections import defaultdict +import datetime from typing import Any, Container, Iterable, Iterator, Mapping, TypeVar, Union @@ -147,15 +148,22 @@ def __setitem__(self, idx, value) -> None: @staticmethod def dtype_fill_for(x) -> tuple[type | np.dtype, object]: + if isinstance(x, bool): + # `bool` is a subclass of `int` in Python. + return (object, None) + # Sadly, we have to use an object array so we can represent missing values. if isinstance(x, (int, float)): # TODO bool, complex return (float, np.nan) # NOTE: we don't use int64, even for ints, because there'd be no # way to represent missing values. Using pandas nullable arrays # could be interesting at some point. - else: - # TODO datetime? - return (object, None) + if isinstance(x, complex): + return (complex, np.nan) + # TODO: datetimes. Handling datetime objects will take some special logic + # (you can't just assign them), plus not sure about timezones. + + return (object, None) @property def arr(self) -> np.ndarray: diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 2d1cc34..64485cb 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -361,11 +361,11 @@ def test_items_to_coords_3d_different_bands(): (["foo", 3], ["foo", 3, None, None], object), ([2.2, {"x": 1}, 3.3, 4], [2.2, {"x": 1}, 3.3, 4], object), ([True, True, False], [True, True, False, None], object), - ( - [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1)], - [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1), np.nan], - np.datetime64, - ), + # ( + # [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1)], + # [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1), np.nan], + # np.datetime64, + # ), # strings get parsed to numbers if the first value is a number. this isn't ideal # or something that should be relied on, but we test for it to be aware if the # behavior changes. From 11f9b4e897668beb556303f69644a9923c7b9d61 Mon Sep 17 00:00:00 2001 From: Gabe Joseph Date: Tue, 19 Dec 2023 10:41:38 -0700 Subject: [PATCH 31/31] convert bool arrays back --- stackstac/coordinates_utils.py | 29 ++++++++++++++++------- stackstac/tests/test_coordinates_utils.py | 3 ++- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/stackstac/coordinates_utils.py b/stackstac/coordinates_utils.py index 8d9aa65..67d57b4 100644 --- a/stackstac/coordinates_utils.py +++ b/stackstac/coordinates_utils.py @@ -2,7 +2,7 @@ from collections import defaultdict import datetime -from typing import Any, Container, Iterable, Iterator, Mapping, TypeVar, Union +from typing import Any, Callable, Container, Iterable, Iterator, Mapping, TypeVar, Union import numpy as np import pandas as pd @@ -97,7 +97,7 @@ def items_to_coords( values = fields[field] values[idx] = value - deduped = {field: deduplicate_axes(arr.arr) for field, arr in fields.items()} + deduped = {field: deduplicate_axes(arr.arr()) for field, arr in fields.items()} return {field: xr.Variable(dims, arr).squeeze() for field, arr in deduped.items()} @@ -105,10 +105,12 @@ def items_to_coords( class DtypeUpdatingArray: _arr: np.ndarray | None _shape: tuple[int, ...] + _postprocess: Callable[[np.ndarray], np.ndarray] | None def __init__(self, shape: tuple[int, ...]) -> None: self._arr = None self._shape = shape + self._postprocess = None def __setitem__(self, idx, value) -> None: assert len(idx) == len( @@ -117,7 +119,7 @@ def __setitem__(self, idx, value) -> None: if self._arr is None: # Based on this first value, we guess whether the dtype will be numeric, or # str/object. - dtype, fill = self.dtype_fill_for(value) + dtype, fill, self._postprocess = self.dtype_fill_postprocess_for(value) self._arr = np.full(self._shape, fill, dtype=dtype) try: self._arr[idx] = value @@ -144,30 +146,39 @@ def __setitem__(self, idx, value) -> None: else: self._arr = self._arr.astype(new_dtype) + self._postprocess = None # postprocess is invalidated if we convert dtypes self._arr[idx] = value # redo insertion with new dtype @staticmethod - def dtype_fill_for(x) -> tuple[type | np.dtype, object]: + def dtype_fill_postprocess_for( + x, + ) -> tuple[type | np.dtype, object, Callable[[np.ndarray], np.ndarray] | None]: if isinstance(x, bool): # `bool` is a subclass of `int` in Python. - return (object, None) + def postprocess(arr: np.ndarray) -> np.ndarray: + if not (arr == None).any(): # noqa: E711 + return arr.astype(bool) + return arr + + return (object, None, postprocess) # Sadly, we have to use an object array so we can represent missing values. if isinstance(x, (int, float)): # TODO bool, complex - return (float, np.nan) + return (float, np.nan, None) # NOTE: we don't use int64, even for ints, because there'd be no # way to represent missing values. Using pandas nullable arrays # could be interesting at some point. if isinstance(x, complex): - return (complex, np.nan) + return (complex, np.nan, None) # TODO: datetimes. Handling datetime objects will take some special logic # (you can't just assign them), plus not sure about timezones. - return (object, None) + return (object, None, None) - @property def arr(self) -> np.ndarray: assert self._arr is not None, "Accessing array with no values" + if self._postprocess: + return self._postprocess(self._arr) return self._arr diff --git a/stackstac/tests/test_coordinates_utils.py b/stackstac/tests/test_coordinates_utils.py index 64485cb..e81ce00 100644 --- a/stackstac/tests/test_coordinates_utils.py +++ b/stackstac/tests/test_coordinates_utils.py @@ -361,6 +361,7 @@ def test_items_to_coords_3d_different_bands(): (["foo", 3], ["foo", 3, None, None], object), ([2.2, {"x": 1}, 3.3, 4], [2.2, {"x": 1}, 3.3, 4], object), ([True, True, False], [True, True, False, None], object), + ([True, True, False, False], [True, True, False, False], bool), # ( # [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1)], # [datetime(2020, 1, 1), datetime(2020, 2, 1), datetime(2020, 3, 1), np.nan], @@ -379,6 +380,6 @@ def test_dtype_updating_array(values, expected, dtype): for i, x in enumerate(values): a[(i,)] = x - arr = a.arr + arr = a.arr() np.testing.assert_array_equal(arr, expected) assert arr.dtype == np.dtype(dtype)