Skip to content

Commit f41d9fd

Browse files
committed
#334 take resolution into account when applying buffer
1 parent cff6869 commit f41d9fd

2 files changed

Lines changed: 31 additions & 17 deletions

File tree

openeo_driver/ProcessGraphDeserializer.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,18 @@ def _collection_crs(collection_id, env) -> str:
517517
crs = metadata.get('cube:dimensions', {}).get('x', {}).get('reference_system', None)
518518
return crs
519519

520+
def _collection_resolution(collection_id, env) -> str:
521+
try:
522+
metadata = env.backend_implementation.catalog.get_collection_metadata(collection_id)
523+
except CollectionNotFoundException:
524+
return None
525+
x = metadata.get('cube:dimensions', {}).get('x', {})
526+
y = metadata.get('cube:dimensions', {}).get('y', {})
527+
if ( "step" in x and "step" in y):
528+
return [x['step'], y['step']]
529+
else:
530+
return None
531+
520532

521533
def _align_extent(extent,collection_id,env,target_resolution=None):
522534
metadata = None
@@ -529,13 +541,14 @@ def _align_extent(extent,collection_id,env,target_resolution=None):
529541
if metadata is None or not metadata.get("_vito",{}).get("data_source", {}).get("realign", True):
530542
return extent
531543

532-
crs = metadata.get('cube:dimensions', {}).get('x', {}).get('reference_system', None)
544+
crs = _collection_crs(collection_id, env)
545+
collection_resolution = _collection_resolution(collection_id, env)
533546
isUTM = crs == "AUTO:42001" or "Auto42001" in str(crs)
534547

535548
x = metadata.get('cube:dimensions', {}).get('x', {})
536549
y = metadata.get('cube:dimensions', {}).get('y', {})
537-
if (target_resolution == None and "step" in x and "step" in y ):
538-
target_resolution = [x['step'], y['step']]
550+
if (target_resolution == None and collection_resolution != None ):
551+
target_resolution = collection_resolution
539552
elif target_resolution == None:
540553
return extent
541554

@@ -606,20 +619,21 @@ def _extract_load_parameters(env: EvalEnv, source_id: tuple) -> LoadParameters:
606619
if extent is not None:
607620
collection_crs = _collection_crs(collection_id[1][0], env)
608621
crs = constraint.get("resample", {}).get("target_crs", collection_crs) or collection_crs
622+
target_resolution = constraint.get("resample", {}).get("resolution", None) or _collection_resolution(collection_id[1][0], env)
609623

610624
if "pixel_buffer" in constraint:
611625

612626
buffer = constraint["pixel_buffer"]["buffer_size"]
613627

614-
if crs is not None:
628+
if (crs is not None) and target_resolution:
615629
bbox = BoundingBox.from_dict(extent, default_crs=4326)
616630
extent = bbox.reproject(crs).as_dict()
617631

618632
extent = {
619-
"west": extent["west"] - buffer[0],
620-
"east": extent["east"] + buffer[0],
621-
"south": extent["south"] - buffer[1],
622-
"north": extent["north"] + buffer[1],
633+
"west": extent["west"] - target_resolution[0] * buffer[0],
634+
"east": extent["east"] + target_resolution[0] * buffer[0],
635+
"south": extent["south"] - target_resolution[1] * buffer[1],
636+
"north": extent["north"] + target_resolution[1] * buffer[1],
623637
"crs": extent["crs"]
624638
}
625639
else:
@@ -636,7 +650,7 @@ def _extract_load_parameters(env: EvalEnv, source_id: tuple) -> LoadParameters:
636650

637651
if no_resampling:
638652
# Ensure that the extent that the user provided is aligned with the collection's native grid.
639-
target_resolution = constraint.get("resample",{}).get("resolution",None)
653+
640654
extent = _align_extent(extent, collection_id[1][0], env,target_resolution)
641655

642656
global_extent = spatial_extent_union(global_extent, extent) if global_extent else extent

tests/test_dry_run.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2133,10 +2133,10 @@ def test_complex_diamond_and_buffering(dry_run_env,dry_run_tracer):
21332133

21342134
print(loadparams)
21352135
expected_extent = {'crs': 'EPSG:32631',
2136-
'east': 704520,
2137-
'north': 5194000,
2138-
'south': 5164900,
2139-
'west': 692080}
2136+
'east': 704870,
2137+
'north': 5194350,
2138+
'south': 5164550,
2139+
'west': 691730}
21402140
assert(loadparams.global_extent == expected_extent)
21412141
assert loadparams.bands == ['B01', 'B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B8A', 'B09', 'B11', 'B12', 'SCL']
21422142
assert loadparams.pixel_buffer == None
@@ -2166,10 +2166,10 @@ def test_complex_extract_load_stac(dry_run_env,dry_run_tracer):
21662166

21672167
print(loadparams)
21682168
expected_extent = {'crs': 'EPSG:32633',
2169-
'east': 400110,
2170-
'north': 4700160,
2171-
'south': 4679930,
2172-
'west': 380190}
2169+
'east': 400450,
2170+
'north': 4700510,
2171+
'south': 4679580,
2172+
'west': 379840}
21732173
assert(loadparams.global_extent == expected_extent)
21742174
assert loadparams.bands == [ 'B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B8A', 'B11', 'B12']
21752175
assert loadparams.pixel_buffer == None

0 commit comments

Comments
 (0)