diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4aa6418a..5b3b3b8d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,6 +8,9 @@ Changelog for cfgrib - fix issue where to_grib() could crash if given a dataset with a single-valued dimension See `#347 `_. +- fix issue where values could not be extracted when alternativeRowScanning=1 and + grid is not represented as 2D + See `#358 `_. 0.9.10.4 (2023-05-19) --------------------- diff --git a/cfgrib/dataset.py b/cfgrib/dataset.py index bf5eea9a..f37266f3 100644 --- a/cfgrib/dataset.py +++ b/cfgrib/dataset.py @@ -319,7 +319,8 @@ def get_values_in_order(message, shape): # type: (abc.Field, T.Tuple[int]) -> np.ndarray # inform the data provider to return missing values as missing_value values = message["values"] - if message.get("alternativeRowScanning", False): + # for 2D array (lat/lon) re-arrange if alternative row scanning + if len(shape) == 2 and message.get("alternativeRowScanning", False): values = values.copy().reshape(shape) values[1::2, :] = values[1::2, ::-1] return values.flatten() diff --git a/tests/sample-data/ds.waveh.5.grib b/tests/sample-data/ds.waveh.5.grib new file mode 100644 index 00000000..a424e147 Binary files /dev/null and b/tests/sample-data/ds.waveh.5.grib differ diff --git a/tests/test_40_xarray_store.py b/tests/test_40_xarray_store.py index 0f51613b..d37fb04a 100644 --- a/tests/test_40_xarray_store.py +++ b/tests/test_40_xarray_store.py @@ -17,6 +17,7 @@ TEST_DATA_MULTIPLE_FIELDS = os.path.join(SAMPLE_DATA_FOLDER, "regular_gg_ml_g2.grib") TEST_DATA_DIFFERENT_STEP_TYPES = os.path.join(SAMPLE_DATA_FOLDER, "cfrzr_and_cprat.grib") TEST_DATA_DIFFERENT_STEP_TYPES_ZEROS = os.path.join(SAMPLE_DATA_FOLDER, "cfrzr_and_cprat_0s.grib") +TEST_DATA_ALTERNATE_ROWS_MERCATOR = os.path.join(SAMPLE_DATA_FOLDER, "ds.waveh.5.grib") def test_open_dataset() -> None: @@ -154,3 +155,11 @@ def test_open_datasets_differet_step_types_zeros() -> None: assert res[0].cfrzr.attrs["GRIB_stepType"] == "instant" assert res[1].cprat.attrs["GRIB_stepType"] == "avg" assert res[1].cfrzr.attrs["GRIB_stepType"] == "avg" + + +def test_alternating_scanning_mercator() -> None: + ds = xarray_store.open_dataset(TEST_DATA_ALTERNATE_ROWS_MERCATOR) + values = ds.variables["shww"].data + assert np.isnan(values[5]) + assert values[760500] == 1.5 + values_all = ds.variables["shww"].data[:]