253 lines
8.7 KiB
Python
253 lines
8.7 KiB
Python
#! /usr/bin/env python
|
|
#################################################################
|
|
### This program is part of PyINT ###
|
|
### Author: chen ###
|
|
### Contact : chenweicug@126.com ###
|
|
#################################################################
|
|
|
|
import numpy as np
|
|
import os
|
|
import sys
|
|
import getopt
|
|
import time
|
|
import glob
|
|
import argparse
|
|
|
|
from pyint import _utils as ut
|
|
|
|
|
|
def _run_or_raise(call_str, stage):
|
|
rc = os.system(call_str)
|
|
if rc != 0:
|
|
raise RuntimeError('%s failed with rc=%s: %s' % (stage, rc, call_str))
|
|
return rc
|
|
|
|
|
|
def _is_binary_all_zero(path, chunk_size=1024 * 1024):
|
|
if not os.path.isfile(path):
|
|
return False
|
|
with open(path, 'rb') as handle:
|
|
while True:
|
|
chunk = handle.read(chunk_size)
|
|
if not chunk:
|
|
return True
|
|
if any(chunk):
|
|
return False
|
|
|
|
|
|
def _run_slc_diff_intf(
|
|
Mrslc,
|
|
Srslc,
|
|
MrslcPar,
|
|
SrslcPar,
|
|
OFF,
|
|
SIM_UNW,
|
|
DIFF_IFG,
|
|
rlks,
|
|
azlks,
|
|
spsflg,
|
|
azfflg,
|
|
):
|
|
call_str = (
|
|
'SLC_diff_intf ' + Mrslc + ' ' + Srslc + ' ' + MrslcPar + ' ' + SrslcPar
|
|
+ ' ' + OFF + ' ' + SIM_UNW + ' ' + DIFF_IFG + ' ' + rlks + ' ' + azlks
|
|
+ ' ' + spsflg + ' ' + azfflg + ' - 1 1'
|
|
)
|
|
_run_or_raise(call_str, 'SLC_diff_intf')
|
|
|
|
|
|
INTRODUCTION = '''
|
|
-------------------------------------------------------------------
|
|
Generate differential interferogram image from SLC using GAMMA.
|
|
|
|
'''
|
|
|
|
EXAMPLE = '''
|
|
Usage:
|
|
diff_gamma.py projectName Mdate Sdate
|
|
diff_gamma.py PacayaT163TsxHhA 20150102 20150601
|
|
-------------------------------------------------------------------
|
|
'''
|
|
|
|
|
|
def cmdLineParse():
|
|
parser = argparse.ArgumentParser(description='Coregister all of the SLCs to the reference SAR image using GAMMA.',\
|
|
formatter_class=argparse.RawTextHelpFormatter,\
|
|
epilog=INTRODUCTION+'\n'+EXAMPLE)
|
|
|
|
parser.add_argument('projectName',help='projectName for processing.')
|
|
parser.add_argument('Mdate',help='Master date.')
|
|
parser.add_argument('Sdate',help='Slave date.')
|
|
|
|
inps = parser.parse_args()
|
|
return inps
|
|
|
|
|
|
def main(argv):
|
|
|
|
start_time = time.time()
|
|
inps = cmdLineParse()
|
|
Mdate = inps.Mdate
|
|
Sdate = inps.Sdate
|
|
|
|
projectName = inps.projectName
|
|
scratchDir = os.getenv('SCRATCHDIR')
|
|
templateDir = os.getenv('TEMPLATEDIR')
|
|
templateFile = templateDir + "/" + projectName + ".template"
|
|
templateDict=ut.update_template(templateFile)
|
|
rlks = templateDict['range_looks']
|
|
azlks = templateDict['azimuth_looks']
|
|
masterDate = templateDict['masterDate']
|
|
|
|
projectDir = scratchDir + '/' + projectName
|
|
demDir = scratchDir + '/' + projectName + '/DEM'
|
|
|
|
slcDir = scratchDir + '/' + projectName + '/SLC'
|
|
rslcDir = scratchDir + '/' + projectName + '/RSLC'
|
|
ifgDir = projectDir + '/ifgrams'
|
|
if not os.path.isdir(ifgDir): os.mkdir(ifgDir)
|
|
|
|
Pair = Mdate + '-' + Sdate
|
|
workDir = ifgDir + '/' + Pair
|
|
if not os.path.isdir(workDir): os.mkdir(workDir)
|
|
|
|
#######################################################################
|
|
Mamp = rslcDir + '/' + Mdate + '/' + Mdate + '_' + rlks + 'rlks.amp'
|
|
MampPar = rslcDir + '/' + Mdate + '/' + Mdate + '_' + rlks + 'rlks.amp.par'
|
|
Samp = rslcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp'
|
|
SampPar = rslcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp.par'
|
|
|
|
Mrslc = rslcDir + '/' + Mdate + '/' + Mdate + '.rslc'
|
|
MrslcPar = rslcDir + '/' + Mdate + '/' + Mdate + '.rslc.par'
|
|
Srslc = rslcDir + '/' + Sdate + '/' + Sdate + '.rslc'
|
|
SrslcPar = rslcDir + '/' + Sdate + '/' + Sdate + '.rslc.par'
|
|
|
|
HGT = demDir + '/' + masterDate + '_' + rlks + 'rlks.rdc.dem'
|
|
|
|
MasterPar = rslcDir + '/' + masterDate + '/' + masterDate + '.rslc.par'
|
|
|
|
################# copy file for parallel processing ##########################
|
|
#Mamp = workDir + '/' + Mdate + '_' + rlks + 'rlks.amp'
|
|
#MampPar = workDir + '/' + Mdate + '_' + rlks + 'rlks.amp.par'
|
|
#Samp = workDir + '/' + Sdate + '_' + rlks + 'rlks.amp'
|
|
#SampPar = workDir + '/' + Sdate + '_' + rlks + 'rlks.amp.par'
|
|
|
|
#if not templateDict['diff_all_parallel'] == '1':
|
|
|
|
# Mrslc = workDir + '/' + Mdate + '.rslc'
|
|
# MrslcPar = workDir + '/' + Mdate + '.rslc.par'
|
|
# Srslc = workDir + '/' + Sdate + '.rslc'
|
|
# SrslcPar = workDir + '/' + Sdate + '.rslc.par'
|
|
# ut.copy_file(Mrslc0,Mrslc)
|
|
# ut.copy_file(MrslcPar0,MrslcPar)
|
|
# ut.copy_file(Srslc0,Srslc)
|
|
# ut.copy_file(SrslcPar0,SrslcPar)
|
|
|
|
#else:
|
|
|
|
# Mrslc = Mrslc0
|
|
# MrslcPar = MrslcPar0
|
|
# Srslc = Srslc0
|
|
# SrslcPar = SrslcPar0
|
|
# HGT = HGT0
|
|
# MasterPar = MasterPar0
|
|
|
|
#ut.copy_file(Mamp0,Mamp)
|
|
#ut.copy_file(MampPar0,MampPar)
|
|
#ut.copy_file(Samp0,Samp)
|
|
#ut.copy_file(SampPar0,SampPar)
|
|
|
|
#ut.copy_file(HGT0,HGT)
|
|
#ut.copy_file(MasterPar0,MasterPar)
|
|
|
|
############################################################################
|
|
|
|
OFF = workDir + '/' + Pair +'_' + rlks + 'rlks.off'
|
|
call_str = 'create_offset '+ MrslcPar + ' ' + SrslcPar + ' ' + OFF + ' 1 ' + rlks + ' ' + azlks + ' 0'
|
|
_run_or_raise(call_str, 'create_offset')
|
|
|
|
SIM_UNW = workDir + '/' + Pair + '.sim_unw'
|
|
call_str = 'phase_sim_orb ' + MrslcPar + ' ' + SrslcPar + ' ' + OFF + ' ' + HGT + ' ' + SIM_UNW + ' ' + MasterPar + ' - - 1 1'
|
|
_run_or_raise(call_str, 'phase_sim_orb')
|
|
|
|
DIFF_IFG = workDir + '/' + Pair + '_' + rlks + 'rlks.diff'
|
|
_run_slc_diff_intf(
|
|
Mrslc,
|
|
Srslc,
|
|
MrslcPar,
|
|
SrslcPar,
|
|
OFF,
|
|
SIM_UNW,
|
|
DIFF_IFG,
|
|
rlks,
|
|
azlks,
|
|
templateDict['Igram_Spsflg'],
|
|
templateDict['Igram_Azfflg'],
|
|
)
|
|
if _is_binary_all_zero(DIFF_IFG):
|
|
if templateDict['Igram_Azfflg'] == '1':
|
|
print(
|
|
'SLC_diff_intf produced an all-zero interferogram with azimuth common-band '
|
|
'filtering enabled; retrying once with Igram_Azfflg=0.'
|
|
)
|
|
os.remove(DIFF_IFG)
|
|
_run_slc_diff_intf(
|
|
Mrslc,
|
|
Srslc,
|
|
MrslcPar,
|
|
SrslcPar,
|
|
OFF,
|
|
SIM_UNW,
|
|
DIFF_IFG,
|
|
rlks,
|
|
azlks,
|
|
templateDict['Igram_Spsflg'],
|
|
'0',
|
|
)
|
|
if _is_binary_all_zero(DIFF_IFG):
|
|
raise RuntimeError(
|
|
'SLC_diff_intf produced an invalid all-zero interferogram after one bounded '
|
|
'azimuth-filter fallback; no further automatic retries will be attempted: %s' % DIFF_IFG
|
|
)
|
|
|
|
##### filtering process & coherence estimation ###########
|
|
DIFFFILT = workDir + '/' + Pair + '_' + rlks + 'rlks.diff_filt'
|
|
COHFILT = workDir + '/' + Pair + '_' + rlks + 'rlks.diff_filt.cor'
|
|
|
|
nWIDTH = ut.read_gamma_par(OFF, 'read', 'interferogram_width')
|
|
call_str = 'adf ' + DIFF_IFG + ' ' + DIFFFILT + ' ' + COHFILT + ' ' + nWIDTH + ' ' + templateDict['adf_alpha'] + ' - ' + templateDict['Igram_Cor_Win']
|
|
_run_or_raise(call_str, 'adf')
|
|
|
|
################# coherence estimation #####################
|
|
call_str = 'cc_wave ' + DIFFFILT + ' ' + Mamp + ' ' + Samp + ' ' + COHFILT + ' ' + nWIDTH + ' ' + templateDict['Igram_Cor_rwin'] + ' ' + templateDict['Igram_Cor_awin']
|
|
_run_or_raise(call_str, 'cc_wave')
|
|
|
|
|
|
################ save images #####################
|
|
call_str = 'rasmph_pwr ' + DIFFFILT + ' ' + Mamp + ' ' + nWIDTH + ' - - - - - - - - - ' + COHFILT + ' - 0.1'
|
|
_run_or_raise(call_str, 'rasmph_pwr_diff_filt')
|
|
|
|
call_str = 'rasmph_pwr ' + DIFF_IFG + ' ' + Mamp + ' ' + nWIDTH + ' - - - - - - - - - ' + COHFILT + ' - 0.1'
|
|
_run_or_raise(call_str, 'rasmph_pwr_diff')
|
|
|
|
call_str = 'rasdt_pwr ' + COHFILT + ' ' + Mamp + ' ' + nWIDTH + ' 1 0 1 1 0.1 1.0 1 '
|
|
_run_or_raise(call_str, 'rasdt_pwr_coh')
|
|
|
|
#os.remove(Mamp)
|
|
#os.remove(MampPar)
|
|
#os.remove(Samp)
|
|
#os.remove(SampPar)
|
|
|
|
#if not templateDict['diff_all_parallel'] == '1':
|
|
# if os.path.isfile(Mrslc): os.remove(Mrslc)
|
|
# if os.path.isfile(Srslc):os.remove(Srslc)
|
|
|
|
# if os.path.isfile(HGT):os.remove(HGT)
|
|
|
|
print("Subtraction of topography and flattening phase is done!")
|
|
ut.print_process_time(start_time, time.time())
|
|
sys.exit(0)
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.argv[:])
|