Skip to content

Commit d70690b

Browse files
authored
Issue 559: Update scan_grib to store levels with two surfaces (#560)
1 parent 08bc7eb commit d70690b

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

kerchunk/grib2.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,22 @@ def _store_array(store, z, data, var, inline_threshold, offset, size, attr):
120120
d.attrs.update(attr)
121121

122122

123+
def contains_valid_level(message_keys: Set) -> bool:
124+
"""Check if the given set of message_keys contain a valid level value.
125+
Some types of level, like depthBelowLandLayer for GEFS grib files,
126+
represent slices of levels by "topLevel" and "bottomLevel" rather
127+
than a discrete level value described by "level".
128+
see https://github.com/fsspec/kerchunk/issues/559
129+
130+
Args:
131+
message_keys: Set of keys to evaluate
132+
133+
Returns:
134+
True if message_keys contain a valid level value, False otherwise
135+
"""
136+
return "level" in message_keys or "topLevel" in message_keys
137+
138+
123139
def scan_grib(
124140
url,
125141
common=None,
@@ -247,7 +263,7 @@ def scan_grib(
247263
_store_array(
248264
store_dict, z, vals, varName, inline_threshold, offset, size, attrs
249265
)
250-
if "typeOfLevel" in message_keys and "level" in message_keys:
266+
if "typeOfLevel" in message_keys and contains_valid_level(message_keys:
251267
name = m["typeOfLevel"]
252268
coordinates.append(name)
253269
# convert to numpy scalar, so that .tobytes can be used for inlining
Binary file not shown.

0 commit comments

Comments
 (0)