Skip to content

Commit f52dd00

Browse files
Merge pull request #44 from asfadmin/dev
fix: custom client id, aria gunw stacking output support
2 parents 4683cc2 + 5a9966e commit f52dd00

6 files changed

Lines changed: 88 additions & 42 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
2525
-
2626
2727
-->
28+
------
29+
## [1.0.5](https://github.com/asfadmin/Discovery-SearchAPI-v3/compare/v1.0.4...v1.0.5)
30+
### Added
31+
- Create wrapper class around asf-search `ASFSession`, `SearchAPISession`. Modifies client ID.
32+
33+
### Changed
34+
- Aria stack supports different output types
35+
- asf_search uses `SearchAPISession` by default for search queries
36+
2837
------
2938
## [1.0.4](https://github.com/asfadmin/Discovery-SearchAPI-v3/compare/v1.0.3...v1.0.4)
3039
### Added
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from typing import List
2+
from asf_search import ASFSession
3+
4+
5+
class SearchAPISession(ASFSession):
6+
def __init__(
7+
self,
8+
edl_host: str = None,
9+
edl_client_id: str = None,
10+
asf_auth_host: str = None,
11+
cmr_host: str = None,
12+
cmr_collections: str = None,
13+
auth_domains: List[str] = None,
14+
auth_cookie_names: List[str] = None,
15+
):
16+
super().__init__(
17+
edl_host,
18+
edl_client_id,
19+
asf_auth_host,
20+
cmr_host,
21+
cmr_collections,
22+
auth_domains,
23+
auth_cookie_names,
24+
)
25+
26+
self.headers.update({'Client-Id': f'SearchAPI_{self.headers.get("Client-Id")}'})

src/SearchAPI/application/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
from .logger import *
44
from .log_router import *
55
from .search import *
6+
from .SearchAPISession import *
67
from .application import *

src/SearchAPI/application/application.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818
from .output import as_output, get_asf_search_script, make_filename
1919
from .files_to_wkt import FilesToWKT
2020
from . import constants
21-
from .search import stack_aria_gunw
21+
from .SearchAPISession import SearchAPISession
22+
from .search import get_aria_groups_for_frame, stack_aria_gunw
2223
import time
24+
from asf_search.ASFSearchOptions.config import config as asf_config
2325

26+
asf_config['session'] = SearchAPISession()
2427

