From 1834d619035cc4e2cfac70232fa9f25b0ea8af23 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 12:36:39 +0200 Subject: [PATCH 01/26] Add minimal xarray plugin for `engine="gdal"` --- rioxarray/xarray_plugin.py | 18 ++++++++++++++++++ setup.py | 1 + 2 files changed, 19 insertions(+) create mode 100644 rioxarray/xarray_plugin.py diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py new file mode 100644 index 00000000..43b14784 --- /dev/null +++ b/rioxarray/xarray_plugin.py @@ -0,0 +1,18 @@ +import os.path + +import xarray as xr + +from . import _io + + +class GdalBackend(xr.backends.common.BackendEntrypoint): + def open_dataset(self, filename_or_obj, drop_variables=None): + ds = _io.open_rasterio(filename_or_obj).to_dataset("band") + return ds.rename({idx: f"band{idx}" for idx in ds.data_vars}) + + def guess_can_open(self, filename_or_obj): + try: + _, ext = os.path.splitext(filename_or_obj) + except TypeError: + return False + return ext in {".tif", ".geotif", ".tiff", ".geotiff"} diff --git a/setup.py b/setup.py index 1562c2e8..0866144f 100644 --- a/setup.py +++ b/setup.py @@ -72,4 +72,5 @@ def get_version(): version=get_version(), zip_safe=False, python_requires=">=3.6", + entry_points={"xarray.backends": ["gdal=rioxarray.xarray_plugin:GdalBackend"]}, ) From eca38dcb5006c96cc228fd8f4683a2eb5b9425fe Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 12:48:45 +0200 Subject: [PATCH 02/26] Dask and distributed switched from `master` to `main` --- .github/workflows/tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 97039503..9bfec108 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -108,8 +108,8 @@ jobs: # pandas \ # scipy; python -m pip install --upgrade \ - git+https://github.com/dask/dask.git@master \ - git+https://github.com/dask/distributed.git@master \ + git+https://github.com/dask/dask.git@main \ + git+https://github.com/dask/distributed.git@main \ git+https://github.com/mapbox/rasterio.git@master \ git+https://github.com/pyproj4/pyproj.git@master \ git+https://github.com/pydata/xarray.git@master; From 1d347804a4ed26cd8a598c61eedf11be08eb0ece Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 12:58:26 +0200 Subject: [PATCH 03/26] Add a test intended to work with xarray `master` --- test/integration/test_integration_xarray_plugin.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test/integration/test_integration_xarray_plugin.py diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py new file mode 100644 index 00000000..973b5ba9 --- /dev/null +++ b/test/integration/test_integration_xarray_plugin.py @@ -0,0 +1,14 @@ +import os.path +import xarray as xr + +from test.conftest import TEST_INPUT_DATA_DIR + + +def test_xarray_open_dataset(): + cog_file = os.path.join(TEST_INPUT_DATA_DIR, "cog.tif") + + ds = xr.open_dataset(cog_file) + + assert isinstance(ds, xr.Dataset) + assert "band1" in ds.data_vars + assert ds.data_vars["band1"].shape == (500, 500) From 137043231bc2205ff06b72c7255bed368f90d99d Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 13:01:11 +0200 Subject: [PATCH 04/26] Code style --- test/integration/test_integration_xarray_plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index 973b5ba9..6a5fe101 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -1,4 +1,5 @@ import os.path + import xarray as xr from test.conftest import TEST_INPUT_DATA_DIR From d5e5601364ae20f52bc09754631d73069df7d139 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 13:10:42 +0200 Subject: [PATCH 05/26] Test xarray plugin integration for newer versions --- test/integration/test_integration_xarray_plugin.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index 6a5fe101..5ff008e3 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -1,6 +1,8 @@ import os.path -import xarray as xr +import pytest + +xr = pytest.importorskip("xarray", minversion="0.17.1.dev0") from test.conftest import TEST_INPUT_DATA_DIR From 12eb9e1f6fe94e396e2ae0e192b457f2844a002b Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 13:16:57 +0200 Subject: [PATCH 06/26] Move `spatial_ref` out of coords to make it CF-compliant --- rioxarray/xarray_plugin.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 43b14784..4067a5f5 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -8,7 +8,9 @@ class GdalBackend(xr.backends.common.BackendEntrypoint): def open_dataset(self, filename_or_obj, drop_variables=None): ds = _io.open_rasterio(filename_or_obj).to_dataset("band") - return ds.rename({idx: f"band{idx}" for idx in ds.data_vars}) + ds = ds.rename({idx: f"band{idx}" for idx in ds.data_vars}) + ds = ds.reset_coords("spatial_ref") + return ds def guess_can_open(self, filename_or_obj): try: From 848cbd4d9b1d1c11c963e7356184df90bda38538 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 13:19:12 +0200 Subject: [PATCH 07/26] Code style (flake8) --- test/integration/test_integration_xarray_plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index 5ff008e3..c4a2a675 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -2,10 +2,10 @@ import pytest -xr = pytest.importorskip("xarray", minversion="0.17.1.dev0") - from test.conftest import TEST_INPUT_DATA_DIR +xr = pytest.importorskip("xarray", minversion="0.17.1.dev0") + def test_xarray_open_dataset(): cog_file = os.path.join(TEST_INPUT_DATA_DIR, "cog.tif") From 6928b5e7318abd773d981c81e5f87f64784b2b97 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 13:36:50 +0200 Subject: [PATCH 08/26] Test with and without guessing the extension --- test/integration/test_integration_xarray_plugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index c4a2a675..09cef826 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -10,8 +10,12 @@ def test_xarray_open_dataset(): cog_file = os.path.join(TEST_INPUT_DATA_DIR, "cog.tif") - ds = xr.open_dataset(cog_file) + ds = xr.open_dataset(cog_file, engine="gdal") assert isinstance(ds, xr.Dataset) assert "band1" in ds.data_vars assert ds.data_vars["band1"].shape == (500, 500) + + ds = xr.open_dataset(cog_file) + + assert isinstance(ds, xr.Dataset) From 13362fc88a7a94d76cdcb659358936e42782da3b Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 17:47:00 +0200 Subject: [PATCH 09/26] Add CAN_OPEN_EXT set of extensions and keep bands as dimension --- rioxarray/xarray_plugin.py | 9 ++++++--- test/integration/test_integration_xarray_plugin.py | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 4067a5f5..c3ad02b1 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -4,11 +4,14 @@ from . import _io +CAN_OPEN_EXT = {"geotif", "geotiff", "j2k", "jp2", "tif", "tiff", "vrt"} + class GdalBackend(xr.backends.common.BackendEntrypoint): def open_dataset(self, filename_or_obj, drop_variables=None): - ds = _io.open_rasterio(filename_or_obj).to_dataset("band") - ds = ds.rename({idx: f"band{idx}" for idx in ds.data_vars}) + ds = _io.open_rasterio(filename_or_obj) + if isinstance(ds, xr.DataArray): + ds = ds.to_dataset(name="band_data") ds = ds.reset_coords("spatial_ref") return ds @@ -17,4 +20,4 @@ def guess_can_open(self, filename_or_obj): _, ext = os.path.splitext(filename_or_obj) except TypeError: return False - return ext in {".tif", ".geotif", ".tiff", ".geotiff"} + return ext[1:].lower() in CAN_OPEN_EXT diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index 09cef826..ed22a060 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -13,8 +13,8 @@ def test_xarray_open_dataset(): ds = xr.open_dataset(cog_file, engine="gdal") assert isinstance(ds, xr.Dataset) - assert "band1" in ds.data_vars - assert ds.data_vars["band1"].shape == (500, 500) + assert "band_data" in ds.data_vars + assert ds.data_vars["band_data"].shape == (1, 500, 500) ds = xr.open_dataset(cog_file) From d39034ff7602a2c6d99bd63d3fdf53db257d95d3 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Mon, 5 Apr 2021 18:21:34 +0200 Subject: [PATCH 10/26] Enable all `open_rasterio` in `open_dataset` as `backend_kwargs` and `**kwargs` --- rioxarray/xarray_plugin.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index c3ad02b1..e2bd4ef4 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -8,10 +8,30 @@ class GdalBackend(xr.backends.common.BackendEntrypoint): - def open_dataset(self, filename_or_obj, drop_variables=None): - ds = _io.open_rasterio(filename_or_obj) + def open_dataset( + self, + filename_or_obj, + drop_variables=None, + mask_and_scale=False, + parse_coordinates=None, + lock=None, + masked=False, + variable=None, + group=None, + default_name="band_data", + ): + ds = _io.open_rasterio( + filename_or_obj, + mask_and_scale=mask_and_scale, + parse_coordinates=parse_coordinates, + lock=lock, + masked=masked, + variable=variable, + group=group, + default_name=default_name, + ) if isinstance(ds, xr.DataArray): - ds = ds.to_dataset(name="band_data") + ds = ds.to_dataset() ds = ds.reset_coords("spatial_ref") return ds From 12f88a2657d351e2a3f2cd83b199ee7ce9e31e84 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 14:05:53 +0200 Subject: [PATCH 11/26] Quick & dirty implementation of `decode_coords="all"` --- rioxarray/xarray_plugin.py | 4 +++- test/integration/test_integration_xarray_plugin.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index e2bd4ef4..2e29d34b 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -12,6 +12,7 @@ def open_dataset( self, filename_or_obj, drop_variables=None, + decode_coords=True, mask_and_scale=False, parse_coordinates=None, lock=None, @@ -32,7 +33,8 @@ def open_dataset( ) if isinstance(ds, xr.DataArray): ds = ds.to_dataset() - ds = ds.reset_coords("spatial_ref") + if decode_coords is True or decode_coords=="coordinate": + ds = ds.reset_coords("spatial_ref") return ds def guess_can_open(self, filename_or_obj): diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index ed22a060..9fd6e52b 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -15,7 +15,16 @@ def test_xarray_open_dataset(): assert isinstance(ds, xr.Dataset) assert "band_data" in ds.data_vars assert ds.data_vars["band_data"].shape == (1, 500, 500) + assert "spatial_ref" in ds.data_vars + assert "spatial_ref" not in ds.coords + + ds = xr.open_dataset(cog_file, engine="gdal", decode_coords="all") + + assert "spatial_ref" not in ds.data_vars + assert "spatial_ref" in ds.coords ds = xr.open_dataset(cog_file) assert isinstance(ds, xr.Dataset) + + ds.to_netcdf("test.nc") From 0b2cc76bde13145b664e6a7d7cbf0726693baa62 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 14:12:49 +0200 Subject: [PATCH 12/26] Code style --- rioxarray/xarray_plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 2e29d34b..bd1397c4 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -33,7 +33,7 @@ def open_dataset( ) if isinstance(ds, xr.DataArray): ds = ds.to_dataset() - if decode_coords is True or decode_coords=="coordinate": + if decode_coords is True or decode_coords == "coordinate": ds = ds.reset_coords("spatial_ref") return ds From da1f0a1e91f491ffad4b100fd61f5972d3d540e9 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 14:32:30 +0200 Subject: [PATCH 13/26] Fix typo --- rioxarray/xarray_plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index bd1397c4..8efc0f3b 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -33,7 +33,7 @@ def open_dataset( ) if isinstance(ds, xr.DataArray): ds = ds.to_dataset() - if decode_coords is True or decode_coords == "coordinate": + if decode_coords is True or decode_coords == "coordinates": ds = ds.reset_coords("spatial_ref") return ds From 07cc1bea988f0ce16eead43bd66abee439865e18 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 21:42:00 +0200 Subject: [PATCH 14/26] Minimal xarray plugin to enable `xr.open_dataset("cog.tif", engine="rasterio")` --- rioxarray/xarray_plugin.py | 9 +++------ setup.py | 2 +- test/integration/test_integration_xarray_plugin.py | 11 +++++------ 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 8efc0f3b..128cac2b 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -4,15 +4,14 @@ from . import _io -CAN_OPEN_EXT = {"geotif", "geotiff", "j2k", "jp2", "tif", "tiff", "vrt"} +CAN_OPEN_EXTS = {"geotif", "geotiff", "j2k", "jp2", "tif", "tiff", "vrt"} -class GdalBackend(xr.backends.common.BackendEntrypoint): +class RasterioBackend(xr.backends.common.BackendEntrypoint): def open_dataset( self, filename_or_obj, drop_variables=None, - decode_coords=True, mask_and_scale=False, parse_coordinates=None, lock=None, @@ -33,8 +32,6 @@ def open_dataset( ) if isinstance(ds, xr.DataArray): ds = ds.to_dataset() - if decode_coords is True or decode_coords == "coordinates": - ds = ds.reset_coords("spatial_ref") return ds def guess_can_open(self, filename_or_obj): @@ -42,4 +39,4 @@ def guess_can_open(self, filename_or_obj): _, ext = os.path.splitext(filename_or_obj) except TypeError: return False - return ext[1:].lower() in CAN_OPEN_EXT + return ext[1:].lower() in CAN_OPEN_EXTS diff --git a/setup.py b/setup.py index 0866144f..5cd7bf71 100644 --- a/setup.py +++ b/setup.py @@ -72,5 +72,5 @@ def get_version(): version=get_version(), zip_safe=False, python_requires=">=3.6", - entry_points={"xarray.backends": ["gdal=rioxarray.xarray_plugin:GdalBackend"]}, + entry_points={"xarray.backends": ["rasterio=rioxarray.xarray_plugin:RasterioBackend"]}, ) diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index 9fd6e52b..18e31a71 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -10,18 +10,17 @@ def test_xarray_open_dataset(): cog_file = os.path.join(TEST_INPUT_DATA_DIR, "cog.tif") - ds = xr.open_dataset(cog_file, engine="gdal") + ds = xr.open_dataset(cog_file, engine="rasterio") assert isinstance(ds, xr.Dataset) assert "band_data" in ds.data_vars assert ds.data_vars["band_data"].shape == (1, 500, 500) - assert "spatial_ref" in ds.data_vars - assert "spatial_ref" not in ds.coords - - ds = xr.open_dataset(cog_file, engine="gdal", decode_coords="all") - assert "spatial_ref" not in ds.data_vars assert "spatial_ref" in ds.coords + # uncomment after "grid_mapping" is moved into `encodings` + # see: https://github.com/corteva/rioxarray/issues/282#issuecomment-814358516 + # assert "grid_mapping" not in ds.data_vars["band_data"].attrs + # assert "grid_mapping" not in ds.data_vars["band_data"].encoding ds = xr.open_dataset(cog_file) From 581997e38b49b0509c7a4f358ca1e6b53afc2a9d Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 21:46:45 +0200 Subject: [PATCH 15/26] Code style --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5cd7bf71..5534b8fd 100644 --- a/setup.py +++ b/setup.py @@ -72,5 +72,7 @@ def get_version(): version=get_version(), zip_safe=False, python_requires=">=3.6", - entry_points={"xarray.backends": ["rasterio=rioxarray.xarray_plugin:RasterioBackend"]}, + entry_points={ + "xarray.backends": ["rasterio=rioxarray.xarray_plugin:RasterioBackend"] + }, ) From 073db2f8a12e7b97858488dd7309b3374ff4db0d Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 22:01:33 +0200 Subject: [PATCH 16/26] Added entry in the history --- docs/history.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/history.rst b/docs/history.rst index f7475a45..81d156ac 100644 --- a/docs/history.rst +++ b/docs/history.rst @@ -7,6 +7,7 @@ Latest 0.3.2 ----- - BUG: handle lock=True in open_rasterio (issue #273) +- ENH: enable `engine="rasterio"` via xarray backend API (issue #197 pull #281) 0.3.1 ------ From 1e139a55b4e92701b1d6b68d3821ebc17738b197 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 22:42:39 +0200 Subject: [PATCH 17/26] Implement PR feedback by @snowman2 --- rioxarray/xarray_plugin.py | 17 +++++++++++++++-- .../test_integration_xarray_plugin.py | 2 -- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 128cac2b..55e3fe47 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -4,7 +4,20 @@ from . import _io -CAN_OPEN_EXTS = {"geotif", "geotiff", "j2k", "jp2", "tif", "tiff", "vrt"} +CAN_OPEN_EXTS = { + "asc", + "geotif", + "geotiff", + "img", + "j2k", + "jp2", + "jpg", + "jpeg", + "png", + "tif", + "tiff", + "vrt", +} class RasterioBackend(xr.backends.common.BackendEntrypoint): @@ -12,7 +25,7 @@ def open_dataset( self, filename_or_obj, drop_variables=None, - mask_and_scale=False, + mask_and_scale=True, parse_coordinates=None, lock=None, masked=False, diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index 18e31a71..a46c14b7 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -25,5 +25,3 @@ def test_xarray_open_dataset(): ds = xr.open_dataset(cog_file) assert isinstance(ds, xr.Dataset) - - ds.to_netcdf("test.nc") From 36961c71d26b58ba573fe07aaef661d6ef231848 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 23:04:45 +0200 Subject: [PATCH 18/26] rebase and integrate with `grid_mapping` in `encoding` --- docs/history.rst | 2 +- test/integration/test_integration_xarray_plugin.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/history.rst b/docs/history.rst index 1625f02b..7c926b49 100644 --- a/docs/history.rst +++ b/docs/history.rst @@ -6,11 +6,11 @@ Latest - DEP: Python 3.6+ (issue #215) - DEP: xarray 0.17+ (needed for issue #282) - REF: Store `grid_mapping` in `encoding` instead of `attrs` (issue #282) +- ENH: enable `engine="rasterio"` via xarray backend API (issue #197 pull #281) 0.3.2 ----- - BUG: handle lock=True in open_rasterio (issue #273) -- ENH: enable `engine="rasterio"` via xarray backend API (issue #197 pull #281) 0.3.1 ------ diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index a46c14b7..a4b8eb1f 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -17,10 +17,8 @@ def test_xarray_open_dataset(): assert ds.data_vars["band_data"].shape == (1, 500, 500) assert "spatial_ref" not in ds.data_vars assert "spatial_ref" in ds.coords - # uncomment after "grid_mapping" is moved into `encodings` - # see: https://github.com/corteva/rioxarray/issues/282#issuecomment-814358516 - # assert "grid_mapping" not in ds.data_vars["band_data"].attrs - # assert "grid_mapping" not in ds.data_vars["band_data"].encoding + assert "grid_mapping" not in ds.data_vars["band_data"].attrs + assert "grid_mapping" in ds.data_vars["band_data"].encoding ds = xr.open_dataset(cog_file) From 730d19b2eba59ad7512ac533bbc064dfbf4888f1 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 23:12:57 +0200 Subject: [PATCH 19/26] Try add minimal user documentation --- docs/getting_started/getting_started.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/getting_started/getting_started.rst b/docs/getting_started/getting_started.rst index fe8241d3..5756f63c 100644 --- a/docs/getting_started/getting_started.rst +++ b/docs/getting_started/getting_started.rst @@ -26,6 +26,12 @@ Why use :func:`rioxarray.open_rasterio` instead of `xarray.open_rasterio`? 5. It adds the coordinate axis CF metadata. 6. It loads raster metadata into the attributes. +Starting with xarray 0.18.0 rioxarray enables passing `engine="rasterio"` to all xarray open functions: + +.. code-block:: python + + ds = xr.open_dataset("my.tif", engine="rasterio") + .. toctree:: :maxdepth: 1 From 951c4d91fefcc419a40b2633bb62854f81f52331 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 23:14:10 +0200 Subject: [PATCH 20/26] version added version added --- rioxarray/xarray_plugin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 55e3fe47..4e58b55a 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -21,6 +21,9 @@ class RasterioBackend(xr.backends.common.BackendEntrypoint): + """ + .. versionadded:: 0.4 + """ def open_dataset( self, filename_or_obj, From 511d99e6b0facde97bbcd10cb8fe9b220a398f6f Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Tue, 6 Apr 2021 23:21:47 +0200 Subject: [PATCH 21/26] Code style --- rioxarray/xarray_plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 4e58b55a..8b82e59a 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -24,6 +24,7 @@ class RasterioBackend(xr.backends.common.BackendEntrypoint): """ .. versionadded:: 0.4 """ + def open_dataset( self, filename_or_obj, From 25ab9bd30312917d56103da7d30f41300cfa45e3 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Wed, 7 Apr 2021 16:48:53 +0200 Subject: [PATCH 22/26] Add open_kwargs to backend --- rioxarray/xarray_plugin.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index 8b82e59a..c8155a3d 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -36,6 +36,7 @@ def open_dataset( variable=None, group=None, default_name="band_data", + open_kwargs={}, ): ds = _io.open_rasterio( filename_or_obj, @@ -46,6 +47,7 @@ def open_dataset( variable=variable, group=group, default_name=default_name, + **open_kwargs, ) if isinstance(ds, xr.DataArray): ds = ds.to_dataset() From cf3c3f9c914091d177eaf3695efbbae73370be71 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Wed, 7 Apr 2021 16:49:07 +0200 Subject: [PATCH 23/26] Apply suggestions from code review Co-authored-by: Alan D. Snow --- docs/getting_started/getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting_started/getting_started.rst b/docs/getting_started/getting_started.rst index 5756f63c..b7d88c30 100644 --- a/docs/getting_started/getting_started.rst +++ b/docs/getting_started/getting_started.rst @@ -26,7 +26,7 @@ Why use :func:`rioxarray.open_rasterio` instead of `xarray.open_rasterio`? 5. It adds the coordinate axis CF metadata. 6. It loads raster metadata into the attributes. -Starting with xarray 0.18.0 rioxarray enables passing `engine="rasterio"` to all xarray open functions: +rioxarray 0.4+ enables passing `engine="rasterio"` to ``xarray.open_dataset`` and ``xarray.open_mfdataset``: .. code-block:: python From 37adc6e8c0fbfc3051235310c42ee4cedafbf461 Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Wed, 7 Apr 2021 17:35:04 +0200 Subject: [PATCH 24/26] Add a comment on xarray miversion --- test/integration/test_integration_xarray_plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/integration/test_integration_xarray_plugin.py b/test/integration/test_integration_xarray_plugin.py index a4b8eb1f..2fbb06a8 100644 --- a/test/integration/test_integration_xarray_plugin.py +++ b/test/integration/test_integration_xarray_plugin.py @@ -4,6 +4,7 @@ from test.conftest import TEST_INPUT_DATA_DIR +# FIXME: change to the next xarray version after release xr = pytest.importorskip("xarray", minversion="0.17.1.dev0") From a1c8dfcb16aa42dd11e941f29e1ae6e9c49bc09e Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Wed, 7 Apr 2021 17:43:55 +0200 Subject: [PATCH 25/26] Implement feedback --- rioxarray/xarray_plugin.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rioxarray/xarray_plugin.py b/rioxarray/xarray_plugin.py index c8155a3d..c7787fa3 100644 --- a/rioxarray/xarray_plugin.py +++ b/rioxarray/xarray_plugin.py @@ -36,8 +36,10 @@ def open_dataset( variable=None, group=None, default_name="band_data", - open_kwargs={}, + open_kwargs=None, ): + if open_kwargs is None: + open_kwargs = {} ds = _io.open_rasterio( filename_or_obj, mask_and_scale=mask_and_scale, From 18d7bd8fd667697c2a0eab47d7374302f760655e Mon Sep 17 00:00:00 2001 From: Alessandro Amici Date: Wed, 7 Apr 2021 17:59:01 +0200 Subject: [PATCH 26/26] Declare minimal xarray version. --- docs/getting_started/getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting_started/getting_started.rst b/docs/getting_started/getting_started.rst index b7d88c30..e47c4725 100644 --- a/docs/getting_started/getting_started.rst +++ b/docs/getting_started/getting_started.rst @@ -26,7 +26,7 @@ Why use :func:`rioxarray.open_rasterio` instead of `xarray.open_rasterio`? 5. It adds the coordinate axis CF metadata. 6. It loads raster metadata into the attributes. -rioxarray 0.4+ enables passing `engine="rasterio"` to ``xarray.open_dataset`` and ``xarray.open_mfdataset``: +rioxarray 0.4+ enables passing `engine="rasterio"` to ``xarray.open_dataset`` and ``xarray.open_mfdataset`` for xarray 0.18+: .. code-block:: python