Skip to content

Commit dc08f70

Browse files
committed
tile_grid from spatial cube: handle items #1111
1 parent c3f51b0 commit dc08f70

File tree

2 files changed

+125
-46
lines changed

2 files changed

+125
-46
lines changed

openeogeotrellis/geopysparkdatacube.py

+38-46
Original file line numberDiff line numberDiff line change
@@ -2126,21 +2126,13 @@ def add_gdalinfo_objects(assets_original):
21262126
return items # TODO: retain backwards compatibility
21272127
else:
21282128
if tile_grid:
2129-
tiles = self._save_stitched_tile_grid(max_level, str(save_filename), tile_grid, crop_bounds,
2130-
zlevel=zlevel, filename_prefix=filename_prefix)
2131-
2132-
# noinspection PyProtectedMember
2133-
return add_gdalinfo_objects(
2134-
{
2135-
str(pathlib.Path(tile._1()).name): {
2136-
"href": tile._1(),
2137-
"bbox": to_latlng_bbox(tile._2()),
2138-
"geometry": mapping(Polygon.from_bounds(*to_latlng_bbox(tile._2()))),
2139-
"type": "image/tiff; application=geotiff",
2140-
"roles": ["data"],
2141-
}
2142-
for tile in tiles
2143-
}
2129+
java_items = self._save_stitched_tile_grid(
2130+
max_level,
2131+
str(save_filename),
2132+
tile_grid,
2133+
crop_bounds,
2134+
zlevel=zlevel,
2135+
filename_prefix=filename_prefix,
21442136
)
21452137
else:
21462138
java_items = get_jvm().org.openeo.geotrellis.geotiff.package.saveRDDAllowAssetPerBand(
@@ -2152,41 +2144,41 @@ def add_gdalinfo_objects(assets_original):
21522144
gtiff_options,
21532145
)
21542146

2155-
items = {}
2156-
for java_item in java_items:
2157-
assets = {}
2158-
2159-
bbox = java_item.bbox()
2160-
2161-
for asset_key, asset in java_item.assets().items():
2162-
path = asset.path()
2163-
band_indices = asset.bandIndices()
2164-
2165-
assets[asset_key] = {
2166-
"href": str(path),
2167-
"type": "image/tiff; application=geotiff",
2168-
"roles": ["data"],
2169-
"bands": [band for i, band in enumerate(bands) if i in band_indices],
2170-
"nodata": nodata,
2171-
}
2172-
if bbox:
2173-
assets[asset_key]["bbox"] = to_latlng_bbox(bbox)
2174-
assets[asset_key]["geometry"] = mapping(
2175-
Polygon.from_bounds(*to_latlng_bbox(bbox))
2176-
)
2177-
2178-
assets = add_gdalinfo_objects(assets)
2179-
item = {
2180-
"id": java_item.id(),
2181-
"geometry": mapping(Polygon.from_bounds(*to_latlng_bbox(bbox))),
2182-
"bbox": to_latlng_bbox(bbox),
2183-
"assets": assets,
2147+
items = {}
2148+
for java_item in java_items:
2149+
assets = {}
2150+
2151+
bbox = java_item.bbox()
2152+
2153+
for asset_key, asset in java_item.assets().items():
2154+
path = asset.path()
2155+
band_indices = asset.bandIndices()
2156+
2157+
assets[asset_key] = {
2158+
"href": str(path),
2159+
"type": "image/tiff; application=geotiff",
2160+
"roles": ["data"],
2161+
"nodata": nodata,
21842162
}
2163+
if band_indices is not None:
2164+
assets[asset_key]["bands"] = [
2165+
band for i, band in enumerate(bands) if i in band_indices
2166+
],
2167+
if bbox:
2168+
assets[asset_key]["bbox"] = to_latlng_bbox(bbox)
2169+
assets[asset_key]["geometry"] = mapping(Polygon.from_bounds(*to_latlng_bbox(bbox)))
21852170

2186-
items[java_item.id()] = item
2171+
assets = add_gdalinfo_objects(assets)
2172+
item = {
2173+
"id": java_item.id(),
2174+
"geometry": mapping(Polygon.from_bounds(*to_latlng_bbox(bbox))),
2175+
"bbox": to_latlng_bbox(bbox),
2176+
"assets": assets,
2177+
}
21872178

2188-
return items
2179+
items[java_item.id()] = item
21892180

2181+
return items
21902182
else:
21912183
if not save_filename.endswith(".png"):
21922184
save_filename = save_filename + ".png"

tests/test_batch_result.py

+87
Original file line numberDiff line numberDiff line change
@@ -2757,6 +2757,93 @@ def test_unified_asset_keys_tile_grid(tmp_path):
27572757
assert set(item["assets"].keys()) == {"openEO"}
27582758

27592759

2760+
def test_unified_asset_keys_tile_grid_spatial(tmp_path):
2761+
process_graph = {
2762+
"load2": {
2763+
"process_id": "load_collection",
2764+
"arguments": {
2765+
"bands": [
2766+
"Flat:0",
2767+
"Flat:1",
2768+
"Flat:2",
2769+
],
2770+
"id": "TestCollection-LonLat16x16",
2771+
"spatial_extent": {
2772+
"west": 0,
2773+
"south": 50,
2774+
"east": 2,
2775+
"north": 51,
2776+
},
2777+
"temporal_extent": ["2025-04-01", "2025-04-21"],
2778+
},
2779+
},
2780+
"reducedimension1": {
2781+
"process_id": "reduce_dimension",
2782+
"arguments": {
2783+
"data": {"from_node": "load2"},
2784+
"dimension": "t",
2785+
"reducer": {
2786+
"process_graph": {
2787+
"first1": {
2788+
"process_id": "first",
2789+
"arguments": {"data": {"from_parameter": "data"}},
2790+
"result": True,
2791+
}
2792+
}
2793+
},
2794+
},
2795+
},
2796+
"save1": {
2797+
"process_id": "save_result",
2798+
"arguments": {
2799+
"data": {"from_node": "reducedimension1"},
2800+
"format": "GTIFF",
2801+
"options": {"tile_grid": "wgs84-1degree"},
2802+
},
2803+
"result": True,
2804+
},
2805+
}
2806+
2807+
process = {
2808+
"process_graph": process_graph,
2809+
}
2810+
2811+
job_dir = tmp_path
2812+
metadata_file = job_dir / "job_metadata.json"
2813+
2814+
run_job(
2815+
process,
2816+
output_file=job_dir / "out",
2817+
metadata_file=metadata_file,
2818+
api_version="2.0.0",
2819+
job_dir=job_dir,
2820+
dependencies=[],
2821+
)
2822+
2823+
tiff_files = {file for file in os.listdir(job_dir) if file.endswith(".tiff")}
2824+
assert tiff_files == {
2825+
"openEO-N50E000.tiff",
2826+
"openEO-N50E001.tiff",
2827+
}
2828+
2829+
with open(metadata_file) as f:
2830+
job_metadata = json.load(f)
2831+
2832+
items = job_metadata["items"]
2833+
print(f"items={json.dumps(items, indent=2)}")
2834+
2835+
assert len(items) == 2
2836+
assert len({item["id"] for item in items}) == 2
2837+
2838+
# at job-level rather than on Item
2839+
assert {item.get("properties", {}).get("datetime") for item in items} == {None}
2840+
assert job_metadata["start_datetime"] == "2025-04-01T00:00:00Z"
2841+
assert job_metadata["end_datetime"] == "2025-04-21T00:00:00Z"
2842+
2843+
for item in items:
2844+
assert set(item["assets"].keys()) == {"openEO"}
2845+
2846+
27602847
def test_unified_asset_keys_sample_by_feature(tmp_path):
27612848
process_graph = {
27622849
"load2": {

0 commit comments

Comments
 (0)