2528
asf.REPORT_ERRORS = False
2629
router = APIRouter(route_class=LoggingRoute)
@@ -97,14 +100,17 @@ async def query_baseline(searchOptions: BaselineSearchOptsModel = Depends(proces
97100

98101
if searchOptions.opts.dataset is not None:
99102
if searchOptions.opts.dataset[0] == asf.DATASET.ARIA_S1_GUNW:
100-
return JSONResponse(
101-
content=stack_aria_gunw(reference),
102-
status_code=200,
103-
headers= {
104-
**constants.DEFAULT_HEADERS,
105-
'Content-Disposition': f"attachment; filename={make_filename('json')}",
106-
}
107-
)
103+
if output.lower() == 'count':
104+
return Response(
105+
content=str(len(get_aria_groups_for_frame(reference)[1])),
106+
status_code=200,
107+
media_type='text/html; charset=utf-8',
108+
headers=constants.DEFAULT_HEADERS
109+
)
110+
return
111+
stack = stack_aria_gunw(reference)
112+
response_info = as_output(stack, output=output)
113+
return Response(**response_info)
108114
# Load the reference scene:
109115

110116
if output.lower() == 'python':

src/SearchAPI/application/asf_opts.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from asf_search.ASFSearchOptions import validator_map
1111

1212
from .asf_env import load_config_maturity
13-
13+
from .SearchAPISession import SearchAPISession
1414
from .logger import api_logger
1515

1616
non_search_param = ['output', 'maxresults', 'pagesize', 'maturity']
@@ -166,7 +166,7 @@ async def process_search_request(request: Request) -> SearchOptsModel:
166166
merged_args = {**query_params, **body}
167167

168168
if (token := merged_args.get('cmr_token')):
169-
session = asf.ASFSession()
169+
session = SearchAPISession()
170170
session.headers.update({'Authorization': 'Bearer {0}'.format(token)})
171171
query_opts.session = session
172172

src/SearchAPI/application/search.py

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,41 @@
22

33
import dateparser
44
import asf_search as asf
5+
from asf_search import ASFSearchResults
56
from shapely.wkt import dumps as dump_to_wkt
67
from shapely import Polygon
78

89
def stack_aria_gunw(frame: str):
10+
reference, aria_groups = get_aria_groups_for_frame(frame)
11+
12+
# track group index on each product, naively choose first granule available
13+
for idx, group in enumerate(aria_groups):
14+
group_granule_idx = None
15+
for idy, product in enumerate(group['products']):
16+
product.properties['groupIDX'] = idx
17+
if group_granule_idx is None:
18+
if product.has_baseline():
19+
group_granule_idx = idy
20+
21+
group['group_granule_idx'] = group_granule_idx
22+
23+
24+
25+
stack = ASFSearchResults([group['products'][group['group_granule_idx']] for group in aria_groups if group['group_granule_idx'] is not None])
26+
target_stack, warnings = asf.baseline.get_baseline_from_stack(reference, stack)
27+
# for product in target_stack:
28+
# group_idx = product.properties.pop('groupIDX')
29+
# aria_groups[group_idx]['perpendicularBaseline'] = product.properties['perpendicularBaseline']
30+
# aria_groups[group_idx]['temporalBaseline'] = product.properties['temporalBaseline']
31+
32+
# for group in aria_groups:
33+
# for idx, product in enumerate(group['products']):
34+
# group['products'][idx] = product.properties['sceneName']
35+
# group['date'] = group['date'].strftime('%Y-%m-%dT%H:%M:%SZ')
36+
37+
return target_stack
38+
39+
def get_aria_groups_for_frame(frame: str):
940
reference = asf.search(frame=int(frame), dataset=asf.DATASET.ARIA_S1_GUNW, maxResults=1)[0]
1041

1142
opts = asf.ASFSearchOptions(
@@ -18,44 +49,17 @@ def stack_aria_gunw(frame: str):
1849
intersectsWith=dump_to_wkt(Polygon(reference.geometry['coordinates'][0]))
1950
)
2051

21-
slc_stack = asf.search(opts=opts)
52+
slc_products = asf.search(opts=opts)
2253

2354
groups = defaultdict(list)
24-
for product in slc_stack:
55+
for product in slc_products:
2556
group_id = product.properties['platform'] + '_' + str(product.properties['orbit'])
2657
groups[group_id].append(product)
2758
# dateparser.parse(str(value))
28-
aria_groups = [
59+
return reference, [
2960
{
3061
'date': min(dateparser.parse(product.properties['startTime']) for product in group),
3162
'products': [product for product in group],
3263
}
3364
for group in groups.values()
34-
]
35-
36-
# track group index on each product, naively choose first granule available
37-
for idx, group in enumerate(aria_groups):
38-
group_granule_idx = None
39-
for idy, product in enumerate(group['products']):
40-
product.properties['groupIDX'] = idx
41-
if group_granule_idx is None:
42-
if product.has_baseline():
43-
group_granule_idx = idy
44-
45-
group['group_granule_idx'] = group_granule_idx
46-
47-
48-
49-
stack = asf.ASFSearchResults([group['products'][group['group_granule_idx']] for group in aria_groups if group['group_granule_idx'] is not None])
50-
target_stack, warnings = asf.baseline.get_baseline_from_stack(reference, stack)
51-
for product in target_stack:
52-
group_idx = product.properties.pop('groupIDX')
53-
aria_groups[group_idx]['perpendicularBaseline'] = product.properties['perpendicularBaseline']
54-
aria_groups[group_idx]['temporalBaseline'] = product.properties['temporalBaseline']
55-
56-
for group in aria_groups:
57-
for idx, product in enumerate(group['products']):
58-
group['products'][idx] = product.properties['sceneName']
59-
group['date'] = group['date'].strftime('%Y-%m-%dT%H:%M:%SZ')
60-
61-
return aria_groups
65+
]

0 commit comments

Comments
 (0)