267 lines
9.8 KiB
Python
Executable File
267 lines
9.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# Author: Piyush Agram
|
|
# Heresh Fattahi: Adopted for stack
|
|
|
|
import isce
|
|
import isceobj
|
|
import numpy as np
|
|
from isceobj.Util.Poly2D import Poly2D
|
|
import argparse
|
|
import os
|
|
import copy
|
|
from isceobj.Sensor.TOPS import createTOPSSwathSLCProduct
|
|
from mroipac.correlation.correlation import Correlation
|
|
import s1a_isce_utils as ut
|
|
import gdal
|
|
|
|
|
|
def createParser():
|
|
parser = argparse.ArgumentParser( description='Use polynomial offsets and create burst by burst interferograms')
|
|
|
|
parser.add_argument('-m', '--master', dest='master', type=str, required=True,
|
|
help='Directory with master acquisition')
|
|
|
|
parser.add_argument('-s', '--slave', dest='slave', type=str, required=True,
|
|
help='Directory with slave acquisition')
|
|
|
|
parser.add_argument('-f', '--flatten', dest='flatten', action='store_true', default=False,
|
|
help='Flatten the interferograms with offsets if needed')
|
|
|
|
parser.add_argument('-i', '--interferogram', dest='interferogram', type=str, default='interferograms',
|
|
help='Path for the interferogram')
|
|
|
|
parser.add_argument('-p', '--interferogram_prefix', dest='intprefix', type=str, default='int',
|
|
help='Prefix for the interferogram')
|
|
parser.add_argument('-v', '--overlap', dest='overlap', action='store_true', default=False,
|
|
help='Flatten the interferograms with offsets if needed')
|
|
|
|
return parser
|
|
|
|
def cmdLineParse(iargs = None):
|
|
parser = createParser()
|
|
return parser.parse_args(args=iargs)
|
|
|
|
|
|
def multiply(masname, slvname, outname, rngname1, rngname2, fact, masterFrame,
|
|
flatten=False):
|
|
|
|
print('multiply')
|
|
masImg = isceobj.createSlcImage()
|
|
masImg.load( masname + '.xml')
|
|
|
|
width = masImg.getWidth()
|
|
length = masImg.getLength()
|
|
|
|
ds = gdal.Open(masname + '.vrt', gdal.GA_ReadOnly)
|
|
master = ds.GetRasterBand(1).ReadAsArray()
|
|
ds = None
|
|
ds = gdal.Open(slvname + '.vrt', gdal.GA_ReadOnly)
|
|
slave = ds.GetRasterBand(1).ReadAsArray()
|
|
ds = None
|
|
print('read')
|
|
#master = np.memmap(masname, dtype=np.complex64, mode='r', shape=(length,width))
|
|
#slave = np.memmap(slvname, dtype=np.complex64, mode='r', shape=(length, width))
|
|
|
|
if os.path.exists(rngname1):
|
|
rng1 = np.memmap(rngname1, dtype=np.float32, mode='r', shape=(length,width))
|
|
else:
|
|
print('No range offsets provided')
|
|
rng1 = np.zeros((length,width))
|
|
|
|
if os.path.exists(rngname2):
|
|
rng2 = np.memmap(rngname2, dtype=np.float32, mode='r', shape=(length,width))
|
|
else:
|
|
print('No range offsets provided')
|
|
rng2 = np.zeros((length,width))
|
|
|
|
rng12 = rng2 - rng1
|
|
|
|
cJ = np.complex64(-1j)
|
|
|
|
#Zero out anytging outside the valid region:
|
|
ifg = np.memmap(outname, dtype=np.complex64, mode='w+', shape=(length,width))
|
|
firstS = masterFrame.firstValidSample
|
|
lastS = masterFrame.firstValidSample + masterFrame.numValidSamples -1
|
|
firstL = masterFrame.firstValidLine
|
|
lastL = masterFrame.firstValidLine + masterFrame.numValidLines - 1
|
|
for kk in range(firstL,lastL + 1):
|
|
ifg[kk,firstS:lastS + 1] = master[kk,firstS:lastS + 1] * np.conj(slave[kk,firstS:lastS + 1])
|
|
if flatten:
|
|
phs = np.exp(cJ*fact*rng12[kk,firstS:lastS + 1])
|
|
ifg[kk,firstS:lastS + 1] *= phs
|
|
|
|
|
|
####
|
|
master=None
|
|
slave=None
|
|
ifg = None
|
|
|
|
objInt = isceobj.createIntImage()
|
|
objInt.setFilename(outname)
|
|
objInt.setWidth(width)
|
|
objInt.setLength(length)
|
|
objInt.setAccessMode('READ')
|
|
#objInt.createImage()
|
|
#objInt.finalizeImage()
|
|
objInt.renderHdr()
|
|
objInt.renderVRT()
|
|
return objInt
|
|
|
|
|
|
def main(iargs=None):
|
|
'''Create overlap interferograms.
|
|
'''
|
|
inps=cmdLineParse(iargs)
|
|
|
|
if inps.overlap:
|
|
masterSwathList = ut.getSwathList(os.path.join(inps.master, 'overlap'))
|
|
slaveSwathList = ut.getSwathList(os.path.join(inps.slave, 'overlap'))
|
|
else:
|
|
masterSwathList = ut.getSwathList(inps.master)
|
|
slaveSwathList = ut.getSwathList(inps.slave)
|
|
swathList = list(sorted(set(masterSwathList+slaveSwathList)))
|
|
|
|
for swath in swathList:
|
|
IWstr = 'IW{0}'.format(swath)
|
|
if inps.overlap:
|
|
ifgdir = os.path.join(inps.interferogram, 'overlap', 'IW{0}'.format(swath))
|
|
else:
|
|
ifgdir = os.path.join(inps.interferogram, 'IW{0}'.format(swath))
|
|
|
|
if not os.path.exists(ifgdir):
|
|
os.makedirs(ifgdir)
|
|
|
|
####Load relevant products
|
|
if inps.overlap:
|
|
topMaster = ut.loadProduct(os.path.join(inps.master , 'overlap','IW{0}_top.xml'.format(swath)))
|
|
botMaster = ut.loadProduct(os.path.join(inps.master ,'overlap', 'IW{0}_bottom.xml'.format(swath)))
|
|
topCoreg = ut.loadProduct(os.path.join(inps.slave, 'overlap', 'IW{0}_top.xml'.format(swath)))
|
|
botCoreg = ut.loadProduct(os.path.join(inps.slave, 'overlap', 'IW{0}_bottom.xml'.format(swath)))
|
|
|
|
else:
|
|
topMaster = ut.loadProduct(os.path.join(inps.master , 'IW{0}.xml'.format(swath)))
|
|
topCoreg = ut.loadProduct(os.path.join(inps.slave , 'IW{0}.xml'.format(swath)))
|
|
|
|
if inps.overlap:
|
|
coregdir = os.path.join(inps.slave, 'overlap', 'IW{0}'.format(swath))
|
|
else:
|
|
coregdir = os.path.join(inps.slave,'IW{0}'.format(swath))
|
|
|
|
topIfg = ut.coregSwathSLCProduct()
|
|
topIfg.configure()
|
|
|
|
if inps.overlap:
|
|
botIfg = ut.coregSwathSLCProduct()
|
|
botIfg.configure()
|
|
|
|
minMaster = topMaster.bursts[0].burstNumber
|
|
maxMaster = topMaster.bursts[-1].burstNumber
|
|
|
|
minSlave = topCoreg.bursts[0].burstNumber
|
|
maxSlave = topCoreg.bursts[-1].burstNumber
|
|
|
|
minBurst = max(minSlave, minMaster)
|
|
maxBurst = min(maxSlave, maxMaster)
|
|
print ('minSlave,maxSlave',minSlave, maxSlave)
|
|
print ('minMaster,maxMaster',minMaster, maxMaster)
|
|
print ('minBurst, maxBurst: ', minBurst, maxBurst)
|
|
|
|
for ii in range(minBurst, maxBurst + 1):
|
|
|
|
####Process the top bursts
|
|
master = topMaster.bursts[ii-minMaster]
|
|
slave = topCoreg.bursts[ii-minSlave]
|
|
|
|
print('matching burst numbers: ',master.burstNumber, slave.burstNumber)
|
|
|
|
mastername = master.image.filename
|
|
slavename = slave.image.filename
|
|
|
|
if inps.overlap:
|
|
rdict = { 'rangeOff1' : os.path.join(inps.master, 'overlap', IWstr, 'range_top_%02d_%02d.off'%(ii,ii+1)),
|
|
'rangeOff2' : os.path.join(inps.slave, 'overlap', IWstr, 'range_top_%02d_%02d.off'%(ii,ii+1)),
|
|
'azimuthOff': os.path.join(inps.slave, 'overlap', IWstr, 'azimuth_top_%02d_%02d.off'%(ii,ii+1))}
|
|
|
|
intname = os.path.join(ifgdir, '%s_top_%02d_%02d.int'%(inps.intprefix,ii,ii+1))
|
|
|
|
else:
|
|
|
|
rdict = {'rangeOff1' : os.path.join(inps.master, IWstr, 'range_%02d.off'%(ii)),
|
|
'rangeOff2' : os.path.join(inps.slave, IWstr, 'range_%02d.off'%(ii)),
|
|
'azimuthOff1': os.path.join(inps.slave, IWstr, 'azimuth_%02d.off'%(ii))}
|
|
|
|
intname = os.path.join(ifgdir, '%s_%02d.int'%(inps.intprefix,ii))
|
|
|
|
|
|
ut.adjustCommonValidRegion(master,slave)
|
|
fact = 4 * np.pi * slave.rangePixelSize / slave.radarWavelength
|
|
intimage = multiply(mastername, slavename, intname,
|
|
rdict['rangeOff1'], rdict['rangeOff2'], fact, master, flatten=inps.flatten)
|
|
|
|
burst = copy.deepcopy(master)
|
|
burst.image = intimage
|
|
burst.burstNumber = ii
|
|
topIfg.bursts.append(burst)
|
|
|
|
|
|
if inps.overlap:
|
|
####Process the bottom bursts
|
|
master = botMaster.bursts[ii-minMaster]
|
|
slave = botCoreg.bursts[ii-minSlave]
|
|
|
|
|
|
mastername = master.image.filename
|
|
slavename = slave.image.filename
|
|
# rdict = {'rangeOff' : os.path.join(coregdir, 'range_bot_%02d_%02d.off'%(ii,ii+1)),
|
|
# 'azimuthOff': os.path.join(coregdir, 'azimuth_bot_%02d_%02d.off'%(ii,ii+1))}
|
|
|
|
rdict = { 'rangeOff1' : os.path.join(inps.master, 'overlap', IWstr, 'range_bot_%02d_%02d.off'%(ii,ii+1)),
|
|
'rangeOff2' : os.path.join(inps.slave, 'overlap', IWstr, 'range_bot_%02d_%02d.off'%(ii,ii+1)),
|
|
'azimuthOff': os.path.join(inps.slave, 'overlap', IWstr, 'azimuth_bot_%02d_%02d.off'%(ii,ii+1))}
|
|
|
|
|
|
print ('rdict: ', rdict)
|
|
|
|
ut.adjustCommonValidRegion(master,slave)
|
|
intname = os.path.join(ifgdir, '%s_bot_%02d_%02d.int'%(inps.intprefix,ii,ii+1))
|
|
fact = 4 * np.pi * slave.rangePixelSize / slave.radarWavelength
|
|
|
|
#intimage = multiply(mastername, slavename, intname,
|
|
# rdict['rangeOff'], fact, master, flatten=True)
|
|
|
|
intimage = multiply(mastername, slavename, intname,
|
|
rdict['rangeOff1'], rdict['rangeOff2'], fact, master, flatten=inps.flatten)
|
|
|
|
burst = copy.deepcopy(master)
|
|
burst.burstNumber = ii
|
|
burst.image = intimage
|
|
botIfg.bursts.append(burst)
|
|
|
|
|
|
topIfg.numberOfBursts = len(topIfg.bursts)
|
|
if hasattr(topCoreg, 'reference'):
|
|
topIfg.reference = topCoreg.reference
|
|
else:
|
|
topIfg.reference = topMaster.reference
|
|
|
|
print('Type: ',type(topIfg.reference))
|
|
|
|
if inps.overlap:
|
|
ut.saveProduct(topIfg, ifgdir + '_top.xml')
|
|
botIfg.numberOfBursts = len(botIfg.bursts)
|
|
botIfg.reference = botCoreg.reference
|
|
print(botIfg.reference)
|
|
ut.saveProduct(botIfg, ifgdir + '_bottom.xml')
|
|
else:
|
|
ut.saveProduct(topIfg, ifgdir + '.xml')
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
'''
|
|
Main driver.
|
|
'''
|
|
main()
|
|
|