tables, (x)arrays, and rasters

Hi all,

I've been playing around with some ideas for working with geospatial raster data. I'd be curious for any feedback you have.

The core question: what's the best data model for raster data in Python? Unsurprisingly, I think the answer is "it depends". Let's use work through a concrete task and evaluate the various options. Suppose we wanted to compute NDVI for all the scenes captured by Landsat 8 over a couple of hours.

We'll use the Planetary Computer's STAC API to find the scenes, and geopandas to plot the bounding boxes of each scene on a map.

In [1]:
import warnings

warnings.simplefilter("ignore", FutureWarning)

import pystac_client
import geopandas
import planetary_computer
import pystac
import pandas as pd

catalog = pystac_client.Client.open(
    "https://planetarycomputer.microsoft.com/api/stac/v1"
)

items = catalog.search(
    collections=["landsat-8-c2-l2"],
    datetime="2021-07-01T08:00:00Z/2021-07-01T10:00:00Z"
).get_all_items()


items = [planetary_computer.sign(item) for item in items]
items = pystac.ItemCollection(items, clone_items=False)
df = geopandas.GeoDataFrame.from_features(items.to_dict(), crs="epsg:4326")

# https://github.com/geopandas/geopandas/issues/1208
df["id"] = [x.id for x in items]
m = df[["geometry", "id", "datetime"]].explore()
m
Out[1]:
Make this Notebook Trusted to load map: File -> Trust Notebook

This type of data can be represented as an xarray DataArray. But it's not the most efficient way to store the data:

In [2]:
import stackstac

ds = stackstac.stack(
    [x.to_dict() for x in items],
    assets=["SR_B2", "SR_B3", "SR_B4", "SR_B5"],
    epsg=32631,
    chunksize=(7691, 7531)
)
ds
Out[2]:
<xarray.DataArray 'stackstac-4cdb65ae8b286b69a68c07391e28a2d5' (time: 117, band: 4, y: 802756, x: 155889)>
dask.array<fetch_raster_window, shape=(117, 4, 802756, 155889), dtype=float64, chunksize=(1, 1, 7691, 7531), chunktype=numpy.ndarray>
Coordinates:
  * time                         (time) datetime64[ns] 2021-07-01T08:02:03.44...
    id                           (time) <U31 'LC08_L2SR_159248_20210701_02_T2...
  * band                         (band) <U5 'SR_B2' 'SR_B3' 'SR_B4' 'SR_B5'
  * x                            (x) float64 -9.968e+05 -9.968e+05 ... 3.68e+06
  * y                            (y) float64 1.031e+07 1.031e+07 ... -1.377e+07
    landsat:processing_level     (time) <U4 'L2SR' 'L2SP' ... 'L2SP' 'L2SP'
    view:sun_azimuth             (time) float64 225.6 216.8 ... 78.44 75.25
    eo:cloud_cover               (time) float64 22.21 74.31 96.49 ... 0.0 0.0
    landsat:scene_id             (time) <U21 'LC81592482021182LGN00' ... 'LC8...
    landsat:wrs_row              (time) <U3 '248' '001' '005' ... '046' '047'
    proj:epsg                    (time) int64 32648 32646 32642 ... 32632 32631
    landsat:wrs_path             (time) <U3 '159' '175' '175' ... '191' '191'
    landsat:collection_category  (time) <U2 'T2' 'T1' 'T2' ... 'T1' 'T1' 'T1'
    instruments                  object {'tirs', 'oli'}
    landsat:cloud_cover_land     (time) float64 -1.0 80.55 79.41 ... 0.0 0.0 0.0
    landsat:collection_number    <U2 '02'
    landsat:wrs_type             <U1 '2'
    view:sun_elevation           (time) float64 29.32 30.62 ... 66.73 66.19
    platform                     <U9 'landsat-8'
    view:off_nadir               int64 0
    description                  (band) <U68 'Collection 2 Level-2 Blue Band ...
    title                        (band) <U27 'Blue Band (B2)' ... 'Near Infra...
    gsd                          float64 30.0
    common_name                  (band) <U5 'blue' 'green' 'red' 'nir08'
    center_wavelength            (band) float64 0.48 0.56 0.65 0.86
    full_width_half_max          (band) object None 0.06 0.04 0.03
    epsg                         int64 32631
