Source code for watershed_workflow.sources.manager_pelletier_dtb
"""Manager for interacting with GLHYMPS v2.0 dataset."""
import os, sys
import logging
import xarray as xr
import shapely.geometry
import numpy as np
from watershed_workflow.crs import CRS
from . import manager_raster
from . import filenames
# No API for getting GLHYMPS locally -- must download the whole thing.
urls = {
'Pelletier at NASA DAAC':
'https://daac.ornl.gov/SOILS/guides/Global_Soil_Regolith_Sediment.html'
}
[docs]
class ManagerPelletierDTB(manager_raster.ManagerRaster):
"""The [PelletierDTB]_ global soil regolith sediment map provides global values of
depth to bedrock at a 1km spatial resolution.
.. note:: Pelletier DTB is served through ORNL's DAAC, does not
have an API, and is a large (~1GB) download. Download the file
from the below citation DOI and unzip the file into:
<data_directory>/soil_structure/PelletierDTB/
which should yield a set of tif files,
Global_Soil_Regolith_Sediment_1304/data/\\*.tif
.. [PelletierDTB] Pelletier, J.D., P.D. Broxton, P. Hazenberg,
X. Zeng, P.A. Troch, G. Niu, Z.C. Williams, M.A. Brunke, and
D. Gochis. 2016. Global 1-km Gridded Thickness of Soil,
Regolith, and Sedimentary Deposit Layers. ORNL DAAC, Oak Ridge,
Tennessee, USA. http://dx.doi.org/10.3334/ORNLDAAC/1304
"""
def __init__(self, filename=None):
if filename is None:
# Use default file location via Names system
self.names = filenames.Names(
'Pelletier DTB',
os.path.join('soil_structure', 'PelletierDTB', 'Global_Soil_Regolith_Sediment_1304',
'data'), '', 'average_soil_and_sedimentary-deposit_thickness.tif')
filename = self.names.file_name()
else:
# Use provided filename directly
self.names = None
# Initialize ManagerRaster with the resolved filename
# ManagerRaster will set name and source attributes appropriately
super(ManagerPelletierDTB, self).__init__(filename, None, None, None, None)
def _download(self, force : bool = False):
"""Validate the files exist, returning the filename."""
filename = self.names.file_name()
logging.info(' from file: {}'.format(filename))
if not os.path.exists(filename):
logging.error(f'PelletierDTB download file {filename} not found.')
logging.error('See download instructions below\n\n')
logging.error(self.__doc__)
raise RuntimeError(f'PelletierDTB download file {filename} not found.')
return filename
def _fetchDataset(self, request : manager_raster.ManagerRaster.Request) -> xr.Dataset:
"""Fetch the data."""
dset = super(ManagerPelletierDTB, self)._fetchDataset(request)
# DTB in pelletier is an int with -1 indicating nodata
dset['band_1'] = dset['band_1'].astype("float32")
dset['band_1'].encoding["_FillValue"] = np.nan
dset.encoding["_FillValue"] = np.nan
dset['band_1'].where(dset['band_1'] < 0)
return dset