desis module¶
This Module has the functions related to working with a DESIS dataset.
desis_to_image(dataset, wavelengths=None, method='nearest', output=None, **kwargs)
¶
Converts an DESIS dataset to an image.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
dataset |
xarray.Dataset or str |
The dataset containing the DESIS data or the file path to the dataset. |
required |
wavelengths |
array-like |
The specific wavelengths to select. If None, all wavelengths are selected. Defaults to None. |
None |
method |
str |
The method to use for data interpolation. Defaults to "nearest". |
'nearest' |
output |
str |
The file path where the image will be saved. If None, the image will be returned as a PIL Image object. Defaults to None. |
None |
**kwargs |
Additional keyword arguments to be passed to
|
{} |
Returns:
Type | Description |
---|---|
rasterio.Dataset or None |
The image converted from the dataset. If
|
Source code in hypercoast/desis.py
def desis_to_image(
dataset: Union[xr.Dataset, str],
wavelengths: Union[list, tuple] = None,
method: Optional[str] = "nearest",
output: Optional[str] = None,
**kwargs,
):
"""
Converts an DESIS dataset to an image.
Args:
dataset (xarray.Dataset or str): The dataset containing the DESIS data
or the file path to the dataset.
wavelengths (array-like, optional): The specific wavelengths to select.
If None, all wavelengths are selected. Defaults to None.
method (str, optional): The method to use for data interpolation.
Defaults to "nearest".
output (str, optional): The file path where the image will be saved. If
None, the image will be returned as a PIL Image object. Defaults to None.
**kwargs: Additional keyword arguments to be passed to
`leafmap.array_to_image`.
Returns:
rasterio.Dataset or None: The image converted from the dataset. If
`output` is provided, the image will be saved to the specified file
and the function will return None.
"""
from leafmap import array_to_image
if isinstance(dataset, str):
dataset = read_desis(dataset, method=method)
if wavelengths is not None:
dataset = dataset.sel(wavelength=wavelengths, method=method)
return array_to_image(
dataset["reflectance"], output=output, transpose=False, **kwargs
)
extract_desis(ds, lat, lon)
¶
Extracts DESIS data from a given xarray Dataset.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
ds |
xarray.Dataset |
The dataset containing the DESIS data. |
required |
lat |
float |
The latitude of the point to extract. |
required |
lon |
float |
The longitude of the point to extract. |
required |
Returns:
Type | Description |
---|---|
xarray.DataArray |
The extracted data. |
Source code in hypercoast/desis.py
def extract_desis(ds: xr.Dataset, lat: float, lon: float) -> xr.DataArray:
"""
Extracts DESIS data from a given xarray Dataset.
Args:
ds (xarray.Dataset): The dataset containing the DESIS data.
lat (float): The latitude of the point to extract.
lon (float): The longitude of the point to extract.
Returns:
xarray.DataArray: The extracted data.
"""
crs = ds.attrs["crs"]
x, y = convert_coords([[lat, lon]], "epsg:4326", crs)[0]
values = ds.sel(x=x, y=y, method="nearest")["reflectance"].values / 10000
da = xr.DataArray(
values, dims=["wavelength"], coords={"wavelength": ds.coords["wavelength"]}
)
return da
filter_desis(dataset, lat, lon, return_plot=False, **kwargs)
¶
Filters a DESIS dataset based on latitude and longitude.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
dataset |
xr.Dataset |
The DESIS dataset to filter. |
required |
lat |
float or tuple |
The latitude to filter by. If a tuple or list, it represents a range. |
required |
lon |
float or tuple |
The longitude to filter by. If a tuple or list, it represents a range. |
required |
Returns:
Type | Description |
---|---|
xr.DataArray |
The filtered DESIS data. |
Source code in hypercoast/desis.py
def filter_desis(
dataset: xr.Dataset,
lat: Union[float, tuple],
lon: Union[float, tuple],
return_plot: Optional[bool] = False,
**kwargs,
) -> xr.Dataset:
"""
Filters a DESIS dataset based on latitude and longitude.
Args:
dataset (xr.Dataset): The DESIS dataset to filter.
lat (float or tuple): The latitude to filter by. If a tuple or list,
it represents a range.
lon (float or tuple): The longitude to filter by. If a tuple or
list, it represents a range.
Returns:
xr.DataArray: The filtered DESIS data.
"""
if isinstance(lat, list) or isinstance(lat, tuple):
min_lat = min(lat)
max_lat = max(lat)
else:
min_lat = lat
max_lat = lat
if isinstance(lon, list) or isinstance(lon, tuple):
min_lon = min(lon)
max_lon = max(lon)
else:
min_lon = lon
max_lon = lon
if min_lat == max_lat and min_lon == max_lon:
coords = [[min_lat, min_lon]]
else:
coords = [[min_lat, min_lon], [max_lat, max_lon]]
coords = convert_coords(coords, "epsg:4326", dataset.rio.crs.to_string())
if len(coords) == 1:
x, y = coords[0]
da = dataset.sel(x=x, y=y, method="nearest")["reflectance"]
else:
x_min, y_min = coords[0]
x_max, y_max = coords[1]
print(x_min, y_min, x_max, y_max)
da = dataset.sel(x=slice(x_min, x_max), y=slice(y_min, y_max))["reflectance"]
if return_plot:
rrs_stack = da.stack(
{"pixel": ["latitude", "longitude"]},
create_index=False,
)
rrs_stack.plot.line(hue="pixel", **kwargs)
else:
return da
read_desis(filepath, wavelengths=None, method='nearest', **kwargs)
¶
Reads DESIS data from a given file and returns an xarray Dataset.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
filepath |
str |
Path to the file to read. |
required |
wavelengths |
array-like |
Specific wavelengths to select. If None, all wavelengths are selected. |
None |
method |
str |
Method to use for selection when wavelengths is not None. Defaults to "nearest". |
'nearest' |
**kwargs |
Additional keyword arguments to pass to the |
{} |
Returns:
Type | Description |
---|---|
xr.Dataset |
An xarray Dataset containing the DESIS data. |
Source code in hypercoast/desis.py
def read_desis(
filepath: str,
wavelengths: Optional[Union[list, tuple]] = None,
method: Optional[str] = "nearest",
**kwargs,
) -> xr.Dataset:
"""
Reads DESIS data from a given file and returns an xarray Dataset.
Args:
filepath (str): Path to the file to read.
wavelengths (array-like, optional): Specific wavelengths to select. If
None, all wavelengths are selected.
method (str, optional): Method to use for selection when wavelengths is not
None. Defaults to "nearest".
**kwargs: Additional keyword arguments to pass to the `sel` method when
bands is not None.
Returns:
xr.Dataset: An xarray Dataset containing the DESIS data.
"""
url = "https://github.com/opengeos/datasets/releases/download/hypercoast/desis_wavelengths.csv"
df = pd.read_csv(url)
dataset = xr.open_dataset(filepath)
dataset = dataset.rename(
{"band": "wavelength", "band_data": "reflectance"}
).transpose("y", "x", "wavelength")
dataset["wavelength"] = df["wavelength"].tolist()
if wavelengths is not None:
dataset = dataset.sel(wavelength=wavelengths, method=method, **kwargs)
dataset.attrs["crs"] = dataset.rio.crs.to_string()
return dataset