186 lines
7.6 KiB
Python
186 lines
7.6 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
# Author: Cunren Liang
|
||
|
# Copyright 2021
|
||
|
|
||
|
import os
|
||
|
import copy
|
||
|
import glob
|
||
|
import shutil
|
||
|
import argparse
|
||
|
import numpy as np
|
||
|
|
||
|
import isce
|
||
|
import isceobj
|
||
|
import s1a_isce_utils as ut
|
||
|
from isceobj.Sensor.TOPS import createTOPSSwathSLCProduct
|
||
|
from isceobj.TopsProc.runIon import renameFile
|
||
|
|
||
|
|
||
|
def createParser():
|
||
|
parser = argparse.ArgumentParser(description='check overlap among all acquisitons')
|
||
|
parser.add_argument('-r', '--reference', dest='reference', type=str, required=True,
|
||
|
help='directory with reference acquistion')
|
||
|
parser.add_argument('-s', '--secondarys', dest='secondarys', type=str, required=True,
|
||
|
help='directory with secondarys acquistions')
|
||
|
parser.add_argument('-g', '--geom_reference', dest='geom_reference', type=str, default=None,
|
||
|
help='directory with geometry of reference')
|
||
|
|
||
|
return parser
|
||
|
|
||
|
|
||
|
def cmdLineParse(iargs = None):
|
||
|
parser = createParser()
|
||
|
return parser.parse_args(args=iargs)
|
||
|
|
||
|
|
||
|
def main(iargs=None):
|
||
|
'''
|
||
|
check overlap among all acquistions, only keep the bursts that in the common overlap,
|
||
|
and then renumber the bursts.
|
||
|
'''
|
||
|
inps = cmdLineParse(iargs)
|
||
|
|
||
|
referenceDir = inps.reference
|
||
|
secondaryDir = sorted(glob.glob(os.path.join(inps.secondarys, '*')))
|
||
|
|
||
|
acquistionDir = [referenceDir] + secondaryDir
|
||
|
|
||
|
|
||
|
invalidSwath = []
|
||
|
for i in [1, 2, 3]:
|
||
|
for x in acquistionDir:
|
||
|
if not (os.path.isdir(os.path.join(x, 'IW{}'.format(i))) and os.path.isfile(os.path.join(x, 'IW{}.xml'.format(i)))):
|
||
|
invalidSwath.append(i)
|
||
|
break
|
||
|
|
||
|
if invalidSwath == [1, 2, 3]:
|
||
|
raise Exception('there are no common swaths among the acquistions')
|
||
|
else:
|
||
|
validSwath = [i for i in [1, 2, 3] if i not in invalidSwath]
|
||
|
print('valid swath from scanning acquistion directory: {}'.format(validSwath))
|
||
|
|
||
|
|
||
|
invalidSwath2 = []
|
||
|
for swath in validSwath:
|
||
|
referenceSwath = ut.loadProduct(os.path.join(referenceDir, 'IW{0}.xml'.format(swath)))
|
||
|
|
||
|
burstoffsetAll = []
|
||
|
minBurstAll = []
|
||
|
maxBurstAll = []
|
||
|
secondarySwathAll = []
|
||
|
for secondaryDirX in secondaryDir:
|
||
|
secondarySwath = ut.loadProduct(os.path.join(secondaryDirX, 'IW{0}.xml'.format(swath)))
|
||
|
|
||
|
secondarySwathAll.append(secondarySwath)
|
||
|
|
||
|
burstoffset, minBurst, maxBurst = referenceSwath.getCommonBurstLimits(secondarySwath)
|
||
|
burstoffsetAll.append(burstoffset)
|
||
|
minBurstAll.append(minBurst)
|
||
|
maxBurstAll.append(maxBurst)
|
||
|
|
||
|
minBurst = max(minBurstAll)
|
||
|
maxBurst = min(maxBurstAll)
|
||
|
|
||
|
numBurst = maxBurst - minBurst
|
||
|
|
||
|
|
||
|
|
||
|
if minBurst >= maxBurst:
|
||
|
invalidSwath2.append(swath)
|
||
|
else:
|
||
|
#add reference
|
||
|
swathAll = [referenceSwath] + secondarySwathAll
|
||
|
burstoffsetAll = [0] + burstoffsetAll
|
||
|
|
||
|
for dirx, swathx, burstoffsetx in zip(acquistionDir, swathAll, burstoffsetAll):
|
||
|
|
||
|
swathTmp = createTOPSSwathSLCProduct()
|
||
|
swathTmp.configure()
|
||
|
|
||
|
#change reserved burst properties and remove non-overlap bursts
|
||
|
for jj in range(len(swathx.bursts)):
|
||
|
ii = jj - burstoffsetx
|
||
|
#burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), os.path.basename(swathx.bursts[jj].image.filename))
|
||
|
burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), 'burst_%02d'%(jj+1) + '.slc')
|
||
|
if minBurst <= ii < maxBurst:
|
||
|
kk = ii - minBurst
|
||
|
#change burst properties
|
||
|
swathx.bursts[jj].burstNumber = kk + 1
|
||
|
swathx.bursts[jj].image.filename = os.path.join(os.path.dirname(swathx.bursts[jj].image.filename), 'burst_%02d'%(kk+1) + '.slc')
|
||
|
swathTmp.bursts.append(swathx.bursts[jj])
|
||
|
else:
|
||
|
#remove non-overlap bursts
|
||
|
#os.remove(burstFileName)
|
||
|
os.remove(burstFileName+'.vrt')
|
||
|
os.remove(burstFileName+'.xml')
|
||
|
#remove geometry files accordingly if provided
|
||
|
if dirx == referenceDir:
|
||
|
if inps.geom_reference is not None:
|
||
|
for fileType in ['hgt', 'incLocal', 'lat', 'lon', 'los', 'shadowMask']:
|
||
|
geomFileName = os.path.join(os.path.abspath(inps.geom_reference), 'IW{}'.format(swath), fileType + '_%02d'%(jj+1) + '.rdr')
|
||
|
os.remove(geomFileName)
|
||
|
os.remove(geomFileName+'.vrt')
|
||
|
os.remove(geomFileName+'.xml')
|
||
|
|
||
|
|
||
|
#change reserved burst file names
|
||
|
for jj in range(len(swathx.bursts)):
|
||
|
ii = jj - burstoffsetx
|
||
|
#burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), os.path.basename(swathx.bursts[jj].image.filename))
|
||
|
burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), 'burst_%02d'%(jj+1) + '.slc')
|
||
|
if minBurst <= ii < maxBurst:
|
||
|
kk = ii - minBurst
|
||
|
burstFileNameNew = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), 'burst_%02d'%(kk+1) + '.slc')
|
||
|
if burstFileName != burstFileNameNew:
|
||
|
img = isceobj.createImage()
|
||
|
img.load(burstFileName + '.xml')
|
||
|
img.setFilename(burstFileNameNew)
|
||
|
#img.extraFilename = burstFileNameNew+'.vrt'
|
||
|
img.renderHdr()
|
||
|
|
||
|
#still use original vrt
|
||
|
os.remove(burstFileName+'.xml')
|
||
|
os.remove(burstFileNameNew+'.vrt')
|
||
|
os.rename(burstFileName+'.vrt', burstFileNameNew+'.vrt')
|
||
|
#change geometry file names accordingly if provided
|
||
|
if dirx == referenceDir:
|
||
|
if inps.geom_reference is not None:
|
||
|
for fileType in ['hgt', 'incLocal', 'lat', 'lon', 'los', 'shadowMask']:
|
||
|
geomFileName = os.path.join(os.path.abspath(inps.geom_reference), 'IW{}'.format(swath), fileType + '_%02d'%(jj+1) + '.rdr')
|
||
|
geomFileNameNew = os.path.join(os.path.abspath(inps.geom_reference), 'IW{}'.format(swath), fileType + '_%02d'%(kk+1) + '.rdr')
|
||
|
if geomFileName != geomFileNameNew:
|
||
|
renameFile(geomFileName, geomFileNameNew)
|
||
|
|
||
|
|
||
|
#change swath properties
|
||
|
swathx.bursts = swathTmp.bursts
|
||
|
swathx.numberOfBursts = numBurst
|
||
|
|
||
|
#remove original and write new
|
||
|
os.remove( os.path.join(dirx, 'IW{}.xml'.format(swath)) )
|
||
|
ut.saveProduct(swathx, os.path.join(dirx, 'IW{}.xml'.format(swath)))
|
||
|
|
||
|
|
||
|
#remove invalid swaths
|
||
|
invalidSwath3 = list(sorted(set(invalidSwath+invalidSwath2)))
|
||
|
for swath in invalidSwath3:
|
||
|
for dirx in acquistionDir:
|
||
|
iwdir = os.path.join(dirx, 'IW{}'.format(swath))
|
||
|
iwxml = os.path.join(dirx, 'IW{}.xml'.format(swath))
|
||
|
if os.path.isdir(iwdir):
|
||
|
shutil.rmtree(iwdir)
|
||
|
if os.path.isfile(iwxml):
|
||
|
os.remove(iwxml)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
'''
|
||
|
Main driver.
|
||
|
'''
|
||
|
# Main Driver
|
||
|
main()
|
||
|
|
||
|
|
||
|
|