Attributes:
    spec:        RasterSpec(epsg=32631, bounds=(-996810.0, -13768110.0, 36798...
    crs:         epsg:32631
    transform:   | 30.00, 0.00,-996810.00|\n| 0.00,-30.00, 10314570.00|\n| 0....
    resolution:  30.0

To build this (time, band, y, x) DataArray, we end up with many missing values. If you think about the datacube literally, with some "volume" of observed pixels, we have a lot of empty space. In this case, the DataArray takes 426 TiB to store.

Even if we collapse the time dimension, which probably makes sense for this dataset, we still have empty space in the "corners"

In [3]:
ds2 = stackstac.mosaic(ds)
ds2
Out[3]:
<xarray.DataArray 'stackstac-4cdb65ae8b286b69a68c07391e28a2d5' (band: 4, y: 802756, x: 155889)>
dask.array<where, shape=(4, 802756, 155889), dtype=float64, chunksize=(1, 7691, 7531), chunktype=numpy.ndarray>
Coordinates:
  * band                       (band) <U5 'SR_B2' 'SR_B3' 'SR_B4' 'SR_B5'
  * x                          (x) float64 -9.968e+05 -9.968e+05 ... 3.68e+06
  * y                          (y) float64 1.031e+07 1.031e+07 ... -1.377e+07
    instruments                object {'tirs', 'oli'}
    landsat:collection_number  <U2 '02'
    landsat:wrs_type           <U1 '2'
    platform                   <U9 'landsat-8'
    view:off_nadir             int64 0
    description                (band) <U68 'Collection 2 Level-2 Blue Band (B...
    title                      (band) <U27 'Blue Band (B2)' ... 'Near Infrare...
    gsd                        float64 30.0
    common_name                (band) <U5 'blue' 'green' 'red' 'nir08'
    center_wavelength          (band) float64 0.48 0.56 0.65 0.86
    full_width_half_max        (band) object None 0.06 0.04 0.03
    epsg                       int64 32631
Attributes:
    spec:        RasterSpec(epsg=32631, bounds=(-996810.0, -13768110.0, 36798...
    crs:         epsg:32631
    transform:   | 30.00, 0.00,-996810.00|\n| 0.00,-30.00, 10314570.00|\n| 0....
    resolution:  30.0

This helps a lot, getting us down to 3.6 TiB (the curse of dimensionality works in reverse too!) But it's still not as efficient as possible because of that empty space in the corners for this dataset. To actually load all these rasters into, say, a list would take much less memory.

In [4]:
import dask
import math
assets = ["SR_B2", "SR_B3", "SR_B4", "SR_B5"]

dask.utils.format_bytes(sum([
    8 * math.prod(item.assets[asset].extra_fields["proj:shape"])
    for item in items
    for asset in assets
]))
Out[4]:
'218.57 GiB'

So for this dataset (I cannot emphasize that enough; this example was deliberatly designed to look bad for a data cube) it doesn't make sense to model the data as a DataArray.

data model memory (TiB)
xarray (time, band, y, x) 426
xarray (band, y, x) 3.6
list 0.2

I've haven't really considered an xarray.Dataset here. I suspect that the memory usage could get down to approximately what would be required by a list of rasters. That said, something like the following seems to cause some issues.

import xarray as xr

arrays = {item.id: stackstac.stack(item.to_dict(), assets=assets, chunksize=-1) for item in items}
ds3 = xr.Dataset(arrays)

This causes warnings from Dask about slicing an array producing many chunks. I haven't looked into why (slightly overlapping / offset x and y coordinates?). I have a feeling that this would be a bit "untidy", but I haven't worked with Datasets much.

In the Python data science space, we're fortunate to have both xarray and pandas (and geopandas and dask.dataframe). So we have choices! pandas provides an extension array interface to store non-NumPy arrays inside a pandas DataFrame. What would it look like to store STAC items (and more interestingly, rasters stored as DataArrays) inside a pandas DataFrame? Here's a prototype:

Let's load those STAC items into a an "ItemArray".

In [5]:
import rasterpandas

sa = rasterpandas.ItemArray(items)
sa
Out[5]:
<ItemArray>
[<Item id=LC08_L2SP_191047_20210701_02_T1>,
 <Item id=LC08_L2SP_191046_20210701_02_T1>,
 <Item id=LC08_L2SP_191045_20210701_02_T1>,
 <Item id=LC08_L2SP_191044_20210701_02_T1>,
 <Item id=LC08_L2SP_191043_20210701_02_T1>,
 <Item id=LC08_L2SP_191042_20210701_02_T1>,
 <Item id=LC08_L2SP_191041_20210701_02_T1>,
 <Item id=LC08_L2SP_191040_20210701_02_T1>,
 <Item id=LC08_L2SP_191039_20210701_02_T1>,
 <Item id=LC08_L2SP_191038_20210701_02_T1>,
 ...
 <Item id=LC08_L2SP_175015_20210701_02_T1>,
 <Item id=LC08_L2SP_175014_20210701_02_T1>,
 <Item id=LC08_L2SP_175013_20210701_02_T2>,
 <Item id=LC08_L2SP_175012_20210701_02_T2>,
 <Item id=LC08_L2SP_175011_20210701_02_T2>,
 <Item id=LC08_L2SP_175010_20210701_02_T1>,
 <Item id=LC08_L2SP_175006_20210701_02_T1>,
 <Item id=LC08_L2SP_175005_20210701_02_T2>,
 <Item id=LC08_L2SP_175001_20210701_02_T1>,
 <Item id=LC08_L2SR_159248_20210701_02_T2>]
Length: 117, dtype: stac

That ItemArray can be put inside a pandas Series:

In [6]:
series = pd.Series(sa, name="stac_items")
series
Out[6]:
0      <Item id=LC08_L2SP_191047_20210701_02_T1>
1      <Item id=LC08_L2SP_191046_20210701_02_T1>
2      <Item id=LC08_L2SP_191045_20210701_02_T1>
3      <Item id=LC08_L2SP_191044_20210701_02_T1>
4      <Item id=LC08_L2SP_191043_20210701_02_T1>
                         ...                    
112    <Item id=LC08_L2SP_175010_20210701_02_T1>
113    <Item id=LC08_L2SP_175006_20210701_02_T1>
114    <Item id=LC08_L2SP_175005_20210701_02_T2>
115    <Item id=LC08_L2SP_175001_20210701_02_T1>
116    <Item id=LC08_L2SR_159248_20210701_02_T2>
Name: stac_items, Length: 117, dtype: stac

Pandas lets you register accessors. For example, we could have a stac accessor that knows how to do stuff with STAC metadata, for example adding a column for each asset in the collection.

In [7]:
rdf = series[:10].stac.with_rasters(assets=["SR_B2", "SR_B3", "SR_B4", "SR_B5"])
rdf
Out[7]:
stac_items SR_B2 SR_B3 SR_B4 SR_B5
0 <Item id=LC08_L2SP_191047_20210701_02_T1> <xarray.DataArray 'stackstac-fc899382ab42efd783bdcdbcc4a4fc36' (y: 7692, x: 7532)> dask.array<getitem, shape=(7692, 7532), dtype=float64, chunksize=(7692, 7532), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:38.868875 id <U31 'LC08_L2SP_191047_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 6.981e+05 6.981e+05 ... 9.24e+05 * y (y) float64 2.195e+06 2.195e+06 ... 1.964e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 75.25 eo:cloud_cover float64 0.0 proj:bbox object {2194815.0, 1964085.0, 698085.0, 9240... landsat:scene_id <U21 'LC81910472021182LGN00' landsat:wrs_row <U3 '047' proj:epsg int64 32631 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 698085.0, 30.0, 2194815.0} title <U14 'Blue Band (B2)' proj:shape object {7691, 7531} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32631 Attributes: spec: RasterSpec(epsg=32631, bounds=(698070.0, 1964070.0, 924030.0... crs: epsg:32631 transform: | 30.00, 0.00, 698070.00|\n| 0.00,-30.00, 2194830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-5c85a974400e995a8ff6175766c38026' (y: 7692, x: 7532)> dask.array<getitem, shape=(7692, 7532), dtype=float64, chunksize=(7692, 7532), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:38.868875 id <U31 'LC08_L2SP_191047_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 6.981e+05 6.981e+05 ... 9.24e+05 * y (y) float64 2.195e+06 2.195e+06 ... 1.964e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 75.25 eo:cloud_cover float64 0.0 proj:bbox object {2194815.0, 1964085.0, 698085.0, 9240... landsat:scene_id <U21 'LC81910472021182LGN00' landsat:wrs_row <U3 '047' proj:epsg int64 32631 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 698085.0, 30.0, 2194815.0} title <U15 'Green Band (B3)' proj:shape object {7691, 7531} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32631 Attributes: spec: RasterSpec(epsg=32631, bounds=(698070.0, 1964070.0, 924030.0... crs: epsg:32631 transform: | 30.00, 0.00, 698070.00|\n| 0.00,-30.00, 2194830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-08e49a42ef10cf8b34e2dfeb244cc091' (y: 7692, x: 7532)> dask.array<getitem, shape=(7692, 7532), dtype=float64, chunksize=(7692, 7532), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:38.868875 id <U31 'LC08_L2SP_191047_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 6.981e+05 6.981e+05 ... 9.24e+05 * y (y) float64 2.195e+06 2.195e+06 ... 1.964e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 75.25 eo:cloud_cover float64 0.0 proj:bbox object {2194815.0, 1964085.0, 698085.0, 9240... landsat:scene_id <U21 'LC81910472021182LGN00' landsat:wrs_row <U3 '047' proj:epsg int64 32631 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 698085.0, 30.0, 2194815.0} title <U13 'Red Band (B4)' proj:shape object {7691, 7531} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32631 Attributes: spec: RasterSpec(epsg=32631, bounds=(698070.0, 1964070.0, 924030.0... crs: epsg:32631 transform: | 30.00, 0.00, 698070.00|\n| 0.00,-30.00, 2194830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-864adfe712b488bab892fe09fbcc6506' (y: 7692, x: 7532)> dask.array<getitem, shape=(7692, 7532), dtype=float64, chunksize=(7692, 7532), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:38.868875 id <U31 'LC08_L2SP_191047_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 6.981e+05 6.981e+05 ... 9.24e+05 * y (y) float64 2.195e+06 2.195e+06 ... 1.964e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 75.25 eo:cloud_cover float64 0.0 proj:bbox object {2194815.0, 1964085.0, 698085.0, 9240... landsat:scene_id <U21 'LC81910472021182LGN00' landsat:wrs_row <U3 '047' proj:epsg int64 32631 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 698085.0, 30.0, 2194815.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7691, 7531} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32631 Attributes: spec: RasterSpec(epsg=32631, bounds=(698070.0, 1964070.0, 924030.0... crs: epsg:32631 transform: | 30.00, 0.00, 698070.00|\n| 0.00,-30.00, 2194830.00|\n| 0.0... resolution: 30.0
1 <Item id=LC08_L2SP_191046_20210701_02_T1> <xarray.DataArray 'stackstac-8a42345eba3fb4700ba4deed546fc45c' (y: 7852, x: 7702)> dask.array<getitem, shape=(7852, 7702), dtype=float64, chunksize=(7852, 7702), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:14.960892 id <U31 'LC08_L2SP_191046_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 1.008e+05 1.008e+05 ... 3.318e+05 * y (y) float64 2.357e+06 2.357e+06 ... 2.121e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 78.44 eo:cloud_cover float64 0.0 proj:bbox object {100785.0, 2121285.0, 2356815.0, 3318... landsat:scene_id <U21 'LC81910462021182LGN00' landsat:wrs_row <U3 '046' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.73 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 2356815.0, 100785.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7851, 7701} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(100770.0, 2121270.0, 331830.0... crs: epsg:32632 transform: | 30.00, 0.00, 100770.00|\n| 0.00,-30.00, 2356830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-5f47f46a312c4d1827e4215235c68d62' (y: 7852, x: 7702)> dask.array<getitem, shape=(7852, 7702), dtype=float64, chunksize=(7852, 7702), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:14.960892 id <U31 'LC08_L2SP_191046_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 1.008e+05 1.008e+05 ... 3.318e+05 * y (y) float64 2.357e+06 2.357e+06 ... 2.121e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 78.44 eo:cloud_cover float64 0.0 proj:bbox object {100785.0, 2121285.0, 2356815.0, 3318... landsat:scene_id <U21 'LC81910462021182LGN00' landsat:wrs_row <U3 '046' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.73 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 2356815.0, 100785.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7851, 7701} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(100770.0, 2121270.0, 331830.0... crs: epsg:32632 transform: | 30.00, 0.00, 100770.00|\n| 0.00,-30.00, 2356830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-5c4cee9afa71a08a78c166e61ae124d5' (y: 7852, x: 7702)> dask.array<getitem, shape=(7852, 7702), dtype=float64, chunksize=(7852, 7702), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:14.960892 id <U31 'LC08_L2SP_191046_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 1.008e+05 1.008e+05 ... 3.318e+05 * y (y) float64 2.357e+06 2.357e+06 ... 2.121e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 78.44 eo:cloud_cover float64 0.0 proj:bbox object {100785.0, 2121285.0, 2356815.0, 3318... landsat:scene_id <U21 'LC81910462021182LGN00' landsat:wrs_row <U3 '046' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.73 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 2356815.0, 100785.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7851, 7701} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(100770.0, 2121270.0, 331830.0... crs: epsg:32632 transform: | 30.00, 0.00, 100770.00|\n| 0.00,-30.00, 2356830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-81e90581df0d8d60e200795077d898b6' (y: 7852, x: 7702)> dask.array<getitem, shape=(7852, 7702), dtype=float64, chunksize=(7852, 7702), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:59:14.960892 id <U31 'LC08_L2SP_191046_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 1.008e+05 1.008e+05 ... 3.318e+05 * y (y) float64 2.357e+06 2.357e+06 ... 2.121e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 78.44 eo:cloud_cover float64 0.0 proj:bbox object {100785.0, 2121285.0, 2356815.0, 3318... landsat:scene_id <U21 'LC81910462021182LGN00' landsat:wrs_row <U3 '046' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 66.73 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 2356815.0, 100785.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7851, 7701} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(100770.0, 2121270.0, 331830.0... crs: epsg:32632 transform: | 30.00, 0.00, 100770.00|\n| 0.00,-30.00, 2356830.00|\n| 0.0... resolution: 30.0
2 <Item id=LC08_L2SP_191045_20210701_02_T1> <xarray.DataArray 'stackstac-8724257c02dbe962b99097a939d7e9a7' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:51.061380 id <U31 'LC08_L2SP_191045_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 1.386e+05 1.386e+05 ... 3.693e+05 * y (y) float64 2.516e+06 2.516e+06 ... 2.28e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 81.78 eo:cloud_cover float64 0.0 proj:bbox object {138585.0, 369315.0, 2280285.0, 25158... landsat:scene_id <U21 'LC81910452021182LGN00' landsat:wrs_row <U3 '045' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.2 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 2515815.0, 138585.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(138570.0, 2280270.0, 369330.0... crs: epsg:32632 transform: | 30.00, 0.00, 138570.00|\n| 0.00,-30.00, 2515830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-d9133c2983e580732339f0441cc71c32' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:51.061380 id <U31 'LC08_L2SP_191045_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 1.386e+05 1.386e+05 ... 3.693e+05 * y (y) float64 2.516e+06 2.516e+06 ... 2.28e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 81.78 eo:cloud_cover float64 0.0 proj:bbox object {138585.0, 369315.0, 2280285.0, 25158... landsat:scene_id <U21 'LC81910452021182LGN00' landsat:wrs_row <U3 '045' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.2 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 2515815.0, 138585.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(138570.0, 2280270.0, 369330.0... crs: epsg:32632 transform: | 30.00, 0.00, 138570.00|\n| 0.00,-30.00, 2515830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-32edd38d4a2258b299e94642cb6ffa0c' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:51.061380 id <U31 'LC08_L2SP_191045_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 1.386e+05 1.386e+05 ... 3.693e+05 * y (y) float64 2.516e+06 2.516e+06 ... 2.28e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 81.78 eo:cloud_cover float64 0.0 proj:bbox object {138585.0, 369315.0, 2280285.0, 25158... landsat:scene_id <U21 'LC81910452021182LGN00' landsat:wrs_row <U3 '045' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.2 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 2515815.0, 138585.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(138570.0, 2280270.0, 369330.0... crs: epsg:32632 transform: | 30.00, 0.00, 138570.00|\n| 0.00,-30.00, 2515830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-776d3cb9ecbd7cf388d0b1a215e28a44' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:51.061380 id <U31 'LC08_L2SP_191045_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 1.386e+05 1.386e+05 ... 3.693e+05 * y (y) float64 2.516e+06 2.516e+06 ... 2.28e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 81.78 eo:cloud_cover float64 0.0 proj:bbox object {138585.0, 369315.0, 2280285.0, 25158... landsat:scene_id <U21 'LC81910452021182LGN00' landsat:wrs_row <U3 '045' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.2 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 2515815.0, 138585.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(138570.0, 2280270.0, 369330.0... crs: epsg:32632 transform: | 30.00, 0.00, 138570.00|\n| 0.00,-30.00, 2515830.00|\n| 0.0... resolution: 30.0
3 <Item id=LC08_L2SP_191044_20210701_02_T1> <xarray.DataArray 'stackstac-c95f2bb77d7b3a02d1b537ae283a5a98' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:27.166104 id <U31 'LC08_L2SP_191044_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 1.761e+05 1.761e+05 ... 4.068e+05 * y (y) float64 2.675e+06 2.675e+06 ... 2.439e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 85.25 eo:cloud_cover float64 0.0 proj:bbox object {2439285.0, 2674815.0, 176085.0, 4068... landsat:scene_id <U21 'LC81910442021182LGN00' landsat:wrs_row <U3 '044' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.58 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 176085.0, 30.0, 2674815.0} title <U14 'Blue Band (B2)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(176070.0, 2439270.0, 406830.0... crs: epsg:32632 transform: | 30.00, 0.00, 176070.00|\n| 0.00,-30.00, 2674830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-5873da2a091ba0ebd1cacfef5450b856' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:27.166104 id <U31 'LC08_L2SP_191044_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 1.761e+05 1.761e+05 ... 4.068e+05 * y (y) float64 2.675e+06 2.675e+06 ... 2.439e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 85.25 eo:cloud_cover float64 0.0 proj:bbox object {2439285.0, 2674815.0, 176085.0, 4068... landsat:scene_id <U21 'LC81910442021182LGN00' landsat:wrs_row <U3 '044' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.58 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 176085.0, 30.0, 2674815.0} title <U15 'Green Band (B3)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(176070.0, 2439270.0, 406830.0... crs: epsg:32632 transform: | 30.00, 0.00, 176070.00|\n| 0.00,-30.00, 2674830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-12eced18b0ebbc26aafd5ab35f17b38d' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:27.166104 id <U31 'LC08_L2SP_191044_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 1.761e+05 1.761e+05 ... 4.068e+05 * y (y) float64 2.675e+06 2.675e+06 ... 2.439e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 85.25 eo:cloud_cover float64 0.0 proj:bbox object {2439285.0, 2674815.0, 176085.0, 4068... landsat:scene_id <U21 'LC81910442021182LGN00' landsat:wrs_row <U3 '044' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.58 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 176085.0, 30.0, 2674815.0} title <U13 'Red Band (B4)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(176070.0, 2439270.0, 406830.0... crs: epsg:32632 transform: | 30.00, 0.00, 176070.00|\n| 0.00,-30.00, 2674830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-779f02fb72cf868b0f8686e1b4d106e0' (y: 7852, x: 7692)> dask.array<getitem, shape=(7852, 7692), dtype=float64, chunksize=(7852, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:27.166104 id <U31 'LC08_L2SP_191044_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 1.761e+05 1.761e+05 ... 4.068e+05 * y (y) float64 2.675e+06 2.675e+06 ... 2.439e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 85.25 eo:cloud_cover float64 0.0 proj:bbox object {2439285.0, 2674815.0, 176085.0, 4068... landsat:scene_id <U21 'LC81910442021182LGN00' landsat:wrs_row <U3 '044' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.58 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 176085.0, 30.0, 2674815.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7691, 7851} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(176070.0, 2439270.0, 406830.0... crs: epsg:32632 transform: | 30.00, 0.00, 176070.00|\n| 0.00,-30.00, 2674830.00|\n| 0.0... resolution: 30.0
4 <Item id=LC08_L2SP_191043_20210701_02_T1> <xarray.DataArray 'stackstac-aee2154087a81c97b072ae5570f8ccf9' (y: 7842, x: 7692)> dask.array<getitem, shape=(7842, 7692), dtype=float64, chunksize=(7842, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:03.266593 id <U31 'LC08_L2SP_191043_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 2.136e+05 2.136e+05 ... 4.443e+05 * y (y) float64 2.834e+06 2.834e+06 ... 2.599e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 88.83 eo:cloud_cover float64 0.0 proj:bbox object {213585.0, 2598585.0, 444315.0, 28338... landsat:scene_id <U21 'LC81910432021182LGN00' landsat:wrs_row <U3 '043' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.89 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 213585.0, 2833815.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7841, 7691} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(213570.0, 2598570.0, 444330.0... crs: epsg:32632 transform: | 30.00, 0.00, 213570.00|\n| 0.00,-30.00, 2833830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-f2b88f57726aa477f61446e209a76e68' (y: 7842, x: 7692)> dask.array<getitem, shape=(7842, 7692), dtype=float64, chunksize=(7842, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:03.266593 id <U31 'LC08_L2SP_191043_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 2.136e+05 2.136e+05 ... 4.443e+05 * y (y) float64 2.834e+06 2.834e+06 ... 2.599e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 88.83 eo:cloud_cover float64 0.0 proj:bbox object {213585.0, 2598585.0, 444315.0, 28338... landsat:scene_id <U21 'LC81910432021182LGN00' landsat:wrs_row <U3 '043' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.89 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 213585.0, 2833815.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7841, 7691} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(213570.0, 2598570.0, 444330.0... crs: epsg:32632 transform: | 30.00, 0.00, 213570.00|\n| 0.00,-30.00, 2833830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-4f1ab9f0b5f4d834463d680fa6c81efe' (y: 7842, x: 7692)> dask.array<getitem, shape=(7842, 7692), dtype=float64, chunksize=(7842, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:03.266593 id <U31 'LC08_L2SP_191043_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 2.136e+05 2.136e+05 ... 4.443e+05 * y (y) float64 2.834e+06 2.834e+06 ... 2.599e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 88.83 eo:cloud_cover float64 0.0 proj:bbox object {213585.0, 2598585.0, 444315.0, 28338... landsat:scene_id <U21 'LC81910432021182LGN00' landsat:wrs_row <U3 '043' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.89 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 213585.0, 2833815.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7841, 7691} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(213570.0, 2598570.0, 444330.0... crs: epsg:32632 transform: | 30.00, 0.00, 213570.00|\n| 0.00,-30.00, 2833830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-0dfb36ae61ca50f8ab8e725a5fa2d295' (y: 7842, x: 7692)> dask.array<getitem, shape=(7842, 7692), dtype=float64, chunksize=(7842, 7692), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:58:03.266593 id <U31 'LC08_L2SP_191043_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 2.136e+05 2.136e+05 ... 4.443e+05 * y (y) float64 2.834e+06 2.834e+06 ... 2.599e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 88.83 eo:cloud_cover float64 0.0 proj:bbox object {213585.0, 2598585.0, 444315.0, 28338... landsat:scene_id <U21 'LC81910432021182LGN00' landsat:wrs_row <U3 '043' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 67.89 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 213585.0, 2833815.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7841, 7691} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(213570.0, 2598570.0, 444330.0... crs: epsg:32632 transform: | 30.00, 0.00, 213570.00|\n| 0.00,-30.00, 2833830.00|\n| 0.0... resolution: 30.0
5 <Item id=LC08_L2SP_191042_20210701_02_T1> <xarray.DataArray 'stackstac-c78dd0128f12097cb8c4bec3b24a1ab0' (y: 7842, x: 7682)> dask.array<getitem, shape=(7842, 7682), dtype=float64, chunksize=(7842, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:39.367080 id <U31 'LC08_L2SP_191042_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 2.511e+05 2.511e+05 ... 4.815e+05 * y (y) float64 2.993e+06 2.993e+06 ... 2.758e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 92.51 eo:cloud_cover float64 0.0 proj:bbox object {2757585.0, 481515.0, 251085.0, 29928... landsat:scene_id <U21 'LC81910422021182LGN00' landsat:wrs_row <U3 '042' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.1 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 251085.0, 2992815.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7841, 7681} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(251070.0, 2757570.0, 481530.0... crs: epsg:32632 transform: | 30.00, 0.00, 251070.00|\n| 0.00,-30.00, 2992830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-0057f69e9778dcaca3d351665741ff2b' (y: 7842, x: 7682)> dask.array<getitem, shape=(7842, 7682), dtype=float64, chunksize=(7842, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:39.367080 id <U31 'LC08_L2SP_191042_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 2.511e+05 2.511e+05 ... 4.815e+05 * y (y) float64 2.993e+06 2.993e+06 ... 2.758e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 92.51 eo:cloud_cover float64 0.0 proj:bbox object {2757585.0, 481515.0, 251085.0, 29928... landsat:scene_id <U21 'LC81910422021182LGN00' landsat:wrs_row <U3 '042' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.1 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 251085.0, 2992815.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7841, 7681} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(251070.0, 2757570.0, 481530.0... crs: epsg:32632 transform: | 30.00, 0.00, 251070.00|\n| 0.00,-30.00, 2992830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-c4b03dc7c0e06a5ab68e924c5a8d78bd' (y: 7842, x: 7682)> dask.array<getitem, shape=(7842, 7682), dtype=float64, chunksize=(7842, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:39.367080 id <U31 'LC08_L2SP_191042_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 2.511e+05 2.511e+05 ... 4.815e+05 * y (y) float64 2.993e+06 2.993e+06 ... 2.758e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 92.51 eo:cloud_cover float64 0.0 proj:bbox object {2757585.0, 481515.0, 251085.0, 29928... landsat:scene_id <U21 'LC81910422021182LGN00' landsat:wrs_row <U3 '042' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.1 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 251085.0, 2992815.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7841, 7681} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(251070.0, 2757570.0, 481530.0... crs: epsg:32632 transform: | 30.00, 0.00, 251070.00|\n| 0.00,-30.00, 2992830.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-7dd375774ee559e40060393356696962' (y: 7842, x: 7682)> dask.array<getitem, shape=(7842, 7682), dtype=float64, chunksize=(7842, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:39.367080 id <U31 'LC08_L2SP_191042_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 2.511e+05 2.511e+05 ... 4.815e+05 * y (y) float64 2.993e+06 2.993e+06 ... 2.758e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 92.51 eo:cloud_cover float64 0.0 proj:bbox object {2757585.0, 481515.0, 251085.0, 29928... landsat:scene_id <U21 'LC81910422021182LGN00' landsat:wrs_row <U3 '042' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.1 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 251085.0, 2992815.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7841, 7681} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(251070.0, 2757570.0, 481530.0... crs: epsg:32632 transform: | 30.00, 0.00, 251070.00|\n| 0.00,-30.00, 2992830.00|\n| 0.0... resolution: 30.0
6 <Item id=LC08_L2SP_191041_20210701_02_T1> <xarray.DataArray 'stackstac-12c6a5858e6575d905ff3b3dde2a73a3' (y: 7822, x: 7682)> dask.array<getitem, shape=(7822, 7682), dtype=float64, chunksize=(7822, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:15.476042 id <U31 'LC08_L2SP_191041_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 2.883e+05 2.883e+05 ... 5.187e+05 * y (y) float64 3.152e+06 3.152e+06 ... 2.917e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 96.25 eo:cloud_cover float64 0.0 proj:bbox object {2916885.0, 518715.0, 3151515.0, 2882... landsat:scene_id <U21 'LC81910412021182LGN00' landsat:wrs_row <U3 '041' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.22 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 3151515.0, 288285.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7681, 7821} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(288270.0, 2916870.0, 518730.0... crs: epsg:32632 transform: | 30.00, 0.00, 288270.00|\n| 0.00,-30.00, 3151530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-0f3f396822db9687226a25ed24edab22' (y: 7822, x: 7682)> dask.array<getitem, shape=(7822, 7682), dtype=float64, chunksize=(7822, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:15.476042 id <U31 'LC08_L2SP_191041_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 2.883e+05 2.883e+05 ... 5.187e+05 * y (y) float64 3.152e+06 3.152e+06 ... 2.917e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 96.25 eo:cloud_cover float64 0.0 proj:bbox object {2916885.0, 518715.0, 3151515.0, 2882... landsat:scene_id <U21 'LC81910412021182LGN00' landsat:wrs_row <U3 '041' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.22 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 3151515.0, 288285.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7681, 7821} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(288270.0, 2916870.0, 518730.0... crs: epsg:32632 transform: | 30.00, 0.00, 288270.00|\n| 0.00,-30.00, 3151530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-43b8148577a1f0b29538a01d52b06279' (y: 7822, x: 7682)> dask.array<getitem, shape=(7822, 7682), dtype=float64, chunksize=(7822, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:15.476042 id <U31 'LC08_L2SP_191041_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 2.883e+05 2.883e+05 ... 5.187e+05 * y (y) float64 3.152e+06 3.152e+06 ... 2.917e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 96.25 eo:cloud_cover float64 0.0 proj:bbox object {2916885.0, 518715.0, 3151515.0, 2882... landsat:scene_id <U21 'LC81910412021182LGN00' landsat:wrs_row <U3 '041' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.22 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 3151515.0, 288285.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7681, 7821} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(288270.0, 2916870.0, 518730.0... crs: epsg:32632 transform: | 30.00, 0.00, 288270.00|\n| 0.00,-30.00, 3151530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-674b72ed6a39d151ac102c37e14da25f' (y: 7822, x: 7682)> dask.array<getitem, shape=(7822, 7682), dtype=float64, chunksize=(7822, 7682), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:57:15.476042 id <U31 'LC08_L2SP_191041_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 2.883e+05 2.883e+05 ... 5.187e+05 * y (y) float64 3.152e+06 3.152e+06 ... 2.917e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 96.25 eo:cloud_cover float64 0.0 proj:bbox object {2916885.0, 518715.0, 3151515.0, 2882... landsat:scene_id <U21 'LC81910412021182LGN00' landsat:wrs_row <U3 '041' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.22 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 3151515.0, 288285.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7681, 7821} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(288270.0, 2916870.0, 518730.0... crs: epsg:32632 transform: | 30.00, 0.00, 288270.00|\n| 0.00,-30.00, 3151530.00|\n| 0.0... resolution: 30.0
7 <Item id=LC08_L2SP_191040_20210701_02_T1> <xarray.DataArray 'stackstac-71d61c0514cf114f1ff585401ddbb2a4' (y: 7822, x: 7672)> dask.array<getitem, shape=(7822, 7672), dtype=float64, chunksize=(7822, 7672), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:51.576530 id <U31 'LC08_L2SP_191040_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 3.255e+05 3.255e+05 ... 5.556e+05 * y (y) float64 3.311e+06 3.310e+06 ... 3.076e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 100.0 eo:cloud_cover float64 0.0 proj:bbox object {3310515.0, 3075885.0, 325485.0, 5556... landsat:scene_id <U21 'LC81910402021182LGN00' landsat:wrs_row <U3 '040' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.25 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 325485.0, 3310515.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7821, 7671} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(325470.0, 3075870.0, 555630.0... crs: epsg:32632 transform: | 30.00, 0.00, 325470.00|\n| 0.00,-30.00, 3310530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-6d65a60880daaaba74f620892c22e91f' (y: 7822, x: 7672)> dask.array<getitem, shape=(7822, 7672), dtype=float64, chunksize=(7822, 7672), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:51.576530 id <U31 'LC08_L2SP_191040_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 3.255e+05 3.255e+05 ... 5.556e+05 * y (y) float64 3.311e+06 3.310e+06 ... 3.076e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 100.0 eo:cloud_cover float64 0.0 proj:bbox object {3310515.0, 3075885.0, 325485.0, 5556... landsat:scene_id <U21 'LC81910402021182LGN00' landsat:wrs_row <U3 '040' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.25 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 325485.0, 3310515.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7821, 7671} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(325470.0, 3075870.0, 555630.0... crs: epsg:32632 transform: | 30.00, 0.00, 325470.00|\n| 0.00,-30.00, 3310530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-2993940444e9f01887e713183b9ef419' (y: 7822, x: 7672)> dask.array<getitem, shape=(7822, 7672), dtype=float64, chunksize=(7822, 7672), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:51.576530 id <U31 'LC08_L2SP_191040_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 3.255e+05 3.255e+05 ... 5.556e+05 * y (y) float64 3.311e+06 3.310e+06 ... 3.076e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 100.0 eo:cloud_cover float64 0.0 proj:bbox object {3310515.0, 3075885.0, 325485.0, 5556... landsat:scene_id <U21 'LC81910402021182LGN00' landsat:wrs_row <U3 '040' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.25 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 325485.0, 3310515.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7821, 7671} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(325470.0, 3075870.0, 555630.0... crs: epsg:32632 transform: | 30.00, 0.00, 325470.00|\n| 0.00,-30.00, 3310530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-e8e379e80aee09e50c6b89743436da45' (y: 7822, x: 7672)> dask.array<getitem, shape=(7822, 7672), dtype=float64, chunksize=(7822, 7672), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:51.576530 id <U31 'LC08_L2SP_191040_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 3.255e+05 3.255e+05 ... 5.556e+05 * y (y) float64 3.311e+06 3.310e+06 ... 3.076e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 100.0 eo:cloud_cover float64 0.0 proj:bbox object {3310515.0, 3075885.0, 325485.0, 5556... landsat:scene_id <U21 'LC81910402021182LGN00' landsat:wrs_row <U3 '040' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.25 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 325485.0, 3310515.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7821, 7671} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(325470.0, 3075870.0, 555630.0... crs: epsg:32632 transform: | 30.00, 0.00, 325470.00|\n| 0.00,-30.00, 3310530.00|\n| 0.0... resolution: 30.0
8 <Item id=LC08_L2SP_191039_20210701_02_T1> <xarray.DataArray 'stackstac-feb206e94068af7897b0e5cf434a15a2' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:27.681255 id <U31 'LC08_L2SP_191039_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 3.624e+05 3.624e+05 ... 5.922e+05 * y (y) float64 3.47e+06 3.47e+06 ... 3.235e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 103.8 eo:cloud_cover float64 0.0 proj:bbox object {362385.0, 3469515.0, 3235185.0, 5922... landsat:scene_id <U21 'LC81910392021182LGN00' landsat:wrs_row <U3 '039' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 3469515.0, 362385.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(362370.0, 3235170.0, 592230.0... crs: epsg:32632 transform: | 30.00, 0.00, 362370.00|\n| 0.00,-30.00, 3469530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-5a62a263739c61a969471b8f3f6d0eea' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:27.681255 id <U31 'LC08_L2SP_191039_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 3.624e+05 3.624e+05 ... 5.922e+05 * y (y) float64 3.47e+06 3.47e+06 ... 3.235e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 103.8 eo:cloud_cover float64 0.0 proj:bbox object {362385.0, 3469515.0, 3235185.0, 5922... landsat:scene_id <U21 'LC81910392021182LGN00' landsat:wrs_row <U3 '039' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 3469515.0, 362385.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(362370.0, 3235170.0, 592230.0... crs: epsg:32632 transform: | 30.00, 0.00, 362370.00|\n| 0.00,-30.00, 3469530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-27afedbbe093bd5b229c13b05ed13eb6' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:27.681255 id <U31 'LC08_L2SP_191039_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 3.624e+05 3.624e+05 ... 5.922e+05 * y (y) float64 3.47e+06 3.47e+06 ... 3.235e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 103.8 eo:cloud_cover float64 0.0 proj:bbox object {362385.0, 3469515.0, 3235185.0, 5922... landsat:scene_id <U21 'LC81910392021182LGN00' landsat:wrs_row <U3 '039' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 3469515.0, 362385.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(362370.0, 3235170.0, 592230.0... crs: epsg:32632 transform: | 30.00, 0.00, 362370.00|\n| 0.00,-30.00, 3469530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-a1edefbd6ae5b411b0e5f6e65c3effb3' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:27.681255 id <U31 'LC08_L2SP_191039_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 3.624e+05 3.624e+05 ... 5.922e+05 * y (y) float64 3.47e+06 3.47e+06 ... 3.235e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 103.8 eo:cloud_cover float64 0.0 proj:bbox object {362385.0, 3469515.0, 3235185.0, 5922... landsat:scene_id <U21 'LC81910392021182LGN00' landsat:wrs_row <U3 '039' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.19 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 3469515.0, 362385.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(362370.0, 3235170.0, 592230.0... crs: epsg:32632 transform: | 30.00, 0.00, 362370.00|\n| 0.00,-30.00, 3469530.00|\n| 0.0... resolution: 30.0
9 <Item id=LC08_L2SP_191038_20210701_02_T1> <xarray.DataArray 'stackstac-1f89dd2ab7603e7ffcb824ee2487e000' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:03.794451 id <U31 'LC08_L2SP_191038_20210701_02_T1' band <U5 'SR_B2' * x (x) float64 3.99e+05 3.99e+05 ... 6.288e+05 * y (y) float64 3.629e+06 3.628e+06 ... 3.394e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 107.6 eo:cloud_cover float64 0.0 proj:bbox object {398985.0, 3394185.0, 3628515.0, 6288... landsat:scene_id <U21 'LC81910382021182LGN00' landsat:wrs_row <U3 '038' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.03 platform <U9 'landsat-8' view:off_nadir int64 0 description <U55 'Collection 2 Level-2 Blue Band (B2) Su... proj:transform object {0.0, -30.0, 3628515.0, 398985.0, 30.0} title <U14 'Blue Band (B2)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U4 'blue' center_wavelength float64 0.48 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(398970.0, 3394170.0, 628830.0... crs: epsg:32632 transform: | 30.00, 0.00, 398970.00|\n| 0.00,-30.00, 3628530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-cc617421bc61d9a7e8bfcce8abe4d178' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:03.794451 id <U31 'LC08_L2SP_191038_20210701_02_T1' band <U5 'SR_B3' * x (x) float64 3.99e+05 3.99e+05 ... 6.288e+05 * y (y) float64 3.629e+06 3.628e+06 ... 3.394e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 107.6 eo:cloud_cover float64 0.0 proj:bbox object {398985.0, 3394185.0, 3628515.0, 6288... landsat:scene_id <U21 'LC81910382021182LGN00' landsat:wrs_row <U3 '038' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.03 platform <U9 'landsat-8' view:off_nadir int64 0 description <U56 'Collection 2 Level-2 Green Band (B3) S... proj:transform object {0.0, -30.0, 3628515.0, 398985.0, 30.0} title <U15 'Green Band (B3)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U5 'green' center_wavelength float64 0.56 full_width_half_max float64 0.06 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(398970.0, 3394170.0, 628830.0... crs: epsg:32632 transform: | 30.00, 0.00, 398970.00|\n| 0.00,-30.00, 3628530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-d87c82314f6409e6f44597937be3c2e3' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:03.794451 id <U31 'LC08_L2SP_191038_20210701_02_T1' band <U5 'SR_B4' * x (x) float64 3.99e+05 3.99e+05 ... 6.288e+05 * y (y) float64 3.629e+06 3.628e+06 ... 3.394e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 107.6 eo:cloud_cover float64 0.0 proj:bbox object {398985.0, 3394185.0, 3628515.0, 6288... landsat:scene_id <U21 'LC81910382021182LGN00' landsat:wrs_row <U3 '038' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.03 platform <U9 'landsat-8' view:off_nadir int64 0 description <U54 'Collection 2 Level-2 Red Band (B4) Sur... proj:transform object {0.0, -30.0, 3628515.0, 398985.0, 30.0} title <U13 'Red Band (B4)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U3 'red' center_wavelength float64 0.65 full_width_half_max float64 0.04 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(398970.0, 3394170.0, 628830.0... crs: epsg:32632 transform: | 30.00, 0.00, 398970.00|\n| 0.00,-30.00, 3628530.00|\n| 0.0... resolution: 30.0 <xarray.DataArray 'stackstac-94483d671a2463806bef91626e7e8725' (y: 7812, x: 7662)> dask.array<getitem, shape=(7812, 7662), dtype=float64, chunksize=(7812, 7662), chunktype=numpy.ndarray> Coordinates: time datetime64[ns] 2021-07-01T09:56:03.794451 id <U31 'LC08_L2SP_191038_20210701_02_T1' band <U5 'SR_B5' * x (x) float64 3.99e+05 3.99e+05 ... 6.288e+05 * y (y) float64 3.629e+06 3.628e+06 ... 3.394e+06 landsat:processing_level <U4 'L2SP' view:sun_azimuth float64 107.6 eo:cloud_cover float64 0.0 proj:bbox object {398985.0, 3394185.0, 3628515.0, 6288... landsat:scene_id <U21 'LC81910382021182LGN00' landsat:wrs_row <U3 '038' proj:epsg int64 32632 landsat:wrs_path <U3 '191' landsat:collection_category <U2 'T1' instruments object {'tirs', 'oli'} landsat:cloud_cover_land float64 0.0 landsat:collection_number <U2 '02' landsat:wrs_type <U1 '2' view:sun_elevation float64 68.03 platform <U9 'landsat-8' view:off_nadir int64 0 description <U68 'Collection 2 Level-2 Near Infrared Ban... proj:transform object {0.0, -30.0, 3628515.0, 398985.0, 30.0} title <U27 'Near Infrared Band 0.8 (B5)' proj:shape object {7811, 7661} gsd float64 30.0 common_name <U5 'nir08' center_wavelength float64 0.86 full_width_half_max float64 0.03 epsg int64 32632 Attributes: spec: RasterSpec(epsg=32632, bounds=(398970.0, 3394170.0, 628830.0... crs: epsg:32632 transform: | 30.00, 0.00, 398970.00|\n| 0.00,-30.00, 3628530.00|\n| 0.0... resolution: 30.0

Now things are getting more interesting! The repr is a bit messy, but this new DataFrame has a column for each of the blue, green, red, and nir bands. Each of those is a column of rasters. And each raster is just an xarray.DataArray!

In [8]:
rdf.iloc[1, 1]
Out[8]:
<xarray.DataArray 'stackstac-8a42345eba3fb4700ba4deed546fc45c' (y: 7852, x: 7702)>
dask.array<getitem, shape=(7852, 7702), dtype=float64, chunksize=(7852, 7702), chunktype=numpy.ndarray>
Coordinates:
    time                         datetime64[ns] 2021-07-01T09:59:14.960892
    id                           <U31 'LC08_L2SP_191046_20210701_02_T1'
    band                         <U5 'SR_B2'
  * x                            (x) float64 1.008e+05 1.008e+05 ... 3.318e+05
  * y                            (y) float64 2.357e+06 2.357e+06 ... 2.121e+06
    landsat:processing_level     <U4 'L2SP'
    view:sun_azimuth             float64 78.44
    eo:cloud_cover               float64 0.0
    proj:bbox                    object {100785.0, 2121285.0, 2356815.0, 3318...
    landsat:scene_id             <U21 'LC81910462021182LGN00'
    landsat:wrs_row              <U3 '046'
    proj:epsg                    int64 32632
    landsat:wrs_path             <U3 '191'
    landsat:collection_category  <U2 'T1'
    instruments                  object {'tirs', 'oli'}
    landsat:cloud_cover_land     float64 0.0
    landsat:collection_number    <U2 '02'
    landsat:wrs_type             <U1 '2'
    view:sun_elevation           float64 66.73
    platform                     <U9 'landsat-8'
    view:off_nadir               int64 0
    description                  <U55 'Collection 2 Level-2 Blue Band (B2) Su...
    proj:transform               object {0.0, -30.0, 2356815.0, 100785.0, 30.0}
    title                        <U14 'Blue Band (B2)'
    proj:shape                   object {7851, 7701}
    gsd                          float64 30.0
    common_name                  <U4 'blue'
    center_wavelength            float64 0.48
    full_width_half_max          float64 0.06
    epsg                         int64 32632
Attributes:
    spec:        RasterSpec(epsg=32632, bounds=(100770.0, 2121270.0, 331830.0...
    crs:         epsg:32632
    transform:   | 30.00, 0.00, 100770.00|\n| 0.00,-30.00, 2356830.00|\n| 0.0...
    resolution:  30.0

And we can have fun with operations. For example, computing NDVI on two columns:

In [9]:
ndvi = rdf.raster.ndvi("SR_B4", "SR_B5")
type(ndvi)
Out[9]:
pandas.core.series.Series

That returned a pandas Series. Each element is again a raster:

In [10]:
ndvi.iloc[0]
Out[10]:
<xarray.DataArray 'ndvi' (y: 7692, x: 7532)>
dask.array<_normalized_ratio_cpu, shape=(7692, 7532), dtype=float64, chunksize=(7692, 7532), chunktype=numpy.ndarray>
Coordinates:
    time                         datetime64[ns] 2021-07-01T09:59:38.868875
    id                           <U31 'LC08_L2SP_191047_20210701_02_T1'
    band                         <U5 'SR_B4'
  * x                            (x) float64 6.981e+05 6.981e+05 ... 9.24e+05
  * y                            (y) float64 2.195e+06 2.195e+06 ... 1.964e+06
    landsat:processing_level     <U4 'L2SP'
    view:sun_azimuth             float64 75.25
    eo:cloud_cover               float64 0.0
    proj:bbox                    object {2194815.0, 1964085.0, 698085.0, 9240...
    landsat:scene_id             <U21 'LC81910472021182LGN00'
    landsat:wrs_row              <U3 '047'
    proj:epsg                    int64 32631
    landsat:wrs_path             <U3 '191'
    landsat:collection_category  <U2 'T1'
    instruments                  object {'tirs', 'oli'}
    landsat:cloud_cover_land     float64 0.0
    landsat:collection_number    <U2 '02'
    landsat:wrs_type             <U1 '2'
    view:sun_elevation           float64 66.19
    platform                     <U9 'landsat-8'
    view:off_nadir               int64 0
    description                  <U54 'Collection 2 Level-2 Red Band (B4) Sur...
    proj:transform               object {0.0, -30.0, 698085.0, 30.0, 2194815.0}
    title                        <U13 'Red Band (B4)'
    proj:shape                   object {7691, 7531}
    gsd                          float64 30.0
    common_name                  <U3 'red'
    center_wavelength            float64 0.65
    full_width_half_max          float64 0.04
    epsg                         int64 32631
Attributes:
    spec:        RasterSpec(epsg=32631, bounds=(698070.0, 1964070.0, 924030.0...
    crs:         epsg:32631
    transform:   | 30.00, 0.00, 698070.00|\n| 0.00,-30.00, 2194830.00|\n| 0.0...
    resolution:  30.0

So that's the prototype. It's a fun demonstration of pandas' extension arrays. Is it useful? Maybe. The Spark / Scala world have found that model useful, as implemented by rasterframes. We have xarray, which lowers the need for something like this. We could also use lists of DataArrays, but the DataFrame concept is pretty handy, so I think this might still be useful.

Anyway, if you all have thoughts on whether something like this seems useful, or if you have workflows for similar kinds of data then I'd love to hear your feedback.