From d0fde3e9e5a1343caa8d6697ef6008faa1825cf9 Mon Sep 17 00:00:00 2001 From: awarde96 Date: Fri, 19 Jun 2026 09:24:14 +0000 Subject: [PATCH 1/3] Add identifiers to mars:metadata if they are passed from polytope --- covjsonkit/encoder/TimeSeries.py | 24 +++++++++++++++++------- covjsonkit/encoder/encoder.py | 12 ++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/covjsonkit/encoder/TimeSeries.py b/covjsonkit/encoder/TimeSeries.py index 310f630..699e6ed 100644 --- a/covjsonkit/encoder/TimeSeries.py +++ b/covjsonkit/encoder/TimeSeries.py @@ -143,6 +143,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict: fields["step"] = 0 fields["dates"] = [] fields["levels"] = [0] + fields["identifiers"] = [] start = time.time() logging.debug("Tree walking starts at: %s", start) # noqa: E501 @@ -243,13 +244,22 @@ def from_polytope(self, result, date_key: str = "date") -> dict: f"Key {key} not found in range_dict. " f"Please ensure all axes are compressed in config" ) - mm = mars_metadata.copy() - mm["number"] = num - mm["Forecast date"] = date - mm["levelist"] = level - coordinates[date][i]["levelist"] = [level] - del mm["step"] - self.add_coverage(mm, coordinates[date][i], val_dict) + # Determine identifiers for this point + point_identifiers = [None] + if fields["identifiers"] and i < len(fields["identifiers"]): + point_identifiers = fields["identifiers"][i] + + # Emit one coverage per identifier (duplicates coverage for merged points) + for identifier in point_identifiers: + mm = mars_metadata.copy() + mm["number"] = num + mm["Forecast date"] = date + mm["levelist"] = level + if identifier is not None: + mm["identifier"] = identifier + coordinates[date][i]["levelist"] = [level] + del mm["step"] + self.add_coverage(mm, coordinates[date][i], val_dict) end = time.time() delta = end - start diff --git a/covjsonkit/encoder/encoder.py b/covjsonkit/encoder/encoder.py index 0332de2..c554f7f 100644 --- a/covjsonkit/encoder/encoder.py +++ b/covjsonkit/encoder/encoder.py @@ -383,6 +383,17 @@ def append_composite_coords(dates, tree_values, lat, coords): for value in tree_values: coords[dates]["composite"].append([lat, value]) + def collect_tags(tree, fields, count): + """Collect tags from leaf tree nodes into fields['identifiers'].""" + if "identifiers" in fields: + tags = getattr(tree, "tags", None) + if tags: + tag_list = sorted(tags, key=str) + else: + tag_list = [None] + for _ in range(count): + fields["identifiers"].append(tag_list) + if len(tree.children) != 0: for child in tree.children: handle_non_leaf_node(child) @@ -426,6 +437,7 @@ def append_composite_coords(dates, tree_values, lat, coords): step_len = para_len / len(fields["step"]) append_composite_coords(fields["dates"][-1], tree.values, fields["lat"], coords) + collect_tags(tree, fields, len(tree.values)) for l, level in enumerate(fields["levels"]): # noqa: E741 for i, num in enumerate(fields["number"]): From 92a0eafd5158b1bb65583b27e98de83c7c1937db Mon Sep 17 00:00:00 2001 From: awarde96 Date: Tue, 23 Jun 2026 10:19:01 +0000 Subject: [PATCH 2/3] Take tags from latitude instead of longitude for labels --- covjsonkit/encoder/encoder.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/covjsonkit/encoder/encoder.py b/covjsonkit/encoder/encoder.py index c554f7f..2bcafcd 100644 --- a/covjsonkit/encoder/encoder.py +++ b/covjsonkit/encoder/encoder.py @@ -384,9 +384,9 @@ def append_composite_coords(dates, tree_values, lat, coords): coords[dates]["composite"].append([lat, value]) def collect_tags(tree, fields, count): - """Collect tags from leaf tree nodes into fields['identifiers'].""" + """Collect tags from the latitude node into fields['identifiers'].""" if "identifiers" in fields: - tags = getattr(tree, "tags", None) + tags = fields.get("_lat_tags", None) or getattr(tree, "tags", None) if tags: tag_list = sorted(tags, key=str) else: @@ -401,6 +401,7 @@ def collect_tags(tree, fields, count): if result is not None: if child.axis.name == "latitude": fields["lat"] = result + fields["_lat_tags"] = getattr(child, "tags", None) elif child.axis.name == "levelist": fields["levels"] = result if "l" in fields: From dfceb57bef27360766268ae0feb65d5fb3e97ed2 Mon Sep 17 00:00:00 2001 From: awarde96 Date: Wed, 24 Jun 2026 10:05:42 +0000 Subject: [PATCH 3/3] Change output in metadata from identifier to label --- covjsonkit/encoder/TimeSeries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/covjsonkit/encoder/TimeSeries.py b/covjsonkit/encoder/TimeSeries.py index 699e6ed..4ed7395 100644 --- a/covjsonkit/encoder/TimeSeries.py +++ b/covjsonkit/encoder/TimeSeries.py @@ -256,7 +256,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict: mm["Forecast date"] = date mm["levelist"] = level if identifier is not None: - mm["identifier"] = identifier + mm["label"] = identifier coordinates[date][i]["levelist"] = [level] del mm["step"] self.add_coverage(mm, coordinates[date][i], val_dict)