Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/SearchAPI/application/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
63 changes: 10 additions & 53 deletions src/SearchAPI/application/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
]
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