Repository: microsoft/torchgeo

Issue:
Missing documentation about expected filesystems for Datasets
### Issue

I bulk-downloaded Landsat8 product tarfiles from EarthExplorer (i.e. LC08_L1TP_016030_20190702_20200827_02_T1.tar) and I have a directory of these files. I am trying to instantiate a Landsat8 dataset object, trying alternative paths to:

1. A directory of unzipped product file subdirectories
2. A directory of zipped product file subdirectories. 
3. A subdirectory of a single scene product. 

I am getting the following error:

No Landsat8 data was found in '/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped' which is full of subdirectories for each product.

How does Landsat, and in general, Dataset classes expect the filesystems for their corresponding datasets? Particularly for Landsat8, how should the root path location be structured? 

### Fix

_No response_


Discussion:
Can you share the output of:
```console
$ find /dirs/data/misc/euphrates/datasets/landsat
```
Can be truncated to include the first full scene, just want to see what your filenames are formatted like.

The expected filename structure is somewhat poorly documented by the `filename_regex` attribute of https://torchgeo.readthedocs.io/en/stable/api/datasets.html#landsat. This regex is based off of the filename formats described in the documentation at the bottom of https://www.usgs.gov/landsat-missions/landsat-collection-2. Of course, if those filenames have changed since this documentation was released, then our regexes will also need to be updated.

P.S. If you have suggestions for better ways to document the expected filename format or a more useful error message I would love to hear them!
I am getting a long list of tif mtl and other files associated with files. Does this help? 
```
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped/LC08_L1TP_016030_20180325_20200901_02_T1
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped/LC08_L1TP_016030_20180325_20200901_02_T1/LC08_L1TP_016030_20180325_20200901_02_T1_SZA.TIF
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped/LC08_L1TP_016030_20180325_20200901_02_T1/LC08_L1TP_016030_20180325_20200901_02_T1_MTL.xml
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped/LC08_L1TP_016030_20180325_20200901_02_T1/LC08_L1TP_016030_20180325_20200901_02_T1_B6.TIF
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped/LC08_L1TP_016030_20180325_20200901_02_T1/LC08_L1TP_016030_20180325_20200901_02_T1_B1.TIF
...
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped/LC08_L1TP_016030_20210808_20210819_02_T1/LC08_L1TP_016030_20210808_20210819_02_T1_B3.TIF
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/unzipped/LC08_L1TP_016030_20210808_20210819_02_T1/LC08_L1TP_016030_20210808_20210819_02_T1_B4.TIF
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/zipped
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/zipped/LC08_L1TP_016030_20211214_20211223_02_T1.tar
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/zipped/LC08_L1TP_016030_20210723_20210729_02_T1.tar
...
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/zipped/LC08_L1GT_016030_20190616_20200827_02_T2.tar
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/test
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/test/LC08_L1GT_016030_20230102_20230111_02_T2_QA_RADSAT.TIF
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/test/LC08_L1GT_016030_20230102_20230111_02_T2_B8.TIF
...
/dirs/data/misc/euphrates/datasets/landsat/L8_16_30_2018_2023/test/LC08_L1GT_016030_20230102_20230111_02_T2_SZA.TIF
```
Ah okay, you just need to set `bands` properly. Something like this should work (depending on how many bands you have downloaded):
```python
dataset = Landsat8(root="...", bands=["B1", ..., "B11"])
```
By default, our Landsat data loaders are designed to look for [Level-2 Surface Reflectance](https://www.usgs.gov/landsat-missions/landsat-surface-reflectance) data by default (`bands=["SR_B1", ..., "SR_B11"]`), not [Level-1](https://www.usgs.gov/landsat-missions/landsat-level-1-processing-details) data (`bands=["B1", ..., "B11"]`).
How would you recommend that I read in QA and QA_RANDSAT channels? 
```python
bands=["B1", ..., "B11", "QA", "QA_RANDSAT"]
```

Resolving patch:
diff --git a/torchgeo/datasets/geo.py b/torchgeo/datasets/geo.py
--- a/torchgeo/datasets/geo.py
+++ b/torchgeo/datasets/geo.py
@@ -364,9 +364,10 @@ def __init__(
                     i += 1
 
         if i == 0:
-            raise FileNotFoundError(
-                f"No {self.__class__.__name__} data was found in '{root}'"
-            )
+            msg = f"No {self.__class__.__name__} data was found in `root='{self.root}'`"
+            if self.bands:
+                msg += f" with `bands={self.bands}`"
+            raise FileNotFoundError(msg)
 
         if not self.separate_files:
             self.band_indexes = None
@@ -582,9 +583,8 @@ def __init__(
                 i += 1
 
         if i == 0:
-            raise FileNotFoundError(
-                f"No {self.__class__.__name__} data was found in '{root}'"
-            )
+            msg = f"No {self.__class__.__name__} data was found in `root='{root}'`"
+            raise FileNotFoundError(msg)
 
         self._crs = crs
 


Test patch: