diff --git a/CHANGELOG.md b/CHANGELOG.md index a4db33a..74ef5ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,7 +32,9 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Changed - Aria stack supports different output types +- Aria stacking uses aria frame id instead of frame number for stacking - asf_search uses `SearchAPISession` by default for search queries +- bump asf-search to v9.0.4 ------ ## [1.0.4](https://github.com/asfadmin/Discovery-SearchAPI-v3/compare/v1.0.3...v1.0.4) diff --git a/requirements.txt b/requirements.txt index f8ed52f..01b83c9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,8 +22,9 @@ ujson==5.7.0 uvicorn==0.21.1 watchfiles==0.19.0 -asf_search==9.0.2 +asf_search==9.0.4 python-json-logger==2.0.7 +asf_enumeration pyshp==2.1.3 geopandas diff --git a/src/SearchAPI/application/application.py b/src/SearchAPI/application/application.py index ecde580..f44fbe4 100644 --- a/src/SearchAPI/application/application.py +++ b/src/SearchAPI/application/application.py @@ -107,7 +107,7 @@ async def query_baseline(searchOptions: BaselineSearchOptsModel = Depends(proces media_type='text/html; charset=utf-8', headers=constants.DEFAULT_HEADERS ) - return + stack = stack_aria_gunw(reference) response_info = as_output(stack, output=output) return Response(**response_info) diff --git a/src/SearchAPI/application/search.py b/src/SearchAPI/application/search.py index 7c43303..1291adf 100644 --- a/src/SearchAPI/application/search.py +++ b/src/SearchAPI/application/search.py @@ -2,64 +2,21 @@ import dateparser import asf_search as asf -from asf_search import ASFSearchResults +from asf_search import ASFSearchResults, ASFProduct from shapely.wkt import dumps as dump_to_wkt from shapely import Polygon -def stack_aria_gunw(frame: str): - reference, aria_groups = get_aria_groups_for_frame(frame) +from asf_enumeration import aria_s1_gunw - # track group index on each product, naively choose first granule available - for idx, group in enumerate(aria_groups): - group_granule_idx = None - for idy, product in enumerate(group['products']): - product.properties['groupIDX'] = idx - if group_granule_idx is None: - if product.has_baseline(): - group_granule_idx = idy - - group['group_granule_idx'] = group_granule_idx - - +def stack_aria_gunw(frame_id: str): + reference, aria_groups = get_aria_groups_for_frame(frame_id) - stack = ASFSearchResults([group['products'][group['group_granule_idx']] for group in aria_groups if group['group_granule_idx'] is not None]) + stack = ASFSearchResults([group.products[0] for group in aria_groups]) target_stack, warnings = asf.baseline.get_baseline_from_stack(reference, stack) - # for product in target_stack: - # group_idx = product.properties.pop('groupIDX') - # aria_groups[group_idx]['perpendicularBaseline'] = product.properties['perpendicularBaseline'] - # aria_groups[group_idx]['temporalBaseline'] = product.properties['temporalBaseline'] - - # for group in aria_groups: - # for idx, product in enumerate(group['products']): - # group['products'][idx] = product.properties['sceneName'] - # group['date'] = group['date'].strftime('%Y-%m-%dT%H:%M:%SZ') - - return target_stack - -def get_aria_groups_for_frame(frame: str): - reference = asf.search(frame=int(frame), dataset=asf.DATASET.ARIA_S1_GUNW, maxResults=1)[0] - opts = asf.ASFSearchOptions( - relativeOrbit=reference.properties['pathNumber'], - processingLevel=asf.PRODUCT_TYPE.SLC, - dataset=asf.DATASET.SENTINEL1, - beamMode='IW', - polarization=['VV','VV+VH'], - flightDirection=reference.properties['flightDirection'], - intersectsWith=dump_to_wkt(Polygon(reference.geometry['coordinates'][0])) - ) - - slc_products = asf.search(opts=opts) + return target_stack - groups = defaultdict(list) - for product in slc_products: - group_id = product.properties['platform'] + '_' + str(product.properties['orbit']) - groups[group_id].append(product) - # dateparser.parse(str(value)) - return reference, [ - { - 'date': min(dateparser.parse(product.properties['startTime']) for product in group), - 'products': [product for product in group], - } - for group in groups.values() - ] \ No newline at end of file +def get_aria_groups_for_frame(frame: str) -> tuple[ASFProduct, list[aria_s1_gunw.Sentinel1Acquisition]]: + aria_frame = aria_s1_gunw.get_frame(frame_id=int(frame)) + groups = aria_s1_gunw.get_acquisitions(aria_frame) + return groups[0].products[0], groups