Skip to content

Commit 321bf7e

Browse files
committed
saveStitchedTileGrid: handle items instead of files #1111
1 parent 4ee8682 commit 321bf7e

File tree

2 files changed

+117
-16
lines changed

2 files changed

+117
-16
lines changed

openeogeotrellis/geopysparkdatacube.py

+33-12
Original file line numberDiff line numberDiff line change
@@ -1919,22 +1919,43 @@ def add_gdalinfo_objects(assets_original):
19191919
elif stitch:
19201920
if tile_grid:
19211921
_log.info("save_result save_stitched_tile_grid")
1922-
tiles = self._save_stitched_tile_grid(max_level, save_filename, tile_grid, crop_bounds,
1923-
zlevel=zlevel, filename_prefix=filename_prefix)
1924-
1925-
# noinspection PyProtectedMember
1926-
return add_gdalinfo_objects(
1927-
{
1928-
str(pathlib.Path(tile._1()).name): {
1929-
"href": tile._1(),
1930-
"bbox": to_latlng_bbox(tile._2()),
1931-
"geometry": mapping(Polygon.from_bounds(*to_latlng_bbox(tile._2()))),
1922+
java_items = self._save_stitched_tile_grid(
1923+
max_level,
1924+
save_filename,
1925+
tile_grid,
1926+
crop_bounds,
1927+
zlevel=zlevel,
1928+
filename_prefix=filename_prefix,
1929+
)
1930+
1931+
items = {}
1932+
1933+
for java_item in java_items:
1934+
bbox = java_item.bbox()
1935+
assets = {}
1936+
1937+
for asset_key, asset in java_item.assets().items():
1938+
assets[asset_key] = {
1939+
"href": asset.path(),
1940+
"bbox": to_latlng_bbox(bbox),
1941+
"geometry": mapping(Polygon.from_bounds(*to_latlng_bbox(bbox))),
19321942
"type": "image/tiff; application=geotiff",
19331943
"roles": ["data"],
19341944
}
1935-
for tile in tiles
1945+
1946+
assets = add_gdalinfo_objects(assets)
1947+
1948+
item = {
1949+
"id": java_item.id(),
1950+
"properties": {"datetime": java_item.datetime()},
1951+
"geometry": mapping(Polygon.from_bounds(*to_latlng_bbox(bbox))),
1952+
"bbox": to_latlng_bbox(bbox),
1953+
"assets": assets,
19361954
}
1937-
)
1955+
1956+
items[java_item.id()] = item
1957+
1958+
return items
19381959
else:
19391960
_log.info("save_result save_stitched")
19401961
java_item = self._save_stitched(max_level, save_filename, crop_bounds, zlevel=zlevel)

tests/test_batch_result.py

+84-4
Original file line numberDiff line numberDiff line change
@@ -2937,8 +2937,11 @@ def test_unified_asset_keys_spatial_geotiff(
29372937

29382938
assert len(items) == 1
29392939
# single item ID can be anything (no spatial or temporal references)
2940-
assert job_metadata["start_datetime"] == "2025-04-01T00:00:00Z" # top-level rather than on Item
2941-
assert job_metadata["end_datetime"] == "2025-04-21T00:00:00Z" # ditto
2940+
2941+
# at job-level rather than on Item
2942+
assert items[0]["properties"].get("datetime") is None
2943+
assert job_metadata["start_datetime"] == "2025-04-01T00:00:00Z"
2944+
assert job_metadata["end_datetime"] == "2025-04-21T00:00:00Z"
29422945

29432946
assert set(items[0]["assets"].keys()) == expected_asset_keys
29442947

@@ -3000,7 +3003,84 @@ def test_unified_asset_keys_stitch_geotiff(tmp_path):
30003003

30013004
assert len(items) == 1
30023005
# single item ID can be anything (no spatial or temporal references)
3003-
assert job_metadata["start_datetime"] == "2025-04-01T00:00:00Z" # top-level rather than on Item
3004-
assert job_metadata["end_datetime"] == "2025-04-21T00:00:00Z" # ditto
3006+
3007+
# at job-level rather than on Item
3008+
assert items[0]["properties"].get("datetime") is None
3009+
assert job_metadata["start_datetime"] == "2025-04-01T00:00:00Z"
3010+
assert job_metadata["end_datetime"] == "2025-04-21T00:00:00Z"
30053011

30063012
assert set(items[0]["assets"].keys()) == {"openEO"}
3013+
3014+
3015+
def test_unified_asset_keys_stitch_tile_grid(tmp_path):
3016+
process_graph = {
3017+
"load2": {
3018+
"process_id": "load_collection",
3019+
"arguments": {
3020+
"bands": [
3021+
"Flat:0",
3022+
"Flat:1",
3023+
"Flat:2",
3024+
],
3025+
"id": "TestCollection-LonLat16x16",
3026+
"spatial_extent": {
3027+
"west": 0,
3028+
"south": 50,
3029+
"east": 2,
3030+
"north": 51,
3031+
},
3032+
"temporal_extent": ["2025-04-01", "2025-04-21"],
3033+
},
3034+
},
3035+
"save1": {
3036+
"process_id": "save_result",
3037+
"arguments": {
3038+
"data": {"from_node": "load2"},
3039+
"format": "GTIFF",
3040+
"options": {
3041+
"stitch": True,
3042+
"tile_grid": "wgs84-1degree",
3043+
},
3044+
},
3045+
"result": True,
3046+
},
3047+
}
3048+
3049+
process = {
3050+
"process_graph": process_graph,
3051+
}
3052+
3053+
job_dir = tmp_path
3054+
metadata_file = job_dir / "job_metadata.json"
3055+
3056+
run_job(
3057+
process,
3058+
output_file=job_dir / "out",
3059+
metadata_file=metadata_file,
3060+
api_version="2.0.0",
3061+
job_dir=job_dir,
3062+
dependencies=[],
3063+
)
3064+
3065+
tiff_files = {file for file in os.listdir(job_dir) if file.endswith(".tiff")}
3066+
assert tiff_files == {
3067+
"openEO-N50E000.tiff",
3068+
"openEO-N50E001.tiff",
3069+
}
3070+
3071+
with open(metadata_file) as f:
3072+
job_metadata = json.load(f)
3073+
3074+
items = job_metadata["items"]
3075+
print(f"items={json.dumps(items, indent=2)}")
3076+
3077+
assert len(items) == 2
3078+
assert len({item["id"] for item in items}) == 2
3079+
3080+
# at job-level rather than on Item
3081+
assert {item["properties"].get("datetime") for item in items} == {None}
3082+
assert job_metadata["start_datetime"] == "2025-04-01T00:00:00Z"
3083+
assert job_metadata["end_datetime"] == "2025-04-21T00:00:00Z"
3084+
3085+
for item in items:
3086+
assert set(item["assets"].keys()) == {"openEO"}

0 commit comments

Comments
 (0)