Apply current workspace changes

This commit is contained in:
2026-04-22 01:52:21 +08:00
parent cf34b9a8ed
commit cb518b431f
449 changed files with 92252 additions and 321 deletions
+372
View File
@@ -0,0 +1,372 @@
#! /usr/bin/env python
#################################################################
### This program is part of PyINT v2.1 ###
### Copy Right (c): 2017-2019, Yunmeng Cao ###
### Author: Yunmeng Cao ###
### Contact : ymcmrs@gmail.com ###
#################################################################
import time
import numpy as np
import os
import sys
import argparse
import h5py
from pyint import _utils as ut
from scipy.interpolate import griddata
from scipy.interpolate import NearestNDInterpolator
#def resamp2d_near(row0,col0,z0,row1,col1):
# xx0, yy0 = np.meshgrid((np.arange(col0) + 1), (np.arange(row0) + 1))
# xx1, yy1 = np.meshgrid((np.arange(col1) + 1), (np.arange(row1) + 1))
# xx00 = xx0/col0*col1; yy00 = yy0/row0*row1
# xx = xx00.flatten(); yy = yy00.flatten(); zz = z0.flatten()
# interp = NearestNDInterpolator(list(zip(xx, yy)), zz)
# z1 = interp(xx1, yy1)
# return z1
def generate_name(i,j):
if len(str(int(i)))==1:
i0 = '0' + str(int(i))
else:
i0 = str(int(i))
if len(str(int(j)))==1:
j0 = '0' + str(int(j))
else:
j0 = str(int(j))
name0 = i0+j0
return name0
def reduce_samp(xx,yy,zz,xg,yg,extend):
max_x = np.max(xg)+extend; min_x = np.min(xg)-extend # e.g. extend 100
max_y = np.max(yg)+extend; min_y = np.min(yg)-extend # e.g., extend 100
xx1 = xx[((min_x<xx) & (xx<max_x) & (min_y<yy) & (yy<max_y))]
yy1 = yy[((min_x<xx) & (xx<max_x) & (min_y<yy) & (yy<max_y))]
zz1 = zz[((min_x<xx) & (xx<max_x) & (min_y<yy) & (yy<max_y))]
xx1 = np.reshape(xx1,(len(xx1),))
yy1 = np.reshape(yy1,(len(yy1),))
zz1 = np.reshape(zz1,(len(zz1),))
return xx1,yy1,zz1
def interp_split(xx,yy,zz,xg,yg,split_numb):
row0 = len(yg); col0 =len(xg); data_total = np.zeros((row0,col0),dtype='float32')
drow = int(row0/split_numb); dcol = int(col0/split_numb)
for ki in range(split_numb):
if ki==(split_numb-1):
rr = np.arange(ki*drow,row0)
else:
rr = np.arange(ki*drow,(ki+1)*drow)
for kj in range(split_numb):
if kj == (split_numb-1):
cc = np.arange(kj*dcol,col0)
else:
cc = np.arange(kj*dcol,(ki+1)*dcol)
xx1,yy1,zz1 = reduce_samp(xx,yy,zz,xg,yg,100)
xgg1,ygg1 = np.meshgrid(xg,yg)
xgg2 = xgg1[rr[0]:(rr[len(rr)-1]+1),cc[0]:(cc[len(cc)-1]+1)]
ygg2 = ygg1[rr[0]:(rr[len(rr)-1]+1),cc[0]:(cc[len(cc)-1]+1)]
#points0 = np.zeros((len(xx1),2),dtype='float32'); points0[:,0]=xx1; points0[:,1] = yy1
#points0=(xx1,yy1);print(points0.shape)
#print(xx1.shape);print(yy1.shape);print(zz1.shape);print(xgg1.shape);print(xgg2.shape);
data0 = griddata((xx1,yy1),zz1,(xgg2,ygg2),method='linear')
#data0 = griddata(points0,zz1,(xgg2,ygg2),method='linear')
print(data0.shape)
data_total[rr[0]:(rr[len(rr)-1]+1),cc[0]:(cc[len(cc)-1]+1)] = data0
return data_total
def get_startSamp(nLine, nWidth, awidth, rwidth):
Ap_samp = np.arange(1,int(nLine),int(awidth)); Na0 = len(Ap_samp); LA_end = int(nLine) - Ap_samp[Na0-1]
Rp_samp = np.arange(1,int(nWidth),int(rwidth)); Nr0 = len(Rp_samp); LR_end = int(nWidth) - Rp_samp[Nr0-1]
if LA_end > (2/3*int(awidth)):
Ap_samp1 = Ap_samp
else:
Ap_samp1 = Ap_samp[0:(Na0-1)] # last batch with '-' means to the end
if LR_end > (2/3*int(rwidth)):
Rp_samp1 = Rp_samp
else:
Rp_samp1 = Rp_samp[0:(Nr0-1)] # last batch with '-' means to the end
return Ap_samp1, Rp_samp1
def subset2coord(subset, astep, rstep, nLine, nWidth, awidth, rwidth, extend):
# default awidth = 5000 rwidth = 5000 extend = 200
# astep: azimuth multilook numbers
# rstep: range multilook numbers
extend = int(extend)
Ap_samp1, Rp_samp1 = get_startSamp(nLine, nWidth, awidth, rwidth)
Na = len(Ap_samp1); Nr = len(Rp_samp1)
ii = int(subset[0:2]); jj = int(subset[2:4])
#print(ii); print(jj)
rstart = str(Rp_samp1[jj]); astart = str(Ap_samp1[ii]);
#print(nLine);print(Ap_samp1);print(Rp_samp1)
if not ii==0:
astart0 = str(int(int(astart) - extend)) # extend 200 to avoid edge effect
else:
astart0 = astart
if not jj==0:
rstart0 = str(int(int(rstart) - extend)) # extend 200 to avoid edge effect
else:
rstart0 = rstart
#print('astart')
#print(astart);print(Ap_samp1[Na-1])
if astart == str(Ap_samp1[Na-1]):
awidth0 = '-'
aend0 = str(nLine)
else:
awidth0 = str(int(int(awidth) + extend)) # extend 200 to avoid edge effect
aend0 = str(int(int(astart0) + int(awidth) + extend - 1))
if rstart == str(Rp_samp1[Nr-1]):
rwidth0 = '-'
rend0 = str(nWidth)
else:
rwidth0 = str(int(int(rwidth) + extend)) # extend 200 to avoid edge effect
rend0 = str(int(int(rstart0) + int(rwidth) + extend - 1))
xx0 = np.arange(int(rstart0), int(rend0), int(rstep)); Nx0 = len(xx0); xx1 = xx0[0:Nx0-1]
yy0 = np.arange(int(astart0), int(aend0), int(astep)); Ny0 = len(yy0); yy1 = yy0[1:Ny0]
#print(rstart0); print(rend0); print(astart0); print(aend0)
rwidth_total = int(int(rend0) - int(rstart0) + 1)
awidth_total = int(int(aend0) - int(astart0) + 1)
if np.mod(rwidth_total,int(rstep))==0:
xx1 = xx0
else:
xx1 = xx0[0:Nx0-1]
if np.mod(awidth_total,int(astep))==0:
yy1 = yy0
else:
yy1 =yy0[0:Ny0-1]
return xx1,yy1
def read_gammadata(file0,nWidth0,nLength0):
data0 = np.fromfile(file0,dtype='>f4',count=int(nLength0)*int(nWidth0)).reshape(int(nLength0), int(nWidth0))
return data0
def write_h5(datasetDict, out_file, metadata=None, ref_file=None, compression=None):
if os.path.isfile(out_file):
print('delete exsited file: {}'.format(out_file))
os.remove(out_file)
print('create HDF5 file: {} with w mode'.format(out_file))
dt = h5py.special_dtype(vlen=np.dtype('float64'))
with h5py.File(out_file, 'w') as f:
for dsName in datasetDict.keys():
data = datasetDict[dsName]
ds = f.create_dataset(dsName,
data=data,
compression=compression)
for key, value in metadata.items():
f.attrs[key] = str(value)
#print(key + ': ' + value)
print('finished writing to {}'.format(out_file))
return out_file
INTRODUCTION = '''
-------------------------------------------------------------------
Combine subset of POT results from pot_gamma_subset_jobs.py
'''
EXAMPLE = '''
Usage:
pot_gamma_subset_combine.py projectName Mdate Sdate
pot_gamma_subset_combine.py PacayaT163TsxHhA 20150601 20150613
-------------------------------------------------------------------
'''
def cmdLineParse():
parser = argparse.ArgumentParser(description='Combine subset of POT results from pot_gamma_subset_jobs.py',\
formatter_class=argparse.RawTextHelpFormatter,\
epilog=INTRODUCTION+'\n'+EXAMPLE)
parser.add_argument('projectName',help='projectName for processing.')
parser.add_argument('Mdate',help='First date.')
parser.add_argument('Sdate',help='Second date.')
#parser.add_argument('--out',dest ='out', help='Output file name.')
parser.add_argument('--rwidth',dest ='rwidth', default = '5000', help='Patch range size.')
parser.add_argument('--awidth',dest ='awidth', default = '5000', help='Patch azimuth size.')
parser.add_argument('--extend',dest ='extend', default = '200', help='Patch extend to ensure overlap regions.')
inps = parser.parse_args()
return inps
def main(argv):
inps = cmdLineParse()
start_time = time.time()
projectName = inps.projectName
rwidth = inps.rwidth; awidth = inps.awidth; extend = inps.extend
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']
processDir = scratchDir + '/' + projectName + "/PROCESS"
slcDir = scratchDir + '/' + projectName + "/SLC"
rslcDir = scratchDir + '/' + projectName + '/RSLC'
ifgDir = scratchDir + '/' + projectName + '/ifgrams'
Mdate = inps.Mdate; Sdate = inps.Sdate
Pair = Mdate + '-' + Sdate
workDir = ifgDir + '/' + Pair
MslcPar = rslcDir + '/' + Mdate + '/' + Mdate + '.rslc.par'
Samp = rslcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp'
SampPar = rslcDir + '/' + Sdate + '/' + Sdate + '_' + rlks + 'rlks.amp.par'
SWidth = ut.read_gamma_par(SampPar, 'read', 'range_samples')
SLine = ut.read_gamma_par(SampPar, 'read', 'azimuth_lines')
SampData = read_gammadata(Samp,SWidth,SLine)
nWidth = ut.read_gamma_par(MslcPar, 'read', 'range_samples'); Rp_samp_large0 = np.arange(1,int(nWidth),int(rlks))
nLine = ut.read_gamma_par(MslcPar, 'read', 'azimuth_lines'); Ap_samp_large0 = np.arange(1,int(nLine),int(azlks))
Nr0 = len(Rp_samp_large0); Na0 = len(Ap_samp_large0)
if np.mod(int(nWidth),int(rlks))==0:
Rp_samp_large = Rp_samp_large0
else:
Rp_samp_large = Rp_samp_large0[0:Nr0-1]
if np.mod(int(nLine),int(azlks))==0:
Ap_samp_large= Ap_samp_large0
else:
Ap_samp_large =Ap_samp_large0[0:Na0-1]
rr,aa = np.meshgrid(Rp_samp_large,Ap_samp_large)
Nr = len(Rp_samp_large); Na = len(Ap_samp_large)
print('Total samples along range and azimuth: ' + str(Nr) + ' ' + str(Na))
Ap_samp1,Rp_samp1 = get_startSamp(nLine, nWidth, awidth, rwidth)
Na = len(Ap_samp1); Nr = len(Rp_samp1)
xx_total = []; yy_total = []; az_total = []; rg_total = []; cc_total = [];
for i in range(Na):
for j in range(Nr):
subset0 = generate_name(i,j)
xx0,yy0 = subset2coord(subset0, azlks, rlks, nLine, nWidth, awidth, rwidth, extend)
#print(len(xx0)); print(len(yy0))
[xx0,yy0] = np.meshgrid(xx0,yy0)
az0 = workDir + '/' + Pair + '_' + subset0 + '_' + rlks + 'rlks_pot.az'
rg0 = workDir + '/' + Pair + '_' + subset0 + '_' + rlks + 'rlks_pot.rg'
cc0 = workDir + '/' + Pair + '_' + subset0 + '_' + rlks + 'rlks_pot.ccp'
off0 = workDir + '/' + Pair + '_' + subset0 + '_' + rlks + 'rlks_pot.off'
nLine0 = ut.read_gamma_par(off0, 'read', 'interferogram_azimuth_lines')
nWidth0 = ut.read_gamma_par(off0, 'read', 'interferogram_width')
#print(nWidth0);print(nLine0)
if os.path.isfile(az0):
if os.path.getsize(az0)>0:
az_data0 = read_gammadata(az0,nWidth0,nLine0)
rg_data0 = read_gammadata(rg0,nWidth0,nLine0)
cc_data0 = read_gammadata(cc0,nWidth0,nLine0)
xx_total.extend(list(xx0.flatten()));yy_total.extend(list(yy0.flatten()))
az_total.extend(list(az_data0.flatten()))
rg_total.extend(list(rg_data0.flatten()))
cc_total.extend(list(cc_data0.flatten()))
else:
data0 = np.zeros((int(nWidth0),int(nLine0)),dtype='float32')
xx_total.extend(list(data0.flatten()));yy_total.extend(list(data0.flatten()))
az_total.extend(list(data0.flatten()))
rg_total.extend(list(data0.flatten()))
cc_total.extend(list(data0.flatten()))
xx_total = np.asarray(xx_total); #print(xx_total.shape)
yy_total = np.asarray(yy_total); #print(yy_total.shape)
az_total = np.asarray(az_total); #print(az_total.shape)
rg_total = np.asarray(rg_total); #print(rg_total.shape)
cc_total = np.asarray(cc_total); #print(cc_total.shape)
xxa = xx_total[az_total!=0]; yya = yy_total[az_total!=0]; az_total1 = az_total[az_total!=0]
xxr = xx_total[rg_total!=0]; yyr = yy_total[rg_total!=0]; rg_total1 = rg_total[rg_total!=0]
xxc = xx_total[cc_total!=0]; yyc = yy_total[cc_total!=0]; cc_total1 = cc_total[cc_total!=0]
#start_time = time.time()
#az_grid_large = interp_split(xxa,yya,az_total1,Rp_samp_large,Ap_samp_large,2); print('1 finish')
#rg_grid_large = interp_split(xx_total,yy_total,rg_total1,Rp_samp_large,Ap_samp_large,2)
#cc_grid_large = interp_split(xx_total,yy_total,cc_total1,Rp_samp_large,Ap_samp_large,2)
#start_time = time.time()
#interp_az = NearestNDInterpolator(list(zip(xxa, yya)), az_total1)
#az_grid_large = interp_az(rr, aa)
#interp_rg = NearestNDInterpolator(list(zip(xxr, yyr)), rg_total1)
#rg_grid_large = interp_rg(rr, aa)
#interp_cc = NearestNDInterpolator(list(zip(xxc, yyc)), cc_total1)
#cc_grid_large = interp_cc(rr, aa)
#ut.print_process_time(start_time, time.time())
method0 = 'nearest' # keep 0 values to make good mask
print('Start to combine all of the sub-patches ...')
start_time = time.time()
az_grid_large = griddata((xxa,yya),az_total1,(rr,aa),method=method0); print('Azimuth interpolate finish')
#ut.print_process_time(start_time, time.time())
#start_time = time.time()
rg_grid_large = griddata((xxr,yyr),rg_total1,(rr,aa),method=method0); print('Range interpolate finish')
#ut.print_process_time(start_time, time.time())
#start_time = time.time()
cc_grid_large = griddata((xxc,yyc),cc_total1,(rr,aa),method=method0); print('CCP interpolate finish')
ut.print_process_time(start_time, time.time())
az_grid_large[SampData==0]=0
rg_grid_large[SampData==0]=0
cc_grid_large[SampData==0]=0
row1,col1 = rr.shape
meta = dict()
meta['WIDTH'] = str(col1); meta['LENGTH'] = str(row1); meta['UNIT'] = 'm'
meta['FILE_TYPE'] ='offset_tracking'; meta['DATE12'] = Pair
datasetDict = dict()
datasetDict['azimuth'] = az_grid_large
#datasetDict['range'] = rg_grid_large
#datasetDict['ccp'] = cc_grid_large
#if inps.out:
# out_file = inps.out
#else:
out_file = Pair + '_pot_az.h5'
write_h5(datasetDict, out_file, metadata=meta, ref_file=None, compression=None)
datasetDict = dict()
#datasetDict['azimuth'] = az_grid_large
datasetDict['range'] = rg_grid_large
#datasetDict['ccp'] = cc_grid_large
out_file = Pair + '_pot_rg.h5'
write_h5(datasetDict, out_file, metadata=meta, ref_file=None, compression=None)
datasetDict = dict()
#datasetDict['azimuth'] = az_grid_large
#datasetDict['range'] = rg_grid_large
datasetDict['coherence'] = cc_grid_large
#meta['FILE_TYPE'] = 'coherence'
out_file = Pair + '_pot_cc.h5'
write_h5(datasetDict, out_file, metadata=meta, ref_file=None, compression=None)
print("POT calculation done: " + Pair)
#sys.exit(1)
if __name__ == '__main__':
main(sys.argv[:])