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.
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
This type of data can be represented as an xarray DataArray. But it's not the most efficient way to store the data:
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
<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
|
array(['2021-07-01T08:02:03.442471000', '2021-07-01T08:02:27.316566000', '2021-07-01T08:04:02.423237000', '2021-07-01T08:04:26.343928000', '2021-07-01T08:06:01.946211000', '2021-07-01T08:06:25.833014000', '2021-07-01T08:06:49.724054000', '2021-07-01T08:07:13.610858000', '2021-07-01T08:07:37.493425000', '2021-07-01T08:08:01.380229000', '2021-07-01T08:08:25.262797000', '2021-07-01T08:08:49.141127000', '2021-07-01T08:09:13.027931000', '2021-07-01T08:09:36.906263000', '2021-07-01T08:10:00.788831000', '2021-07-01T08:10:24.675635000', '2021-07-01T08:10:48.558202000', '2021-07-01T08:11:12.445006000', '2021-07-01T08:11:36.323337000', '2021-07-01T08:12:00.205905000', '2021-07-01T08:12:24.092708000', '2021-07-01T08:12:47.979512000', '2021-07-01T08:13:11.862080000', '2021-07-01T08:13:35.748883000', '2021-07-01T08:13:59.631451000', '2021-07-01T08:14:23.518255000', '2021-07-01T08:14:47.409294000', '2021-07-01T08:15:11.296098000', '2021-07-01T08:15:35.187137000', '2021-07-01T08:15:59.069705000', '2021-07-01T08:16:22.964980000', '2021-07-01T08:16:46.856020000', '2021-07-01T08:17:10.747059000', '2021-07-01T08:17:34.638099000', '2021-07-01T08:17:58.537611000', '2021-07-01T08:18:22.428650000', '2021-07-01T08:18:46.328162000', '2021-07-01T08:19:10.219202000', '2021-07-01T08:19:34.118713000', '2021-07-01T08:19:58.018225000', '2021-07-01T08:20:21.921972000', '2021-07-01T08:20:45.821484000', '2021-07-01T08:21:09.729467000', '2021-07-01T08:21:33.633215000', '2021-07-01T08:21:57.532725000', '2021-07-01T08:22:21.444945000', '2021-07-01T08:22:45.348694000', '2021-07-01T08:23:09.256677000', '2021-07-01T08:23:33.168897000', '2021-07-01T08:23:57.081116000', '2021-07-01T08:24:20.993336000', '2021-07-01T08:24:44.905556000', '2021-07-01T08:25:08.826247000', '2021-07-01T08:25:32.738467000', '2021-07-01T08:25:56.663394000', '2021-07-01T08:26:20.584085000', '2021-07-01T08:26:44.500541000', '2021-07-01T08:27:08.429705000', '2021-07-01T08:27:32.354633000', '2021-07-01T08:27:56.275324000', '2021-07-01T08:28:20.200251000', '2021-07-01T08:28:44.133651000', '2021-07-01T08:29:08.067050000', '2021-07-01T08:29:32.000450000', '2021-07-01T08:29:55.933849000', '2021-07-01T08:30:19.867249000', '2021-07-01T08:30:43.800648000', '2021-07-01T08:31:07.738284000', '2021-07-01T08:31:31.680156000', '2021-07-01T08:31:55.626264000', '2021-07-01T08:32:19.568135000', '2021-07-01T08:32:43.505771000', '2021-07-01T08:33:07.451878000', '2021-07-01T08:33:31.406458000', '2021-07-01T08:33:55.348330000', '2021-07-01T08:34:19.307145000', '2021-07-01T08:34:43.253253000', '2021-07-01T08:35:07.207832000', '2021-07-01T08:35:31.162411000', '2021-07-01T09:44:54.985130000', '2021-07-01T09:45:18.867698000', '2021-07-01T09:45:42.758737000', '2021-07-01T09:46:06.649776000', '2021-07-01T09:46:30.536581000', '2021-07-01T09:46:54.414912000', '2021-07-01T09:47:18.297480000', '2021-07-01T09:47:42.184284000', '2021-07-01T09:48:06.071087000', '2021-07-01T09:48:29.953655000', '2021-07-01T09:48:53.836221000', '2021-07-01T09:49:17.714554000', '2021-07-01T09:49:41.597122000', '2021-07-01T09:50:05.483925000', '2021-07-01T09:50:29.366493000', '2021-07-01T09:50:53.253296000', '2021-07-01T09:51:17.131628000', '2021-07-01T09:51:41.018432000', '2021-07-01T09:52:04.905234000', '2021-07-01T09:52:28.792039000', '2021-07-01T09:52:52.678841000', '2021-07-01T09:53:16.561410000', '2021-07-01T09:53:40.448213000', '2021-07-01T09:54:04.339252000', '2021-07-01T09:54:28.230293000', '2021-07-01T09:54:52.117095000', '2021-07-01T09:55:16.003899000', '2021-07-01T09:55:39.899174000', '2021-07-01T09:56:03.794451000', '2021-07-01T09:56:27.681255000', '2021-07-01T09:56:51.576530000', '2021-07-01T09:57:15.476042000', '2021-07-01T09:57:39.367080000', '2021-07-01T09:58:03.266593000', '2021-07-01T09:58:27.166104000', '2021-07-01T09:58:51.061380000', '2021-07-01T09:59:14.960892000', '2021-07-01T09:59:38.868875000'], dtype='datetime64[ns]')
array(['LC08_L2SR_159248_20210701_02_T2', 'LC08_L2SP_175001_20210701_02_T1', 'LC08_L2SP_175005_20210701_02_T2', 'LC08_L2SP_175006_20210701_02_T1', 'LC08_L2SP_175010_20210701_02_T1', 'LC08_L2SP_175011_20210701_02_T2', 'LC08_L2SP_175012_20210701_02_T2', 'LC08_L2SP_175013_20210701_02_T2', 'LC08_L2SP_175014_20210701_02_T1', 'LC08_L2SP_175015_20210701_02_T1', 'LC08_L2SP_175016_20210701_02_T2', 'LC08_L2SP_175017_20210701_02_T2', 'LC08_L2SP_175018_20210701_02_T2', 'LC08_L2SP_175019_20210701_02_T1', 'LC08_L2SP_175020_20210701_02_T1', 'LC08_L2SP_175021_20210701_02_T1', 'LC08_L2SP_175022_20210701_02_T2', 'LC08_L2SP_175023_20210701_02_T2', 'LC08_L2SP_175024_20210701_02_T1', 'LC08_L2SP_175025_20210701_02_T1', ... 'LC08_L2SP_191028_20210701_02_T1', 'LC08_L2SP_191029_20210701_02_T1', 'LC08_L2SP_191030_20210701_02_T1', 'LC08_L2SP_191031_20210701_02_T1', 'LC08_L2SP_191032_20210701_02_T2', 'LC08_L2SP_191033_20210701_02_T2', 'LC08_L2SP_191034_20210701_02_T1', 'LC08_L2SP_191035_20210701_02_T1', 'LC08_L2SP_191036_20210701_02_T1', 'LC08_L2SP_191037_20210701_02_T1', 'LC08_L2SP_191038_20210701_02_T1', 'LC08_L2SP_191039_20210701_02_T1', 'LC08_L2SP_191040_20210701_02_T1', 'LC08_L2SP_191041_20210701_02_T1', 'LC08_L2SP_191042_20210701_02_T1', 'LC08_L2SP_191043_20210701_02_T1', 'LC08_L2SP_191044_20210701_02_T1', 'LC08_L2SP_191045_20210701_02_T1', 'LC08_L2SP_191046_20210701_02_T1', 'LC08_L2SP_191047_20210701_02_T1'], dtype='<U31')
array(['SR_B2', 'SR_B3', 'SR_B4', 'SR_B5'], dtype='<U5')
array([-996810., -996780., -996750., ..., 3679770., 3679800., 3679830.])
array([ 10314570., 10314540., 10314510., ..., -13768020., -13768050., -13768080.])
array(['L2SR', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP', 'L2SP'], dtype='<U4')
array([225.56351639, 216.8111434 , 192.25006213, 188.09170474, 175.83649148, 173.4633763 , 171.25597006, 169.17739819, 167.19635144, 165.28614307, 163.42485365, 161.59279386, 159.77186381, 157.94742576, 156.10397153, 154.22805918, 152.30726829, 150.32844802, 148.28084145, 146.15152456, 143.92912045, 141.60327138, 139.16412278, 136.60143644, 133.90841905, 131.07773638, 128.1054218 , 124.99176002, 121.73822781, 118.35372415, 114.84678362, 111.23640531, 107.54346504, 103.79361763, 100.01426509, 96.23911201, 92.49685279, 88.82006589, 85.23371788, 81.76265251, 78.42566951, 75.23822728, 72.2084063 , 69.34313987, 66.64409132, 64.10806676, 61.73348749, 59.51344526, 57.44123357, 55.50979826, 53.71117576, 52.03729884, 50.47968046, 49.03181677, 47.68504189, 46.43353007, 45.27065726, 44.18966417, 43.18575189, 42.25380343, 41.38877064, 40.58623868, 39.84262104, 39.15431139, 38.51814383, 37.93115236, 37.39066704, 36.89427608, 36.43985802, 36.02551712, 35.64973779, 35.3109793 , 35.00784868, 34.73917824, 34.50433278, 34.3022312 , 34.1325666 , 33.99470438, 33.88839339, 175.83562364, 173.46281495, 171.25523515, 169.17616446, 167.19469877, 165.28513413, 163.42377697, 161.59107194, 159.77015049, 157.94544565, 156.102083 , 154.226915 , 152.30630748, 150.3276752 , 148.27991261, 146.15049723, 143.92918372, 141.60374855, 139.16456406, 136.60239709, 133.90943455, 131.07982581, 128.10873267, 124.99530159, 121.74258512, 118.35833856, 114.85353981, 111.24350392, 107.55082552, 103.80252387, 100.02471598, 96.24898878, 92.50873143, 88.83125817, 85.24532743, 81.77530906, 78.4390361 , 75.25068107])
array([2.221e+01, 7.431e+01, 9.649e+01, 8.095e+01, 5.300e+01, 7.075e+01, 9.254e+01, 9.942e+01, 9.109e+01, 7.165e+01, 9.996e+01, 9.997e+01, 9.238e+01, 8.312e+01, 7.735e+01, 7.250e+01, 1.357e+01, 9.010e+01, 6.922e+01, 1.709e+01, 1.775e+01, 2.818e+01, 3.520e+00, 1.000e-01, 0.000e+00, 1.193e+01, 1.904e+01, 4.000e-02, 3.740e+00, 3.250e+00, 1.800e+00, 2.100e+00, 2.160e+00, 0.000e+00, 3.000e-02, 2.400e-01, 7.000e-02, 3.600e-01, 2.560e+00, 8.900e-01, 9.700e-01, 2.170e+00, 3.150e+00, 9.230e+00, 3.510e+00, 5.860e+00, 5.489e+01, 8.813e+01, 8.916e+01, 8.783e+01, 5.600e+01, 3.129e+01, 1.357e+01, 2.043e+01, 3.508e+01, 4.199e+01, 1.078e+01, 1.330e+00, 1.140e+00, 1.110e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 4.970e+00, 2.000e-02, 0.000e+00, 2.100e-01, 2.300e-01, 3.549e+01, 7.297e+01, 4.684e+01, 5.753e+01, 3.794e+01, 2.220e+01, 1.940e+00, 5.700e-01, 6.600e-01, 3.300e-01, 1.900e-01, 1.000e-02, 1.990e+00, 2.436e+01, 5.337e+01, 7.990e+00, 8.287e+01, 9.318e+01, 7.102e+01, 7.535e+01, 8.924e+01, 9.991e+01, 6.599e+01, 4.570e+00, 1.865e+01, 1.022e+01, 2.256e+01, 1.340e+01, 1.390e+00, 1.588e+01, 1.913e+01, 3.330e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00])
array(['LC81592482021182LGN00', 'LC81750012021182LGN00', 'LC81750052021182LGN00', 'LC81750062021182LGN00', 'LC81750102021182LGN00', 'LC81750112021182LGN00', 'LC81750122021182LGN00', 'LC81750132021182LGN00', 'LC81750142021182LGN00', 'LC81750152021182LGN00', 'LC81750162021182LGN00', 'LC81750172021182LGN00', 'LC81750182021182LGN00', 'LC81750192021182LGN00', 'LC81750202021182LGN00', 'LC81750212021182LGN00', 'LC81750222021182LGN00', 'LC81750232021182LGN00', 'LC81750242021182LGN00', 'LC81750252021182LGN00', 'LC81750262021182LGN00', 'LC81750272021182LGN00', 'LC81750282021182LGN00', 'LC81750292021182LGN00', 'LC81750302021182LGN00', 'LC81750312021182LGN00', 'LC81750322021182LGN00', 'LC81750332021182LGN00', 'LC81750342021182LGN00', 'LC81750352021182LGN00', 'LC81750362021182LGN00', 'LC81750372021182LGN00', 'LC81750382021182LGN00', 'LC81750392021182LGN00', 'LC81750402021182LGN00', 'LC81750412021182LGN00', 'LC81750422021182LGN00', 'LC81750432021182LGN00', 'LC81750442021182LGN00', 'LC81750452021182LGN00', ... 'LC81750842021182LGN00', 'LC81910102021182LGN00', 'LC81910112021182LGN00', 'LC81910122021182LGN00', 'LC81910132021182LGN00', 'LC81910142021182LGN00', 'LC81910152021182LGN00', 'LC81910162021182LGN00', 'LC81910172021182LGN00', 'LC81910182021182LGN00', 'LC81910192021182LGN00', 'LC81910202021182LGN00', 'LC81910212021182LGN00', 'LC81910222021182LGN00', 'LC81910232021182LGN00', 'LC81910242021182LGN00', 'LC81910252021182LGN00', 'LC81910262021182LGN00', 'LC81910272021182LGN00', 'LC81910282021182LGN00', 'LC81910292021182LGN00', 'LC81910302021182LGN00', 'LC81910312021182LGN00', 'LC81910322021182LGN00', 'LC81910332021182LGN00', 'LC81910342021182LGN00', 'LC81910352021182LGN00', 'LC81910362021182LGN00', 'LC81910372021182LGN00', 'LC81910382021182LGN00', 'LC81910392021182LGN00', 'LC81910402021182LGN00', 'LC81910412021182LGN00', 'LC81910422021182LGN00', 'LC81910432021182LGN00', 'LC81910442021182LGN00', 'LC81910452021182LGN00', 'LC81910462021182LGN00', 'LC81910472021182LGN00'], dtype='<U21')
array(['248', '001', '005', '006', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019', '020', '021', '022', '023', '024', '025', '026', '027', '028', '029', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '040', '041', '042', '043', '044', '045', '046', '047', '048', '049', '050', '051', '052', '053', '054', '055', '056', '057', '058', '059', '060', '061', '062', '063', '064', '065', '066', '067', '068', '069', '070', '071', '072', '073', '074', '075', '076', '077', '078', '079', '080', '081', '082', '083', '084', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019', '020', '021', '022', '023', '024', '025', '026', '027', '028', '029', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '040', '041', '042', '043', '044', '045', '046', '047'], dtype='<U3')
array([32648, 32646, 32642, 32642, 32640, 32640, 32639, 32639, 32639, 32639, 32638, 32638, 32638, 32638, 32638, 32638, 32637, 32637, 32637, 32637, 32637, 32637, 32637, 32637, 32637, 32637, 32637, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32636, 32635, 32635, 32635, 32635, 32635, 32635, 32635, 32635, 32635, 32635, 32635, 32735, 32735, 32735, 32735, 32735, 32735, 32735, 32735, 32735, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32734, 32636, 32635, 32635, 32635, 32635, 32634, 32634, 32634, 32634, 32634, 32634, 32633, 32633, 32633, 32633, 32633, 32633, 32633, 32633, 32633, 32633, 32633, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32632, 32631])
array(['159', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '175', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191', '191'], dtype='<U3')
array(['T2', 'T1', 'T2', 'T1', 'T1', 'T2', 'T2', 'T2', 'T1', 'T1', 'T2', 'T2', 'T2', 'T1', 'T1', 'T1', 'T2', 'T2', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T2', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T2', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T2', 'T2', 'T2', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T2', 'T2', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T1'], dtype='<U2')
array({'tirs', 'oli'}, dtype=object)
array([-1.000e+00, 8.055e+01, 7.941e+01, 6.944e+01, 7.039e+01, 8.309e+01, 9.987e+01, 9.942e+01, 9.109e+01, 7.165e+01, 9.996e+01, 9.997e+01, 9.238e+01, 8.312e+01, 7.735e+01, 7.250e+01, 1.357e+01, 9.010e+01, 6.922e+01, 1.709e+01, 1.775e+01, 2.923e+01, 4.460e+00, 2.300e-01, -1.000e+00, 4.353e+01, 1.904e+01, 4.000e-02, 3.000e-01, 1.050e+00, 1.000e-02, 1.340e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 7.000e-02, 3.600e-01, 2.560e+00, 8.900e-01, 9.700e-01, 2.170e+00, 3.150e+00, 9.230e+00, 3.510e+00, 5.860e+00, 5.489e+01, 8.813e+01, 8.916e+01, 8.783e+01, 5.600e+01, 3.129e+01, 1.357e+01, 2.043e+01, 3.508e+01, 4.199e+01, 1.078e+01, 1.330e+00, 1.140e+00, 1.110e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 4.970e+00, 2.000e-02, 0.000e+00, 2.100e-01, 2.300e-01, 3.549e+01, 7.456e+01, 4.732e+01, 7.157e+01, 1.813e+01, 1.895e+01, 1.940e+00, 5.700e-01, 9.900e-01, 6.700e-01, 2.400e-01, 1.000e-02, 2.110e+00, 1.760e+01, 2.787e+01, -1.000e+00, 8.761e+01, 9.318e+01, 7.102e+01, 7.535e+01, 8.924e+01, 9.991e+01, 7.415e+01, 5.520e+00, 2.027e+01, 4.850e+00, 2.340e+00, -1.000e+00, 8.600e-01, 2.200e-01, 2.700e-01, 1.000e-02, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00])
array('02', dtype='<U2')
array('2', dtype='<U1')
array([29.31835888, 30.62208007, 35.77366997, 37.05705174, 42.12335454, 43.37071913, 44.60962619, 45.83876459, 47.05734176, 48.26485506, 49.45971106, 50.64077513, 51.80735886, 52.95712873, 54.08910127, 55.20140704, 56.29156744, 57.35775132, 58.39694566, 59.40672318, 60.38407736, 61.32541207, 62.22680438, 63.08439701, 63.89359502, 64.64988163, 65.34831505, 65.98343383, 66.55021822, 67.04329002, 67.45813127, 67.78987716, 68.03479505, 68.18988572, 68.25310604, 68.22361637, 68.10165164, 67.88879317, 67.58747642, 67.20109192, 66.7338396 , 66.19064914, 65.5761968 , 64.89603578, 64.15539898, 63.35873609, 62.51164936, 61.61821113, 60.68265941, 59.70907265, 58.70100929, 57.66179913, 56.59391236, 55.50085 , 54.3840535 , 53.2464226 , 52.08995585, 50.91553838, 49.72565896, 48.52166969, 47.30444314, 46.07496356, 44.83462186, 43.58445091, 42.3252689 , 41.0578405 , 39.78292729, 38.50087956, 37.21235083, 35.91784016, 34.61830207, 33.31422047, 32.00527952, 30.6918999 , 29.37557195, 28.05499804, 26.73211898, 25.40604185, 24.07749781, 42.11860464, 43.36570572, 44.60455529, 45.83386348, 47.05257448, 48.25959975, 49.45441313, 50.63583125, 51.80234193, 52.95226505, 54.08418969, 55.19603399, 56.28614827, 57.35229751, 58.39160043, 59.40154302, 60.37849639, 61.31982878, 62.22133135, 63.07893062, 63.88824952, 64.64441477, 65.34272454, 65.97802479, 66.54486151, 67.03810912, 67.45292955, 67.78486769, 68.02998169, 68.18524812, 68.24864115, 68.21938198, 68.09769134, 67.88502609, 67.58391906, 67.19788547, 66.73103054, 66.18791145])
array('landsat-8', dtype='<U9')
array(0)
array(['Collection 2 Level-2 Blue Band (B2) Surface Reflectance', 'Collection 2 Level-2 Green Band (B3) Surface Reflectance', 'Collection 2 Level-2 Red Band (B4) Surface Reflectance', 'Collection 2 Level-2 Near Infrared Band 0.8 (B5) Surface Reflectance'], dtype='<U68')
array(['Blue Band (B2)', 'Green Band (B3)', 'Red Band (B4)', 'Near Infrared Band 0.8 (B5)'], dtype='<U27')
array(30.)
array(['blue', 'green', 'red', 'nir08'], dtype='<U5')
array([0.48, 0.56, 0.65, 0.86])
array([None, 0.06, 0.04, 0.03], dtype=object)
array(32631)
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"
ds2 = stackstac.mosaic(ds)
ds2
<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
|
array(['SR_B2', 'SR_B3', 'SR_B4', 'SR_B5'], dtype='<U5')
array([-996810., -996780., -996750., ..., 3679770., 3679800., 3679830.])
array([ 10314570., 10314540., 10314510., ..., -13768020., -13768050., -13768080.])
array({'tirs', 'oli'}, dtype=object)
array('02', dtype='<U2')
array('2', dtype='<U1')
array('landsat-8', dtype='<U9')
array(0)
array(['Collection 2 Level-2 Blue Band (B2) Surface Reflectance', 'Collection 2 Level-2 Green Band (B3) Surface Reflectance', 'Collection 2 Level-2 Red Band (B4) Surface Reflectance', 'Collection 2 Level-2 Near Infrared Band 0.8 (B5) Surface Reflectance'], dtype='<U68')
array(['Blue Band (B2)', 'Green Band (B3)', 'Red Band (B4)', 'Near Infrared Band 0.8 (B5)'], dtype='<U27')
array(30.)
array(['blue', 'green', 'red', 'nir08'], dtype='<U5')
array([0.48, 0.56, 0.65, 0.86])
array([None, 0.06, 0.04, 0.03], dtype=object)
array(32631)
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.
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
]))
'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".
import rasterpandas
sa = rasterpandas.ItemArray(items)
sa
<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:
series = pd.Series(sa, name="stac_items")
series
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.
rdf = series[:10].stac.with_rasters(assets=["SR_B2", "SR_B3", "SR_B4", "SR_B5"])
rdf
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!
rdf.iloc[1, 1]
<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
|
array('2021-07-01T09:59:14.960892000', dtype='datetime64[ns]')
array('LC08_L2SP_191046_20210701_02_T1', dtype='<U31')
array('SR_B2', dtype='<U5')
array([100770., 100800., 100830., ..., 331740., 331770., 331800.])
array([2356830., 2356800., 2356770., ..., 2121360., 2121330., 2121300.])
array('L2SP', dtype='<U4')
array(78.4390361)
array(0.)
array({100785.0, 2121285.0, 2356815.0, 331815.0}, dtype=object)
array('LC81910462021182LGN00', dtype='<U21')
array('046', dtype='<U3')
array(32632)
array('191', dtype='<U3')
array('T1', dtype='<U2')
array({'tirs', 'oli'}, dtype=object)
array(0.)
array('02', dtype='<U2')
array('2', dtype='<U1')
array(66.73103054)
array('landsat-8', dtype='<U9')
array(0)
array('Collection 2 Level-2 Blue Band (B2) Surface Reflectance', dtype='<U55')
array({0.0, -30.0, 2356815.0, 100785.0, 30.0}, dtype=object)
array('Blue Band (B2)', dtype='<U14')
array({7851, 7701}, dtype=object)
array(30.)
array('blue', dtype='<U4')
array(0.48)
array(0.06)
array(32632)
And we can have fun with operations. For example, computing NDVI on two columns:
ndvi = rdf.raster.ndvi("SR_B4", "SR_B5")
type(ndvi)
pandas.core.series.Series
That returned a pandas Series. Each element is again a raster:
ndvi.iloc[0]
<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
|
array('2021-07-01T09:59:38.868875000', dtype='datetime64[ns]')
array('LC08_L2SP_191047_20210701_02_T1', dtype='<U31')
array('SR_B4', dtype='<U5')
array([698070., 698100., 698130., ..., 923940., 923970., 924000.])
array([2194830., 2194800., 2194770., ..., 1964160., 1964130., 1964100.])
array('L2SP', dtype='<U4')
array(75.25068107)
array(0.)
array({2194815.0, 1964085.0, 698085.0, 924015.0}, dtype=object)
array('LC81910472021182LGN00', dtype='<U21')
array('047', dtype='<U3')
array(32631)
array('191', dtype='<U3')
array('T1', dtype='<U2')
array({'tirs', 'oli'}, dtype=object)
array(0.)
array('02', dtype='<U2')
array('2', dtype='<U1')
array(66.18791145)
array('landsat-8', dtype='<U9')
array(0)
array('Collection 2 Level-2 Red Band (B4) Surface Reflectance', dtype='<U54')
array({0.0, -30.0, 698085.0, 30.0, 2194815.0}, dtype=object)
array('Red Band (B4)', dtype='<U13')
array({7691, 7531}, dtype=object)
array(30.)
array('red', dtype='<U3')
array(0.65)
array(0.04)
array(32631)
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.