1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
"""
This module allows for open_rasterio to be used with the xarray open methods
through a backend entrypoint.
"""
# pylint: disable=arguments-differ
import os.path
import xarray
from . import _io
from .exceptions import RioXarrayError
CAN_OPEN_EXTS = {
"asc",
"geotif",
"geotiff",
"img",
"j2k",
"jp2",
"jpg",
"jpeg",
"png",
"tif",
"tiff",
"vrt",
}
class RasterioBackend(xarray.backends.common.BackendEntrypoint):
"""
Requires xarray 0.18+
.. versionadded:: 0.4
"""
# pylint: disable=abstract-method
def open_dataset(
self,
filename_or_obj,
*,
drop_variables=None,
parse_coordinates=None,
lock=None,
masked=False,
mask_and_scale=True,
variable=None,
group=None,
default_name="band_data",
decode_coords="all",
decode_times=True,
decode_timedelta=None,
band_as_variable=False,
open_kwargs=None,
):
if decode_coords != "all":
raise RioXarrayError("Only 'all' is supported for 'decode_coords'.")
if open_kwargs is None:
open_kwargs = {}
rds = _io.open_rasterio(
filename_or_obj,
parse_coordinates=parse_coordinates,
cache=False,
lock=lock,
masked=masked,
mask_and_scale=mask_and_scale,
variable=variable,
group=group,
default_name=default_name,
decode_times=decode_times,
decode_timedelta=decode_timedelta,
band_as_variable=band_as_variable,
**open_kwargs,
)
if isinstance(rds, xarray.DataArray):
dataset = rds.to_dataset()
dataset.set_close(rds._close)
rds = dataset
if isinstance(rds, list):
for dataset in rds:
dataset.close()
raise RioXarrayError(
"Multiple resolution sets found. "
"Use 'variable' or 'group' to filter."
)
if drop_variables is not None:
rds = rds.drop_vars(drop_variables)
return rds
def guess_can_open(self, filename_or_obj): # pylint: disable=arguments-renamed
try:
_, ext = os.path.splitext(filename_or_obj)
except TypeError:
return False
return ext[1:].lower() in CAN_OPEN_EXTS
|