Merge branch 'master' into cmake

LT1AB
Ryan Burns 2020-05-02 12:32:20 -07:00
commit 7cf564582a
35 changed files with 856 additions and 203 deletions

View File

@ -152,6 +152,7 @@ py36-scipy +gcc7 +openblas
py36-matplotlib +cairo +tkinter py36-matplotlib +cairo +tkinter
py36-matplotlib-basemap py36-matplotlib-basemap
py36-h5py py36-h5py
py36-gdal
``` ```
### Python3 Convention ### Python3 Convention

View File

@ -216,10 +216,11 @@ else:
### End of GPU branch-specific modifications ### End of GPU branch-specific modifications
os.makedirs(inst, exist_ok=True)
env.Install(inst, '__init__.py') env.Install(inst, '__init__.py')
env.Install(inst, 'release_history.py') env.Install(inst, 'release_history.py')
if not os.path.exists(inst):
os.makedirs(inst)
v = 0 v = 0
if isrerun == 'no': if isrerun == 'no':

View File

@ -82,7 +82,7 @@ def main():
parser.add_argument('-n', '--uname', type = str, dest = 'uname', default = None, help = 'User name if using a server that requires authentication') parser.add_argument('-n', '--uname', type = str, dest = 'uname', default = None, help = 'User name if using a server that requires authentication')
parser.add_argument('-w', '--password', type = str, dest = 'password', default = None, help = 'Password if using a server that requires authentication') parser.add_argument('-w', '--password', type = str, dest = 'password', default = None, help = 'Password if using a server that requires authentication')
parser.add_argument('-t', '--type', type = str, dest = 'type', default = 'version3', help = \ parser.add_argument('-t', '--type', type = str, dest = 'type', default = 'version3', help = \
'Use version 3 or version 2 SRTM') 'Use version 3 or version 2 SRTM, or nasadem')
parser.add_argument('-x', '--noextras', action = 'store_true', dest = 'noextras', help = 'Use this flag if the filenames do not have extra part') parser.add_argument('-x', '--noextras', action = 'store_true', dest = 'noextras', help = 'Use this flag if the filenames do not have extra part')
parser.add_argument('-u', '--url', type = str, dest = 'url', default = None, help = \ parser.add_argument('-u', '--url', type = str, dest = 'url', default = None, help = \
'If --type=version2 then this is part of the url where the DEM files are located. The actual location must be' + \ 'If --type=version2 then this is part of the url where the DEM files are located. The actual location must be' + \
@ -91,10 +91,13 @@ def main():
args = parser.parse_args() args = parser.parse_args()
#first get the url,uname and password since are needed in the constructor #first get the url,uname and password since are needed in the constructor
ds = createDemStitcher(args.type) ds = createDemStitcher(args.type)
ds.configure() ds.configure()
#NASADEM only available in 1-arc sec resolution
if(args.type == 'nasadem'):
args.source == 1
if(args.url): if(args.url):
if(args.type == 'version3'): if(args.type == 'version3'):
if(args.source == 1): if(args.source == 1):

View File

@ -3,12 +3,14 @@
# Author: Bekaert David # Author: Bekaert David
# Year: 2017 # Year: 2017
import os
import sys
import argparse
from osgeo import gdal
import isce import isce
import isceobj import isceobj
import sys
from osgeo import gdal
import argparse
import os
# command line parsing of input file # command line parsing of input file
def cmdLineParse(): def cmdLineParse():
@ -20,17 +22,14 @@ def cmdLineParse():
return parser.parse_args() return parser.parse_args()
# main script def gdal2isce_xml(fname):
if __name__ == '__main__': """
''' Generate ISCE xml file from gdal supported file
Main driver.
'''
# Parse command line Example: import isce
inps = cmdLineParse() from applications.gdal2isce_xml import gdal2isce_xml
# check if the input file exist xml_file = gdal2isce_xml(fname+'.vrt')
if not os.path.isfile(inps.fname): """
raise Exception('Input file is not found ....')
# open the GDAL file and get typical data informationi # open the GDAL file and get typical data informationi
GDAL2ISCE_DATATYPE = { GDAL2ISCE_DATATYPE = {
@ -57,47 +56,46 @@ if __name__ == '__main__':
# } # }
# check if the input file is a vrt # check if the input file is a vrt
filename, file_extension = os.path.splitext(inps.fname) fbase, fext = os.path.splitext(fname)
print(file_extension) print(fext)
if file_extension == ".vrt": if fext == ".vrt":
inps.outname = filename outname = fbase
else: else:
inps.outname = inps.fname outname = fname
print(inps.outname) print(outname)
# open the GDAL file and get typical data informationi # open the GDAL file and get typical ds information
data = gdal.Open(inps.fname, gdal.GA_ReadOnly) ds = gdal.Open(fname, gdal.GA_ReadOnly)
width = data.RasterXSize width = ds.RasterXSize
length = data.RasterYSize length = ds.RasterYSize
bands = data.RasterCount bands = ds.RasterCount
# output to user print("width: " + "\t" + str(width))
print("width: " + "\t" + str(width)) print("length: " + "\t" + str(length))
print("length: " + "\t" + str(length)) print("num of bands:" + "\t" + str(bands))
print("nof bands:" + "\t" + str(bands))
# getting the datatype information # getting the datatype information
raster = data.GetRasterBand(1) raster = ds.GetRasterBand(1)
dataTypeGdal = raster.DataType dataTypeGdal = raster.DataType
# user look-up dictionary from gdal to isce format # user look-up dictionary from gdal to isce format
dataType= GDAL2ISCE_DATATYPE[dataTypeGdal] dataType= GDAL2ISCE_DATATYPE[dataTypeGdal]
# output to user
print("dataType: " + "\t" + str(dataType)) print("dataType: " + "\t" + str(dataType))
# transformation contains gridcorners (lines/pixels or lonlat and the spacing 1/-1 or deltalon/deltalat) # transformation contains gridcorners (lines/pixels or lonlat and the spacing 1/-1 or deltalon/deltalat)
transform = data.GetGeoTransform() transform = ds.GetGeoTransform()
# if a complex data type, then create complex image # if a complex data type, then create complex image
# if a real data type, then create a regular image # if a real data type, then create a regular image
img = isceobj.createImage() img = isceobj.createImage()
img.setFilename(os.path.abspath(inps.outname)) img.setFilename(os.path.abspath(outname))
img.setWidth(width) img.setWidth(width)
img.setLength(length) img.setLength(length)
img.setAccessMode('READ') img.setAccessMode('READ')
img.bands = bands img.bands = bands
img.dataType = dataType img.dataType = dataType
md = data.GetMetadata('IMAGE_STRUCTURE') # interleave
md = ds.GetMetadata('IMAGE_STRUCTURE')
sch = md.get('INTERLEAVE', None) sch = md.get('INTERLEAVE', None)
if sch == 'LINE': if sch == 'LINE':
img.scheme = 'BIL' img.scheme = 'BIL'
@ -110,10 +108,29 @@ if __name__ == '__main__':
print('Assuming default, BIP') print('Assuming default, BIP')
img.scheme = 'BIP' img.scheme = 'BIP'
img.firstLongitude = transform[0] img.firstLongitude = transform[0]
img.firstLatitude = transform[3] img.firstLatitude = transform[3]
img.deltaLatitude = transform[5] img.deltaLatitude = transform[5]
img.deltaLongitude = transform[1] img.deltaLongitude = transform[1]
img.dump(inps.outname + ".xml")
xml_file = outname + ".xml"
img.dump(xml_file)
return xml_file
# main script
if __name__ == '__main__':
'''
Main driver.
'''
# Parse command line
inps = cmdLineParse()
# check if the input file exist
if not os.path.isfile(inps.fname):
raise Exception('Input file is not found ....')
gdal2isce_xml(inps.fname)

View File

@ -34,16 +34,24 @@ def runDownloadDem(self):
os.makedirs(demDir, exist_ok=True) os.makedirs(demDir, exist_ok=True)
os.chdir(demDir) os.chdir(demDir)
downloadUrl = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/2000.02.11' # downloadUrl = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/2000.02.11'
cmd = 'dem.py -a stitch -b {} -k -s 1 -c -f -u {}'.format( # cmd = 'dem.py -a stitch -b {} -k -s 1 -c -f -u {}'.format(
bboxStr, # bboxStr,
downloadUrl # downloadUrl
) # )
runCmd(cmd) # runCmd(cmd)
cmd = 'fixImageXml.py -i demLat_*_*_Lon_*_*.dem.wgs84 -f' # cmd = 'fixImageXml.py -i demLat_*_*_Lon_*_*.dem.wgs84 -f'
runCmd(cmd) # runCmd(cmd)
cmd = 'rm *.hgt* *.log demLat_*_*_Lon_*_*.dem demLat_*_*_Lon_*_*.dem.vrt demLat_*_*_Lon_*_*.dem.xml' # cmd = 'rm *.hgt* *.log demLat_*_*_Lon_*_*.dem demLat_*_*_Lon_*_*.dem.vrt demLat_*_*_Lon_*_*.dem.xml'
runCmd(cmd) # runCmd(cmd)
#replace the above system calls with function calls
downloadDem(list(bbox), demType='version3', resolution=1, fillingValue=-32768, outputFile=None, userName=None, passWord=None)
imagePathXml((glob.glob('demLat_*_*_Lon_*_*.dem.wgs84'))[0], fullPath=True)
filesRemoved = glob.glob('*.hgt*') + glob.glob('*.log') + glob.glob('demLat_*_*_Lon_*_*.dem') + glob.glob('demLat_*_*_Lon_*_*.dem.vrt') + glob.glob('demLat_*_*_Lon_*_*.dem.xml')
for filex in filesRemoved:
os.remove(filex)
os.chdir('../') os.chdir('../')
self.dem = glob.glob(os.path.join(demDir, 'demLat_*_*_Lon_*_*.dem.wgs84'))[0] self.dem = glob.glob(os.path.join(demDir, 'demLat_*_*_Lon_*_*.dem.wgs84'))[0]
@ -54,16 +62,24 @@ def runDownloadDem(self):
os.makedirs(demGeoDir, exist_ok=True) os.makedirs(demGeoDir, exist_ok=True)
os.chdir(demGeoDir) os.chdir(demGeoDir)
downloadUrl = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL3.003/2000.02.11' # downloadUrl = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL3.003/2000.02.11'
cmd = 'dem.py -a stitch -b {} -k -s 3 -c -f -u {}'.format( # cmd = 'dem.py -a stitch -b {} -k -s 3 -c -f -u {}'.format(
bboxStr, # bboxStr,
downloadUrl # downloadUrl
) # )
runCmd(cmd) # runCmd(cmd)
cmd = 'fixImageXml.py -i demLat_*_*_Lon_*_*.dem.wgs84 -f' # cmd = 'fixImageXml.py -i demLat_*_*_Lon_*_*.dem.wgs84 -f'
runCmd(cmd) # runCmd(cmd)
cmd = 'rm *.hgt* *.log demLat_*_*_Lon_*_*.dem demLat_*_*_Lon_*_*.dem.vrt demLat_*_*_Lon_*_*.dem.xml' # cmd = 'rm *.hgt* *.log demLat_*_*_Lon_*_*.dem demLat_*_*_Lon_*_*.dem.vrt demLat_*_*_Lon_*_*.dem.xml'
runCmd(cmd) # runCmd(cmd)
#replace the above system calls with function calls
downloadDem(list(bbox), demType='version3', resolution=3, fillingValue=-32768, outputFile=None, userName=None, passWord=None)
imagePathXml((glob.glob('demLat_*_*_Lon_*_*.dem.wgs84'))[0], fullPath=True)
filesRemoved = glob.glob('*.hgt*') + glob.glob('*.log') + glob.glob('demLat_*_*_Lon_*_*.dem') + glob.glob('demLat_*_*_Lon_*_*.dem.vrt') + glob.glob('demLat_*_*_Lon_*_*.dem.xml')
for filex in filesRemoved:
os.remove(filex)
os.chdir('../') os.chdir('../')
self.demGeo = glob.glob(os.path.join(demGeoDir, 'demLat_*_*_Lon_*_*.dem.wgs84'))[0] self.demGeo = glob.glob(os.path.join(demGeoDir, 'demLat_*_*_Lon_*_*.dem.wgs84'))[0]
@ -77,10 +93,17 @@ def runDownloadDem(self):
#cmd = 'wbd.py {}'.format(bboxStr) #cmd = 'wbd.py {}'.format(bboxStr)
#runCmd(cmd) #runCmd(cmd)
download_wbd(np.int(np.floor(bbox[0])), np.int(np.ceil(bbox[1])), np.int(np.floor(bbox[2])), np.int(np.ceil(bbox[3]))) download_wbd(np.int(np.floor(bbox[0])), np.int(np.ceil(bbox[1])), np.int(np.floor(bbox[2])), np.int(np.ceil(bbox[3])))
cmd = 'fixImageXml.py -i swbdLat_*_*_Lon_*_*.wbd -f' #cmd = 'fixImageXml.py -i swbdLat_*_*_Lon_*_*.wbd -f'
runCmd(cmd) #runCmd(cmd)
cmd = 'rm *.log' #cmd = 'rm *.log'
runCmd(cmd) #runCmd(cmd)
#replace the above system calls with function calls
imagePathXml((glob.glob('swbdLat_*_*_Lon_*_*.wbd'))[0], fullPath=True)
filesRemoved = glob.glob('*.log')
for filex in filesRemoved:
os.remove(filex)
os.chdir('../') os.chdir('../')
self.wbd = glob.glob(os.path.join(wbdDir, 'swbdLat_*_*_Lon_*_*.wbd'))[0] self.wbd = glob.glob(os.path.join(wbdDir, 'swbdLat_*_*_Lon_*_*.wbd'))[0]
@ -94,6 +117,54 @@ def runDownloadDem(self):
self._insar.procDoc.addAllFromCatalog(catalog) self._insar.procDoc.addAllFromCatalog(catalog)
def downloadDem(bbox, demType='version3', resolution=1, fillingValue=-32768, outputFile=None, userName=None, passWord=None):
'''
bbox: [s, n, w, e]
demType: can be 'version3' or 'nasadem'. nasadem is also tested.
resolution: 1 or 3, NASADEM only available in 1-arc sec resolution
'''
import numpy as np
import isceobj
from contrib.demUtils import createDemStitcher
ds = createDemStitcher(demType)
ds.configure()
if demType == 'version3':
if resolution == 1:
ds._url1 = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/2000.02.11'
else:
ds._url3 = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL3.003/2000.02.11'
elif demType == 'nasadem':
resolution = 1
#this url is included in the module
#ds._url1 = 'http://e4ftl01.cr.usgs.gov/MEASURES/NASADEM_HGT.001/2000.02.11'
else:
raise Exception('unknown DEM type, currently supported DEM types: version3 and nasadem')
ds.setUsername(userName)
ds.setPassword(passWord)
ds._keepAfterFailed = True
ds.setCreateXmlMetadata(True)
ds.setUseLocalDirectory(False)
ds.setFillingValue(fillingValue)
ds.setFilling()
bbox = [np.int(np.floor(bbox[0])), np.int(np.ceil(bbox[1])), np.int(np.floor(bbox[2])), np.int(np.ceil(bbox[3]))]
if outputFile==None:
outputFile = ds.defaultName(bbox)
if not(ds.stitchDems(bbox[0:2],bbox[2:4],resolution,outputFile,'./',keep=True)):
print('Could not create a stitched DEM. Some tiles are missing')
else:
#Apply correction EGM96 -> WGS84
demImg = ds.correct()
#report downloads
for k,v in list(ds._downloadReport.items()):
print(k,'=',v)
def download_wbd(s, n, w, e): def download_wbd(s, n, w, e):
''' '''
@ -199,3 +270,21 @@ def download_wbd(s, n, w, e):
return outputFile return outputFile
def imagePathXml(imageFile, fullPath=True):
import os
import isceobj
from isceobj.Util.ImageUtil import ImageLib as IML
img = IML.loadImage(imageFile)[0]
dirname = os.path.dirname(imageFile)
if fullPath:
fname = os.path.abspath( os.path.join(dirname, os.path.basename(imageFile)))
else:
fname = os.path.basename(imageFile)
img.filename = fname
img.setAccessMode('READ')
img.renderHdr()

View File

@ -44,7 +44,8 @@ def runIonFilt(self):
################################### ###################################
#SET PARAMETERS HERE #SET PARAMETERS HERE
#THESE SHOULD BE GOOD ENOUGH, NO NEED TO SET IN setup(self) #THESE SHOULD BE GOOD ENOUGH, NO NEED TO SET IN setup(self)
corThresholdAdj = 0.85 corThresholdAdj = 0.97
corOrderAdj = 20
################################### ###################################
print('\ncomputing ionosphere') print('\ncomputing ionosphere')
@ -75,11 +76,22 @@ def runIonFilt(self):
upperUnw[area[0]:area[1], area[2]:area[3]] = 0 upperUnw[area[0]:area[1], area[2]:area[3]] = 0
cor[area[0]:area[1], area[2]:area[3]] = 0 cor[area[0]:area[1], area[2]:area[3]] = 0
#remove possible wired values in coherence
cor[np.nonzero(cor<0)] = 0.0
cor[np.nonzero(cor>1)] = 0.0
#remove water body
wbd = np.fromfile('wbd'+ml2+'.wbd', dtype=np.int8).reshape(length, width)
cor[np.nonzero(wbd==-1)] = 0.0
#remove small values
cor[np.nonzero(cor<corThresholdAdj)] = 0.0
#compute ionosphere #compute ionosphere
fl = SPEED_OF_LIGHT / self._insar.subbandRadarWavelength[0] fl = SPEED_OF_LIGHT / self._insar.subbandRadarWavelength[0]
fu = SPEED_OF_LIGHT / self._insar.subbandRadarWavelength[1] fu = SPEED_OF_LIGHT / self._insar.subbandRadarWavelength[1]
adjFlag = 1 adjFlag = 1
ionos = computeIonosphere(lowerUnw, upperUnw, cor, fl, fu, adjFlag, corThresholdAdj, 0) ionos = computeIonosphere(lowerUnw, upperUnw, cor**corOrderAdj, fl, fu, adjFlag, 0)
#dump ionosphere #dump ionosphere
ionfile = 'ion'+ml2+'.ion' ionfile = 'ion'+ml2+'.ion'
@ -108,13 +120,36 @@ def runIonFilt(self):
size_max = self.filteringWinsizeMaxIon size_max = self.filteringWinsizeMaxIon
size_min = self.filteringWinsizeMinIon size_min = self.filteringWinsizeMinIon
if size_min >= size_max:
print('\n\nWARNING: minimum window size for filtering ionosphere phase {} >= maximum window size {}'.format(size_min, size_max))
print(' resetting maximum window size to {}\n\n'.format(size_min+5))
size_max = size_min + 5
#THESE SHOULD BE GOOD ENOUGH, NO NEED TO SET IN setup(self) #THESE SHOULD BE GOOD ENOUGH, NO NEED TO SET IN setup(self)
corThresholdIon = 0.85 #corThresholdFit = 0.85
#Now changed to use lower band coherence. crl, 23-apr-2020.
useDiffCoherence = False
if useDiffCoherence:
#parameters for using diff coherence
corfile = 'diff'+ml2+'.cor'
corThresholdFit = 0.95
# 1 is not good for low coherence case, changed to 20
#corOrderFit = 1
corOrderFit = 20
corOrderFilt = 14
else:
#parameters for using lower/upper band coherence
corfile = subbandPrefix[0]+ml2+'.cor'
corThresholdFit = 0.4
corOrderFit = 10
corOrderFilt = 4
################################################# #################################################
print('\nfiltering ionosphere') print('\nfiltering ionosphere')
ionfile = 'ion'+ml2+'.ion' ionfile = 'ion'+ml2+'.ion'
corfile = 'diff'+ml2+'.cor' #corfile = 'diff'+ml2+'.cor'
ionfiltfile = 'filt_ion'+ml2+'.ion' ionfiltfile = 'filt_ion'+ml2+'.ion'
img = isceobj.createImage() img = isceobj.createImage()
@ -137,6 +172,10 @@ def runIonFilt(self):
cor[np.nonzero(cor<0)] = 0.0 cor[np.nonzero(cor<0)] = 0.0
cor[np.nonzero(cor>1)] = 0.0 cor[np.nonzero(cor>1)] = 0.0
#remove water body
wbd = np.fromfile('wbd'+ml2+'.wbd', dtype=np.int8).reshape(length, width)
cor[np.nonzero(wbd==-1)] = 0.0
# #applying water body mask here # #applying water body mask here
# waterBodyFile = 'wbd'+ml2+'.wbd' # waterBodyFile = 'wbd'+ml2+'.wbd'
# if os.path.isfile(waterBodyFile): # if os.path.isfile(waterBodyFile):
@ -145,14 +184,17 @@ def runIonFilt(self):
# cor[np.nonzero(wbd!=0)] = 0.00001 # cor[np.nonzero(wbd!=0)] = 0.00001
if fit: if fit:
ion_fit = weight_fitting(ion, cor, width, length, 1, 1, 1, 1, 2, corThresholdIon) import copy
wgt = copy.deepcopy(cor)
wgt[np.nonzero(wgt<corThresholdFit)] = 0.0
ion_fit = weight_fitting(ion, wgt**corOrderFit, width, length, 1, 1, 1, 1, 2)
ion -= ion_fit * (ion!=0) ion -= ion_fit * (ion!=0)
#minimize the effect of low coherence pixels #minimize the effect of low coherence pixels
#cor[np.nonzero( (cor<0.85)*(cor!=0) )] = 0.00001 #cor[np.nonzero( (cor<0.85)*(cor!=0) )] = 0.00001
#filt = adaptive_gaussian(ion, cor, size_max, size_min) #filt = adaptive_gaussian(ion, cor, size_max, size_min)
#cor**14 should be a good weight to use. 22-APR-2018 #cor**14 should be a good weight to use. 22-APR-2018
filt = adaptive_gaussian(ion, cor**14, size_max, size_min) filt = adaptive_gaussian(ion, cor**corOrderFilt, size_max, size_min)
if fit: if fit:
filt += ion_fit * (filt!=0) filt += ion_fit * (filt!=0)
@ -282,19 +324,18 @@ def runIonFilt(self):
def computeIonosphere(lowerUnw, upperUnw, cor, fl, fu, adjFlag, corThresholdAdj, dispersive): def computeIonosphere(lowerUnw, upperUnw, wgt, fl, fu, adjFlag, dispersive):
''' '''
This routine computes ionosphere and remove the relative phase unwrapping errors This routine computes ionosphere and remove the relative phase unwrapping errors
lowerUnw: lower band unwrapped interferogram lowerUnw: lower band unwrapped interferogram
upperUnw: upper band unwrapped interferogram upperUnw: upper band unwrapped interferogram
cor: coherence wgt: weight
fl: lower band center frequency fl: lower band center frequency
fu: upper band center frequency fu: upper band center frequency
adjFlag: method for removing relative phase unwrapping errors adjFlag: method for removing relative phase unwrapping errors
0: mean value 0: mean value
1: polynomial 1: polynomial
corThresholdAdj: coherence threshold of samples used in removing relative phase unwrapping errors
dispersive: compute dispersive or non-dispersive dispersive: compute dispersive or non-dispersive
0: dispersive 0: dispersive
1: non-dispersive 1: non-dispersive
@ -324,14 +365,14 @@ def computeIonosphere(lowerUnw, upperUnw, cor, fl, fu, adjFlag, corThresholdAdj,
########################################################################################## ##########################################################################################
#adjust phase using mean value #adjust phase using mean value
if adjFlag == 0: if adjFlag == 0:
flag = (lowerUnw!=0)*(cor>=corThresholdAdj) flag = (lowerUnw!=0)*(wgt!=0)
index = np.nonzero(flag!=0) index = np.nonzero(flag!=0)
mv = np.mean((lowerUnw - upperUnw)[index], dtype=np.float64) mv = np.mean((lowerUnw - upperUnw)[index], dtype=np.float64)
print('mean value of phase difference: {}'.format(mv)) print('mean value of phase difference: {}'.format(mv))
diff = mv diff = mv
#adjust phase using a surface #adjust phase using a surface
else: else:
diff = weight_fitting(lowerUnw - upperUnw, cor, width, length, 1, 1, 1, 1, 2, corThresholdAdj) diff = weight_fitting(lowerUnw - upperUnw, wgt, width, length, 1, 1, 1, 1, 2)
flag2 = (lowerUnw!=0) flag2 = (lowerUnw!=0)
index2 = np.nonzero(flag2) index2 = np.nonzero(flag2)
@ -435,10 +476,10 @@ def cal_surface(x, y, c, order):
return z return z
def weight_fitting(ionos, cor, width, length, nrli, nali, nrlo, nalo, order, coth): def weight_fitting(ionos, weight, width, length, nrli, nali, nrlo, nalo, order):
''' '''
ionos: input ionospheric phase ionos: input ionospheric phase
cor: coherence of the interferogram weight: weight
width: file width width: file width
length: file length length: file length
nrli: number of range looks of the input interferograms nrli: number of range looks of the input interferograms
@ -446,7 +487,6 @@ def weight_fitting(ionos, cor, width, length, nrli, nali, nrlo, nalo, order, cot
nrlo: number of range looks of the output ionosphere phase nrlo: number of range looks of the output ionosphere phase
nalo: number of azimuth looks of the ioutput ionosphere phase nalo: number of azimuth looks of the ioutput ionosphere phase
order: the order of the polynomial for fitting ionosphere phase estimates order: the order of the polynomial for fitting ionosphere phase estimates
coth: coherence threshhold for ionosphere phase estimation
''' '''
from isceobj.Alos2Proc.Alos2ProcPublic import create_multi_index2 from isceobj.Alos2Proc.Alos2ProcPublic import create_multi_index2
@ -460,11 +500,8 @@ def weight_fitting(ionos, cor, width, length, nrli, nali, nrlo, nalo, order, cot
rgindex = create_multi_index2(widtho, nrli, nrlo) rgindex = create_multi_index2(widtho, nrli, nrlo)
azindex = create_multi_index2(lengtho, nali, nalo) azindex = create_multi_index2(lengtho, nali, nalo)
#convert coherence to weight
cor = cor**2/(1.009-cor**2)
#look for data to use #look for data to use
flag = (cor>coth)*(ionos!=0) flag = (weight!=0)*(ionos!=0)
point_index = np.nonzero(flag) point_index = np.nonzero(flag)
m = point_index[0].shape[0] m = point_index[0].shape[0]
@ -475,7 +512,7 @@ def weight_fitting(ionos, cor, width, length, nrli, nali, nrlo, nalo, order, cot
x = x0[point_index].reshape(m, 1) x = x0[point_index].reshape(m, 1)
y = y0[point_index].reshape(m, 1) y = y0[point_index].reshape(m, 1)
z = ionos[point_index].reshape(m, 1) z = ionos[point_index].reshape(m, 1)
w = cor[point_index].reshape(m, 1) w = weight[point_index].reshape(m, 1)
#convert to higher precision type before use #convert to higher precision type before use
x=np.asfarray(x,np.float64) x=np.asfarray(x,np.float64)

View File

@ -25,6 +25,7 @@ def runIonUwrap(self):
masterTrack = self._insar.loadTrack(master=True) masterTrack = self._insar.loadTrack(master=True)
slaveTrack = self._insar.loadTrack(master=False) slaveTrack = self._insar.loadTrack(master=False)
wbdFile = os.path.abspath(self._insar.wbd)
from isceobj.Alos2Proc.runIonSubband import defineIonDir from isceobj.Alos2Proc.runIonSubband import defineIonDir
ionDir = defineIonDir() ionDir = defineIonDir()
@ -40,6 +41,7 @@ def runIonUwrap(self):
############################################################ ############################################################
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
from contrib.alos2proc.alos2proc import look from contrib.alos2proc.alos2proc import look
from isceobj.Alos2Proc.Alos2ProcPublic import waterBodyRadar
ml2 = '_{}rlks_{}alks'.format(self._insar.numberRangeLooks1*self._insar.numberRangeLooksIon, ml2 = '_{}rlks_{}alks'.format(self._insar.numberRangeLooks1*self._insar.numberRangeLooksIon,
self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooksIon) self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooksIon)
@ -69,6 +71,14 @@ def runIonUwrap(self):
# look(wbdOutFile, 'wbd'+ml2+'.wbd', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 0, 0, 1) # look(wbdOutFile, 'wbd'+ml2+'.wbd', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 0, 0, 1)
# create_xml('wbd'+ml2+'.wbd', width2, length2, 'byte') # create_xml('wbd'+ml2+'.wbd', width2, length2, 'byte')
#water body
if k == 0:
look(os.path.join(fullbandDir, self._insar.latitude), 'lat'+ml2+'.lat', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 3, 0, 1)
look(os.path.join(fullbandDir, self._insar.longitude), 'lon'+ml2+'.lon', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 3, 0, 1)
create_xml('lat'+ml2+'.lat', width2, length2, 'double')
create_xml('lon'+ml2+'.lon', width2, length2, 'double')
waterBodyRadar('lat'+ml2+'.lat', 'lon'+ml2+'.lon', wbdFile, 'wbd'+ml2+'.wbd')
############################################################ ############################################################
# STEP 2. compute coherence # STEP 2. compute coherence

View File

@ -50,8 +50,21 @@ def runLook(self):
create_xml(self._insar.multilookLongitude, width2, length2, 'double') create_xml(self._insar.multilookLongitude, width2, length2, 'double')
create_xml(self._insar.multilookHeight, width2, length2, 'double') create_xml(self._insar.multilookHeight, width2, length2, 'double')
#los has two bands, use look program in isce instead #los has two bands, use look program in isce instead
cmd = "looks.py -i {} -o {} -r {} -a {}".format(self._insar.los, self._insar.multilookLos, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2) #cmd = "looks.py -i {} -o {} -r {} -a {}".format(self._insar.los, self._insar.multilookLos, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2)
runCmd(cmd) #runCmd(cmd)
#replace the above system call with function call
from mroipac.looks.Looks import Looks
from isceobj.Image import createImage
inImage = createImage()
inImage.load(self._insar.los+'.xml')
lkObj = Looks()
lkObj.setDownLooks(self._insar.numberAzimuthLooks2)
lkObj.setAcrossLooks(self._insar.numberRangeLooks2)
lkObj.setInputImage(inImage)
lkObj.setOutputFilename(self._insar.multilookLos)
lkObj.looks()
#water body #water body
#this looking operation has no problems where there is only water and land, but there is also possible no-data area #this looking operation has no problems where there is only water and land, but there is also possible no-data area

View File

@ -378,33 +378,94 @@ def swathMosaic(frame, inputFiles, outputfile, rangeOffsets, azimuthOffsets, num
#get difference #get difference
corth = 0.87 dataDiff = data1 * np.conj(data2)
if filt: cor = cal_coherence_1(dataDiff, win=5)
corth = 0.90 index = np.nonzero(np.logical_and(cor>0.85, dataDiff!=0))
diffMean0 = 0.0
for k in range(5): DEBUG=False
dataDiff = data1 * np.conj(data2) if DEBUG:
cor = cal_coherence_1(dataDiff, win=3) from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
index = np.nonzero(np.logical_and(cor>corth, dataDiff!=0)) (length7, width7)=dataDiff.shape
filename = 'diff_ori_s{}-s{}.int'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber)
dataDiff.astype(np.complex64).tofile(filename)
create_xml(filename, width7, length7, 'int')
filename = 'cor_ori_s{}-s{}.cor'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber)
cor.astype(np.float32).tofile(filename)
create_xml(filename, width7, length7, 'float')
print('\ncompute phase difference between subswaths {} and {}'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber))
print('number of pixels with coherence > 0.85: {}'.format(index[0].size))
#if already filtered the subswath overlap interferograms (MAI), do not filtered differential interferograms
if (filt == False) and (index[0].size < 4000):
#coherence too low, filter subswath overlap differential interferogram
diffMean0 = 0.0
breakFlag = False
for (filterStrength, filterWinSize) in zip([3.0, 9.0], [64, 128]):
dataDiff = data1 * np.conj(data2)
dataDiff /= (np.absolute(dataDiff)+(dataDiff==0))
dataDiff = filterInterferogram(dataDiff, filterStrength, filterWinSize, 1)
cor = cal_coherence_1(dataDiff, win=7)
DEBUG=False
if DEBUG:
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
(length7, width7)=dataDiff.shape
filename = 'diff_filt_s{}-s{}_strength_{}_winsize_{}.int'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber, filterStrength, filterWinSize)
dataDiff.astype(np.complex64).tofile(filename)
create_xml(filename, width7, length7, 'int')
filename = 'cor_filt_s{}-s{}_strength_{}_winsize_{}.cor'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber, filterStrength, filterWinSize)
cor.astype(np.float32).tofile(filename)
create_xml(filename, width7, length7, 'float')
for corth in [0.99999, 0.9999]:
index = np.nonzero(np.logical_and(cor>corth, dataDiff!=0))
if index[0].size > 30000:
breakFlag = True
break
if breakFlag:
break
if index[0].size < 100: if index[0].size < 100:
diffMean0 = 0.0 diffMean0 = 0.0
print('\n\nWARNING: too few high coherence pixels for swath phase difference estimation between swath {} and {}'.format(i-1, i)) print('\n\nWARNING: too few high coherence pixels for swath phase difference estimation')
print(' : first swath swath number: 0\n\n') print(' number of high coherence pixels: {}\n\n'.format(index[0].size))
break else:
angle = np.mean(np.angle(dataDiff[index]), dtype=np.float64) print('filtered coherence threshold used: {}, number of pixels used: {}'.format(corth, index[0].size))
diffMean0 += angle angle = np.mean(np.angle(dataDiff[index]), dtype=np.float64)
data2 *= np.exp(np.complex64(1j) * angle) diffMean0 += angle
print('phase offset: %15.12f rad after loop: %3d'%(diffMean0, k)) data2 *= np.exp(np.complex64(1j) * angle)
print('phase offset: %15.12f rad with filter strength: %f, window size: %3d'%(diffMean0, filterStrength, filterWinSize))
else:
diffMean0 = 0.0
for k in range(30):
dataDiff = data1 * np.conj(data2)
cor = cal_coherence_1(dataDiff, win=5)
if filt:
index = np.nonzero(np.logical_and(cor>0.95, dataDiff!=0))
else:
index = np.nonzero(np.logical_and(cor>0.85, dataDiff!=0))
if index[0].size < 100:
diffMean0 = 0.0
print('\n\nWARNING: too few high coherence pixels for swath phase difference estimation')
print(' number of high coherence pixels: {}\n\n'.format(index[0].size))
break
angle = np.mean(np.angle(dataDiff[index]), dtype=np.float64)
diffMean0 += angle
data2 *= np.exp(np.complex64(1j) * angle)
print('phase offset: %15.12f rad after loop: %3d'%(diffMean0, k))
DEBUG=False
if DEBUG and (k==0):
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
(length7, width7)=dataDiff.shape
filename = 'diff_ori_s{}-s{}_loop_{}.int'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber, k)
dataDiff.astype(np.complex64).tofile(filename)
create_xml(filename, width7, length7, 'int')
filename = 'cor_ori_s{}-s{}_loop_{}.cor'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber, k)
cor.astype(np.float32).tofile(filename)
create_xml(filename, width7, length7, 'float')
DEBUG=False
if DEBUG and (k==0):
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
(lengthxx, widthxx)=dataDiff.shape
filtnamePrefix = 'subswath{}_subswath{}_loop{}'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber, k)
cor.astype(np.float32).tofile(filtnamePrefix+'.cor')
create_xml(filtnamePrefix+'.cor', widthxx, lengthxx, 'float')
dataDiff.astype(np.complex64).tofile(filtnamePrefix+'.int')
create_xml(filtnamePrefix+'.int', widthxx, lengthxx, 'int')
diffMean.append(diffMean0) diffMean.append(diffMean0)
print('phase offset: subswath{} - subswath{}: {}'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber, diffMean0)) print('phase offset: subswath{} - subswath{}: {}'.format(frame.swaths[i-1].swathNumber, frame.swaths[i].swathNumber, diffMean0))

View File

@ -7,7 +7,11 @@ tmpdump = 'tmpdump.json'
def createHelp(env,factoryFile,installDir): def createHelp(env,factoryFile,installDir):
#jng: try to have scons handle all the creation but could not figure out how #jng: try to have scons handle all the creation but could not figure out how
# so handled dir creation manually # so handled dir creation manually
os.makedirs(env['HELPER_BUILD_DIR'], exist_ok=True) try:
os.makedirs(env['HELPER_BUILD_DIR'])
except:
# already exists
pass
try: try:
#one could probably also use __import__ but needs to make sure the #one could probably also use __import__ but needs to make sure the
#the cwd is prepended to the sys.path otherwise if factoryFile = __init__.py #the cwd is prepended to the sys.path otherwise if factoryFile = __init__.py

View File

@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <fftw3.h>
#define PLUS 1 #define PLUS 1
#define MINU 2 #define MINU 2
@ -75,6 +76,11 @@ int psfilt1(char *inputfile, char *outputfile, int width, double alpha, int fftw
FILE *int_file, *sm_file; FILE *int_file, *sm_file;
double psd,psd_sc; /* power spectrum, scale factor */
int ii, jj;
fftwf_plan p_forward;
fftwf_plan p_backward;
int k; int k;
float sf; // scale factor for FFT, otherwise FFT will magnify the data by FFT length float sf; // scale factor for FFT, otherwise FFT will magnify the data by FFT length
// usually the magnitude of the interferogram is very large, so the data are // usually the magnitude of the interferogram is very large, so the data are
@ -212,6 +218,9 @@ int psfilt1(char *inputfile, char *outputfile, int width, double alpha, int fftw
} }
lc=0; lc=0;
p_forward = fftwf_plan_dft_2d(fftw, fftw, (fftw_complex *)seg_fft[0], (fftw_complex *)seg_fft[0], FFTW_FORWARD, FFTW_MEASURE);
p_backward = fftwf_plan_dft_2d(fftw, fftw, (fftw_complex *)seg_fft[0], (fftw_complex *)seg_fft[0], FFTW_BACKWARD, FFTW_MEASURE);
for (i=0; i < yh; i += step){ for (i=0; i < yh; i += step){
for(i1=fftw - step; i1 < fftw; i1++){ for(i1=fftw - step; i1 < fftw; i1++){
fread((char *)cmp[i1], sizeof(fcomplex), width, int_file); fread((char *)cmp[i1], sizeof(fcomplex), width, int_file);
@ -229,8 +238,30 @@ int psfilt1(char *inputfile, char *outputfile, int width, double alpha, int fftw
if(i%(2*step) == 0)fprintf(stderr,"\rprogress: %3d%%", (int)(i*100/yh + 0.5)); if(i%(2*step) == 0)fprintf(stderr,"\rprogress: %3d%%", (int)(i*100/yh + 0.5));
for (j=0; j < width; j += step){ for (j=0; j < width; j += step){
psd_wgt(cmp, seg_fft, alpha, j, i, fftw); //psd_wgt(cmp, seg_fft, alpha, j, i, fftw);
fourn((float *)seg_fft[0]-1,nfft,ndim,isign); /* 2D inverse FFT of region, get back filtered fringes */ ////////////////////////////////////////////////////////////////////////////////////////
//replace function psd_wgt with the following to call FFTW, crl, 23-APR-2020
for (ii=0; ii < fftw; ii++){ /* load up data array */
for (jj=j; jj < j+fftw; jj++){
seg_fft[ii][jj-j].re = cmp[ii][jj].re;
seg_fft[ii][jj-j].im = cmp[ii][jj].im;
}
}
//fourn((float *)seg_fft[0]-1, nfft, ndim, -1); /* 2D forward FFT of region */
fftwf_execute(p_forward);
for (ii=0; ii < fftw; ii++){
for (jj=0; jj < fftw; jj++){
psd = seg_fft[ii][jj].re * seg_fft[ii][jj].re + seg_fft[ii][jj].im * seg_fft[ii][jj].im;
psd_sc = pow(psd,alpha/2.);
seg_fft[ii][jj].re *= psd_sc;
seg_fft[ii][jj].im *= psd_sc;
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//fourn((float *)seg_fft[0]-1,nfft,ndim,isign); /* 2D inverse FFT of region, get back filtered fringes */
fftwf_execute(p_backward);
for (i1=0; i1 < fftw; i1++){ /* save filtered output values */ for (i1=0; i1 < fftw; i1++){ /* save filtered output values */
for (j1=0; j1 < fftw; j1++){ for (j1=0; j1 < fftw; j1++){
@ -285,6 +316,9 @@ int psfilt1(char *inputfile, char *outputfile, int width, double alpha, int fftw
fprintf(stdout,"\nnumber of lines written to file: %d\n",lc); fprintf(stdout,"\nnumber of lines written to file: %d\n",lc);
stop_timing(); stop_timing();
fftwf_destroy_plan(p_forward);
fftwf_destroy_plan(p_backward);
free(bufcz); free(bufcz);
//free_cmatrix(cmp, 0, fftw-1, -fftw,width+fftw); //free_cmatrix(cmp, 0, fftw-1, -fftw,width+fftw);
//free_cmatrix(sm, 0,fftw-1,-fftw,width+fftw); //free_cmatrix(sm, 0,fftw-1,-fftw,width+fftw);

View File

@ -32,6 +32,8 @@ def createDemStitcher(type='version3',name = ''):
from contrib.demUtils.DemStitcherV3 import DemStitcher from contrib.demUtils.DemStitcherV3 import DemStitcher
if(type == 'version2'): if(type == 'version2'):
from contrib.demUtils.DemStitcher import DemStitcher from contrib.demUtils.DemStitcher import DemStitcher
if(type == 'nasadem'):
from contrib.demUtils.DemStitcherND import DemStitcher
return DemStitcher(name=name) return DemStitcher(name=name)
def createSWBDStitcher(name = ''): def createSWBDStitcher(name = ''):
from contrib.demUtils.SWBDStitcher import SWBDStitcher from contrib.demUtils.SWBDStitcher import SWBDStitcher

View File

@ -763,6 +763,7 @@ class DemStitcher(Component):
def getUnzippedName(self,name,source = None): def getUnzippedName(self,name,source = None):
return name.replace(self._zip,'') return name.replace(self._zip,'')
def stitchDems(self,lat,lon,source, outname, downloadDir = None,region = None, keep = None, swap = None): def stitchDems(self,lat,lon,source, outname, downloadDir = None,region = None, keep = None, swap = None):
import glob
if downloadDir is None: if downloadDir is None:
downloadDir = self._downloadDir downloadDir = self._downloadDir
else: else:
@ -839,7 +840,8 @@ class DemStitcher(Component):
if not self._keepDems: if not self._keepDems:
for dem in decompressedList: for dem in decompressedList:
os.remove(dem) for d in glob.glob('*'+os.path.basename(dem.decode('UTF-8'))[:7]+'*'):
os.remove(d)
if self._createXmlMetadata: if self._createXmlMetadata:
self.createXmlMetadata(lat,lon,source,outname) self.createXmlMetadata(lat,lon,source,outname)
if self._createRscMetadata: if self._createRscMetadata:

View File

@ -0,0 +1,271 @@
#!/usr/bin/env python3
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Copyright 2012 California Institute of Technology. ALL RIGHTS RESERVED.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# United States Government Sponsorship acknowledged. This software is subject to
# U.S. export control laws and regulations and has been classified as 'EAR99 NLR'
# (No [Export] License Required except when exporting to an embargoed country,
# end user, or in support of a prohibited end use). By downloading this software,
# the user agrees to comply with all applicable U.S. export laws and regulations.
# The user has the responsibility to obtain export licenses, or other export
# authority as may be required before exporting this software to any 'EAR99'
# embargoed foreign country or citizen of those countries.
#
# Author: Giangi Sacco
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import isce
from ctypes import cdll
import os
import sys
import urllib.request, urllib.error, urllib.parse
from isce import logging
from iscesys.Component.Component import Component
from contrib.demUtils.DemStitcher import DemStitcher as DS
#Parameters definitions
URL1 = Component.Parameter('_url1',
public_name = 'URL1',default = 'http://e4ftl01.cr.usgs.gov/MEASURES/NASADEM_HGT.001/2000.02.11',
type = str,
mandatory = False,
doc = "Url for the high resolution DEM. Used for NASADEM")
EXTRA_PREPEND1 = Component.Parameter('_extraPrepend1',
public_name = 'extra prepend 1',default = 'NASADEM_HGT',
type = str,
mandatory = False,
doc = "The actual file name might have some extra string compared to the conventional one." \
+ "This is for the high resolution files. Used for NASADEM")
HAS_EXTRAS = Component.Parameter('_hasExtras',
public_name = 'has extras',default = True,
type = bool,
mandatory = False,
doc = "Instead of having to provide the EXTRA_EXT or EXTRA_PREPEND empty when the extra extension " \
+ "is not present, turn on this flag. Used for NASADEM")
## This class provides a set of convenience method to retrieve and possibly combine different DEMs from the USGS server.
# \c NOTE: the latitudes and the longitudes that describe the DEMs refer to the bottom left corner of the image.
class DemStitcher(DS):
##
# Given a latitude and longitude in degrees it returns the expected filename.
# @param lat \c int latitude in the range (-90,90). Actual data are restricted to (-60,60) or so.
# @param lon \c int longitude in the range [-180,180) or [0,360).
# @return \c string the filename for that location
def createFilename(self,lat,lon,source = None):
if lon > 180:
lon = -(360 - lon)
else:
lon = lon
ns,ew = self.convertCoordinateToString(lat,lon)
#make coords lower-case
ns=ns.lower()
ew=ew.lower()
if(self._hasExtras):
if(source and source == 1):
toPrepend = self._extraPrepend1 + "_"
else:
print('Unrecognized dem source',source)
raise Exception
return toPrepend+ ns + ew + self._extension + self._zip
else:
return ns + ew + self._extension + self._zip
def getUnzippedName(self,name,source = None):
name = name.replace(self._extraPrepend1+'_','')
return name.replace(self._zip,'.hgt')
##
# Given a list of filenames it fetches the corresponding
# compressed (zip format) DEMs.
# @param source \c int the type of DEM. source = 1 for 1 arcsec resolution data,
# source = 3 for 3 arcsec resolution data.
# @param listFile \c list of the filenames to be retrieved.
# @param downloadDir \c string the directory where the DEMs are downloaded.
# If the directory does not exists it will be created. If the argument is not
# provided then the files are downloaded in the location defined by the
# self._downloadDir that is defaulted to the current directory.
# @param region \c list \c strings regions where to look for the files. It must
# have the same length of \c listFile. If not provided the files are searched by
# scanning the content of each region. Use method getRegionList to get the list of
# possible regions for a given source. Set region only if sure that all the requested
# file are contained in it.
def getDems(self,source,listFile,downloadDir = None,region = None):
if downloadDir is None:
downloadDir = self._downloadDir
else:
self._downloadDir = downloadDir
if not (downloadDir) is None:
try:
os.makedirs(downloadDir)
except:
#dir already exists
pass
for fileNow in listFile:
url = self.getFullHttp(source)
opener = urllib.request.URLopener()
try:
if not os.path.exists(os.path.join(downloadDir,fileNow)):
if(self._un is None or self._pw is None):
#opener.retrieve(url + fileNow,os.path.join(downloadDir,fileNow))
if os.path.exists(os.path.join(os.environ['HOME'],'.netrc')):
command = 'curl -n -L -c $HOME/.earthdatacookie -b $HOME/.earthdatacookie -k -f -O ' + os.path.join(url,fileNow)
else:
self.logger.error('Please create a .netrc file in your home directory containing\nmachine urs.earthdata.nasa.gov\n\tlogin yourusername\n\tpassword yourpassword')
sys.exit(1)
else:
command = 'curl -k -f -u ' + self._un + ':' + self._pw + ' -O ' + os.path.join(url,fileNow)
# curl with -O download in working dir, so save current, move to donwloadDir
# nd get back once download is finished
cwd = os.getcwd()
os.chdir(downloadDir)
print(command)
if os.system(command):
os.chdir(cwd)
raise Exception
os.chdir(cwd)
self._downloadReport[fileNow] = self._succeded
except Exception as e:
self.logger.warning('There was a problem in retrieving the file %s. Exception %s'%(os.path.join(url,fileNow),str(e)))
self._downloadReport[fileNow] = self._failed
#still need to call it since the initialization calls the _url so the setter of
#url does not get called
def _configure(self):
pass
def _facilities(self):
super(DemStitcher,self)._facilities()
def __setstate__(self,d):
self.__dict__.update(d)
self.logger = logging.getLogger('isce.contrib.demUtils.DemStitcherV3')
libName = os.path.join(os.path.dirname(__file__),self._loadLibName)
##self._keepAfterFailed = False #if True keeps the downloaded files even if the stitching failed.
self._lib = cdll.LoadLibrary(libName)
return
def main(self):
# prevent from deliting local files
if(self._useLocalDirectory):
self._keepAfterFailed = True
self._keepDems = True
# is a metadata file is created set the right type
if(self._meta == 'xml'):
self.setCreateXmlMetadata(True)
elif(self._meta == 'rsc'):
self.setCreateRscMetadata(True)
# check for the action to be performed
if(self._action == 'stitch'):
if(self._bbox):
lat = self._bbox[0:2]
lon = self._bbox[2:4]
if (self._outputFile is None):
self._outputFile = self.defaultName(self._bbox)
if not(self.stitchDems(lat,lon,self._source,self._outputFile,self._downloadDir, \
keep=self._keepDems)):
print('Could not create a stitched DEM. Some tiles are missing')
else:
if(self._correct):
width = self.getDemWidth(lon,self._source)
self.correct(os.path.join(self._downloadDir,self._outputFile), \
self._source,width,min(lat[0],lat[1]),min(lon[0],lon[1]))
#self.correct(self._output,self._source,width,min(lat[0],lat[1]),min(lon[0],lon[1]))
else:
print('Error. The "bbox" attribute must be specified when the action is "stitch"')
raise ValueError
elif(self._action == 'download'):
if(self._bbox):
lat = self._bbox[0:2]
lon = self._bbox[2:4]
self.getDemsInBox(lat,lon,self._source,self._downloadDir)
#can make the bbox and pairs mutually esclusive if replace the if below with elif
if(self._pairs):
self.downloadFilesFromList(self._pairs[::2],self._pairs[1::2],self._source,self._downloadDir)
if(not (self._bbox or self._pairs)):
print('Error. Either the "bbox" attribute or the "pairs" attribute must be specified when --action download is used')
raise ValueError
else:
print('Unrecognized action ',self._action)
return
if(self._report):
for k,v in list(self._downloadReport.items()):
print(k,'=',v)
#use this logic so the right http is returned
def getFullHttp(self,source):
return self._url1 if source == 1 else self._url3
'''
parameter_list = (
URL1,
EXTRA_PREPEND1,
HAS_EXTRAS,
USERNAME,
PASSWORD,
KEEP_AFTER_FAILED,
DIRECTORY,
ACTION,
CORRECT,
META,
SOURCE,
NO_FILLING,
FILLING_VALUE,
BBOX,
PAIRS,
KEEP_DEMS,
REPORT,
USE_LOCAL_DIRECTORY,
OUTPUT_FILE
)
'''
parameter_list = (
URL1,
EXTRA_PREPEND1,
HAS_EXTRAS
) + DS.parameter_list
family = 'demstitcher'
def __init__(self,family = '', name = ''):
super(DemStitcher, self).__init__(family if family else self.__class__.family, name=name)
# logger not defined until baseclass is called
self._extension = ''
self._zip = '.zip'
#to make it working with other urls, make sure that the second part of the url
#it's /srtm/version2_1/SRTM(1,3)
self._remove = ['.jpg','.xml']
if not self.logger:
self.logger = logging.getLogger('isce.contrib.demUtils.DemStitcherV3')

View File

@ -50,6 +50,6 @@ helpList,installHelp = envdemStitcher['HELP_BUILDER'](envdemStitcher,'../__init_
envdemStitcher.Install(installHelp,helpList) envdemStitcher.Install(installHelp,helpList)
envdemStitcher.Alias('install',installHelp) envdemStitcher.Alias('install',installHelp)
listFiles = ['DemStitcher.py','DemStitcherV3.py'] listFiles = ['DemStitcher.py','DemStitcherND.py','DemStitcherV3.py']
envdemStitcher.Install(install,listFiles) envdemStitcher.Install(install,listFiles)
envdemStitcher.Alias('install',install) envdemStitcher.Alias('install',install)

View File

@ -223,6 +223,7 @@ class config(object):
self.f.write('defomax : ' + self.defoMax + '\n') self.f.write('defomax : ' + self.defoMax + '\n')
self.f.write('rlks : ' + self.rangeLooks + '\n') self.f.write('rlks : ' + self.rangeLooks + '\n')
self.f.write('alks : ' + self.azimuthLooks + '\n') self.f.write('alks : ' + self.azimuthLooks + '\n')
self.f.write('rmfilter : ' + self.rmFilter + '\n')
self.f.write('method : ' + self.unwMethod + '\n') self.f.write('method : ' + self.unwMethod + '\n')
def unwrapSnaphu(self, function): def unwrapSnaphu(self, function):
@ -282,7 +283,7 @@ class run(object):
os.makedirs(self.config_path, exist_ok=True) os.makedirs(self.config_path, exist_ok=True)
for slcdate in acquisitionDates: for slcdate in acquisitionDates:
configName = os.path.join(self.config_path,'config_'+slcdate) configName = os.path.join(self.config_path,'config_unpack_'+slcdate)
configObj = config(configName) configObj = config(configName)
configObj.configure(self) configObj.configure(self)
configObj.dirName = safe_dict[slcdate].safe_file configObj.dirName = safe_dict[slcdate].safe_file
@ -377,11 +378,15 @@ class run(object):
self.runf.write(self.text_cmd + 'subsetMaster.py -m ' + os.path.join(self.work_dir, 'master') + ' -g ' + os.path.join(self.work_dir, 'geom_master') + '\n') self.runf.write(self.text_cmd + 'subsetMaster.py -m ' + os.path.join(self.work_dir, 'master') + ' -g ' + os.path.join(self.work_dir, 'geom_master') + '\n')
def overlap_geo2rdr_resample(self, slaveList):
def geo2rdr_offset(self, slaveList, fullBurst='False'):
for slave in slaveList: for slave in slaveList:
master = self.master_date master = self.master_date
configName = os.path.join(self.config_path ,'config_resamp_overlap_'+slave) if fullBurst == 'True':
configName = os.path.join(self.config_path, 'config_fullBurst_geo2rdr_' + slave)
else:
configName = os.path.join(self.config_path, 'config_overlap_geo2rdr_'+slave)
########### ###########
configObj = config(configName) configObj = config(configName)
configObj.configure(self) configObj.configure(self)
@ -389,16 +394,42 @@ class run(object):
configObj.masterDir = os.path.join(self.work_dir, 'master') configObj.masterDir = os.path.join(self.work_dir, 'master')
configObj.geom_master = os.path.join(self.work_dir, 'geom_master') configObj.geom_master = os.path.join(self.work_dir, 'geom_master')
configObj.coregSlaveDir = os.path.join(self.work_dir, 'coreg_slaves/'+slave) configObj.coregSlaveDir = os.path.join(self.work_dir, 'coreg_slaves/'+slave)
configObj.overlapTrueOrFalse = 'True' if fullBurst == 'True':
configObj.misreg_az = os.path.join(self.work_dir, 'misreg/azimuth/dates/' + slave + '.txt')
configObj.misreg_rng = os.path.join(self.work_dir, 'misreg/range/dates/' + slave + '.txt')
configObj.overlapTrueOrFalse = 'False'
else:
configObj.overlapTrueOrFalse = 'True'
configObj.geo2rdr('[Function-1]') configObj.geo2rdr('[Function-1]')
###########
configObj.interferogram_prefix = 'coarse'
configObj.masterDir = os.path.join(self.work_dir,'master')
configObj.resamp_withCarrier('[Function-2]')
###########
configObj.finalize() configObj.finalize()
del configObj del configObj
self.runf.write(self.text_cmd + 'SentinelWrapper.py -c ' + configName + '\n') self.runf.write(self.text_cmd + 'SentinelWrapper.py -c ' + configName + '\n')
def resample_with_carrier(self, slaveList, fullBurst='False'):
for slave in slaveList:
master = self.master_date
if fullBurst == 'True':
configName = os.path.join(self.config_path, 'config_fullBurst_resample_' + slave)
else:
configName = os.path.join(self.config_path, 'config_overlap_resample_' + slave)
###########
configObj = config(configName)
configObj.configure(self)
configObj.slaveDir = os.path.join(self.work_dir, 'slaves/' + slave)
configObj.masterDir = os.path.join(self.work_dir, 'master')
configObj.coregSlaveDir = os.path.join(self.work_dir, 'coreg_slaves/' + slave)
configObj.interferogram_prefix = 'coarse'
configObj.masterDir = os.path.join(self.work_dir, 'master')
if fullBurst == 'True':
configObj.misreg_az = os.path.join(self.work_dir, 'misreg/azimuth/dates/' + slave + '.txt')
configObj.misreg_rng = os.path.join(self.work_dir, 'misreg/range/dates/' + slave + '.txt')
configObj.overlapTrueOrFalse = 'False'
else:
configObj.overlapTrueOrFalse = 'True'
configObj.resamp_withCarrier('[Function-1]')
configObj.finalize()
del configObj
self.runf.write(self.text_cmd + 'SentinelWrapper.py -c ' + configName + '\n')
def pairs_misregistration(self, dateList, safe_dict): def pairs_misregistration(self, dateList, safe_dict):
# generating overlap interferograms, estimate azimuth misregistration for each pair: # generating overlap interferograms, estimate azimuth misregistration for each pair:
@ -453,37 +484,13 @@ class run(object):
self.runf.write(self.text_cmd + 'invertMisreg.py -i ' + os.path.join(self.work_dir,'misreg/azimuth/pairs/') + ' -o ' + os.path.join(self.work_dir,'misreg/azimuth/dates/') + '\n') self.runf.write(self.text_cmd + 'invertMisreg.py -i ' + os.path.join(self.work_dir,'misreg/azimuth/pairs/') + ' -o ' + os.path.join(self.work_dir,'misreg/azimuth/dates/') + '\n')
self.runf.write(self.text_cmd + 'invertMisreg.py -i ' + os.path.join(self.work_dir,'misreg/range/pairs/') + ' -o ' + os.path.join(self.work_dir,'misreg/range/dates/') + '\n') self.runf.write(self.text_cmd + 'invertMisreg.py -i ' + os.path.join(self.work_dir,'misreg/range/pairs/') + ' -o ' + os.path.join(self.work_dir,'misreg/range/dates/') + '\n')
def geo2rdr_resample(self, slaveList):
# geometry offsets and resampling each full burst slave SLC
for slave in slaveList:
master = self.master_date
configName = os.path.join(self.config_path , 'config_resamp_' + slave)
###########
configObj = config(configName)
configObj.configure(self)
configObj.slaveDir = os.path.join(self.work_dir, 'slaves/' + slave)
configObj.masterDir = os.path.join(self.work_dir, 'master')
configObj.geom_master = os.path.join(self.work_dir, 'geom_master')
configObj.coregSlaveDir = os.path.join(self.work_dir, 'coreg_slaves/' + slave)
configObj.misreg_az = os.path.join(self.work_dir, 'misreg/azimuth/dates/' + slave + '.txt')
configObj.misreg_rng = os.path.join(self.work_dir, 'misreg/range/dates/' + slave + '.txt')
configObj.overlapTrueOrFalse = 'False'
configObj.geo2rdr('[Function-1]')
###########
configObj.interferogram_prefix = 'coarse'
configObj.masterDir = os.path.join(self.work_dir, 'master')
configObj.resamp_withCarrier('[Function-2]')
###########
configObj.finalize()
del configObj
self.runf.write(self.text_cmd + 'SentinelWrapper.py -c ' + configName + '\n')
def extractStackValidRegion(self): def extractStackValidRegion(self):
masterDir = os.path.join(self.work_dir, 'master') masterDir = os.path.join(self.work_dir, 'master')
coregSlaveDir = os.path.join(self.work_dir, 'coreg_slaves') coregSlaveDir = os.path.join(self.work_dir, 'coreg_slaves')
self.runf.write(self.text_cmd + 'extractCommonValidRegion.py -m ' + masterDir + ' -s ' + coregSlaveDir + '\n') self.runf.write(self.text_cmd + 'extractCommonValidRegion.py -m ' + masterDir + ' -s ' + coregSlaveDir + '\n')
def burstIgram_mergeBurst(self, dateList, safe_dict, pairs): def generate_burstIgram(self, dateList, safe_dict, pairs):
for date in dateList: for date in dateList:
safe_dict[date].slc = os.path.join(self.work_dir, 'coreg_slaves/'+date) safe_dict[date].slc = os.path.join(self.work_dir, 'coreg_slaves/'+date)
safe_dict[self.master_date].slc = os.path.join(self.work_dir , 'master') safe_dict[self.master_date].slc = os.path.join(self.work_dir , 'master')
@ -491,8 +498,7 @@ class run(object):
master = pair[0] master = pair[0]
slave = pair[1] slave = pair[1]
interferogramDir = os.path.join(self.work_dir, 'interferograms/' + master + '_' + slave) interferogramDir = os.path.join(self.work_dir, 'interferograms/' + master + '_' + slave)
mergedDir = os.path.join(self.work_dir, 'merged/interferograms/' + master + '_' + slave) configName = os.path.join(self.config_path ,'config_generate_igram_' + master + '_' + slave)
configName = os.path.join(self.config_path ,'config_igram_' + master + '_' + slave)
configObj = config(configName) configObj = config(configName)
configObj.configure(self) configObj.configure(self)
configObj.masterDir = safe_dict[master].slc configObj.masterDir = safe_dict[master].slc
@ -502,9 +508,26 @@ class run(object):
configObj.flatten = 'False' configObj.flatten = 'False'
configObj.overlapTrueOrFalse = 'False' configObj.overlapTrueOrFalse = 'False'
configObj.generateIgram('[Function-1]') configObj.generateIgram('[Function-1]')
configObj.finalize()
del configObj
configObj.master = configObj.interferogramDir self.runf.write(self.text_cmd + 'SentinelWrapper.py -c ' + configName + '\n')
configObj.dirName = configObj.master
def igram_mergeBurst(self, dateList, safe_dict, pairs):
for date in dateList:
safe_dict[date].slc = os.path.join(self.work_dir, 'coreg_slaves/'+date)
safe_dict[self.master_date].slc = os.path.join(self.work_dir , 'master')
for pair in pairs:
master = pair[0]
slave = pair[1]
interferogramDir = os.path.join(self.work_dir, 'interferograms/' + master + '_' + slave)
mergedDir = os.path.join(self.work_dir, 'merged/interferograms/' + master + '_' + slave)
configName = os.path.join(self.config_path ,'config_merge_igram_' + master + '_' + slave)
configObj = config(configName)
configObj.configure(self)
configObj.interferogram_prefix = 'fine'
configObj.master = interferogramDir
configObj.dirName = interferogramDir
configObj.namePattern = 'fine*int' configObj.namePattern = 'fine*int'
configObj.mergedFile = mergedDir + '/' + configObj.interferogram_prefix + '.int' configObj.mergedFile = mergedDir + '/' + configObj.interferogram_prefix + '.int'
configObj.mergeBurstsMethod = 'top' configObj.mergeBurstsMethod = 'top'
@ -513,7 +536,7 @@ class run(object):
configObj.useVirtualFiles = 'True' configObj.useVirtualFiles = 'True'
configObj.multiLook = 'True' configObj.multiLook = 'True'
configObj.stack = os.path.join(self.work_dir, 'stack') configObj.stack = os.path.join(self.work_dir, 'stack')
configObj.mergeBurst('[Function-2]') configObj.mergeBurst('[Function-1]')
configObj.finalize() configObj.finalize()
del configObj del configObj
@ -657,6 +680,7 @@ class run(object):
configObj.cohName = os.path.join(mergedDir,'filt_fine.cor') configObj.cohName = os.path.join(mergedDir,'filt_fine.cor')
configObj.unwName = os.path.join(mergedDir,'filt_fine.unw') configObj.unwName = os.path.join(mergedDir,'filt_fine.unw')
configObj.noMCF = noMCF configObj.noMCF = noMCF
configObj.rmFilter = self.rmFilter
configObj.master = os.path.join(self.work_dir,'master') configObj.master = os.path.join(self.work_dir,'master')
configObj.defoMax = defoMax configObj.defoMax = defoMax
configObj.unwMethod = self.unwMethod configObj.unwMethod = self.unwMethod

View File

@ -162,6 +162,9 @@ def createParser():
parser.add_argument('-useGPU', '--useGPU', dest='useGPU',action='store_true', default=False, parser.add_argument('-useGPU', '--useGPU', dest='useGPU',action='store_true', default=False,
help='Allow App to use GPU when available') help='Allow App to use GPU when available')
parser.add_argument('-rmFilter', '--rmFilter', dest='rmFilter', action='store_true', default=False,
help='Make an extra unwrap file in which filtering effect is removed')
return parser return parser
def cmdLineParse(iargs = None): def cmdLineParse(iargs = None):
@ -457,10 +460,16 @@ def slcStack(inps, acquisitionDates, stackMasterDate, slaveDates, safe_dict, upd
runObj.extractOverlaps() runObj.extractOverlaps()
runObj.finalize() runObj.finalize()
i+=1 i += 1
runObj = run() runObj = run()
runObj.configure(inps, 'run_' + str(i) + "_overlap_geo2rdr_resample") runObj.configure(inps, 'run_' + str(i) + "_overlap_geo2rdr")
runObj.overlap_geo2rdr_resample(slaveDates) runObj.geo2rdr_offset(slaveDates)
runObj.finalize()
i += 1
runObj = run()
runObj.configure(inps, 'run_' + str(i) + "_overlap_resample")
runObj.resample_with_carrier(slaveDates)
runObj.finalize() runObj.finalize()
i+=1 i+=1
@ -478,10 +487,16 @@ def slcStack(inps, acquisitionDates, stackMasterDate, slaveDates, safe_dict, upd
runObj.timeseries_misregistration() runObj.timeseries_misregistration()
runObj.finalize() runObj.finalize()
i+=1 i += 1
runObj = run() runObj = run()
runObj.configure(inps, 'run_' + str(i) + "_geo2rdr_resample") runObj.configure(inps, 'run_' + str(i) + "_fullBurst_geo2rdr")
runObj.geo2rdr_resample(slaveDates) runObj.geo2rdr_offset(slaveDates, fullBurst='True')
runObj.finalize()
i += 1
runObj = run()
runObj.configure(inps, 'run_' + str(i) + "_fullBurst_resample")
runObj.resample_with_carrier(slaveDates, fullBurst='True')
runObj.finalize() runObj.finalize()
i+=1 i+=1
@ -546,8 +561,14 @@ def interferogramStack(inps, acquisitionDates, stackMasterDate, slaveDates, safe
i+=1 i+=1
runObj = run() runObj = run()
runObj.configure(inps, 'run_' + str(i) + "_generate_burst_igram")
runObj.generate_burstIgram(acquisitionDates, safe_dict, pairs)
runObj.finalize()
i += 1
runObj = run()
runObj.configure(inps, 'run_' + str(i) + "_merge_burst_igram") runObj.configure(inps, 'run_' + str(i) + "_merge_burst_igram")
runObj.burstIgram_mergeBurst(acquisitionDates, safe_dict, pairs) runObj.igram_mergeBurst(acquisitionDates, safe_dict, pairs)
runObj.finalize() runObj.finalize()
i+=1 i+=1

View File

@ -38,9 +38,11 @@ from isceobj.Constants import SPEED_OF_LIGHT
import argparse import argparse
import os import os
import pickle import pickle
import sys import gdal
import numpy as np
#import shelve #import shelve
import s1a_isce_utils as ut import s1a_isce_utils as ut
from isceobj.Util.ImageUtil import ImageLib as IML
def createParser(): def createParser():
''' '''
@ -70,6 +72,9 @@ def createParser():
parser.add_argument('-m', '--method', dest='method', type=str, default='icu', parser.add_argument('-m', '--method', dest='method', type=str, default='icu',
help='unwrapping method') help='unwrapping method')
parser.add_argument('--rmfilter', action='store_true', default=False,
help='remove the effect of filtering from final unwrapped interferograms')
return parser return parser
@ -276,14 +281,48 @@ def runUnwrapIcu(infile, outfile):
#unwImage.finalizeImage() #unwImage.finalizeImage()
unwImage.renderHdr() unwImage.renderHdr()
def remove_filter(intfile, filtfile, unwfile):
outunw = os.path.abspath(unwfile).split('filt_')
outunw = outunw[0] + outunw[1]
ds_unw = gdal.Open(unwfile + ".vrt", gdal.GA_ReadOnly)
width = ds_unw.RasterXSize
length = ds_unw.RasterYSize
unw_phase = np.memmap(unwfile, dtype='f', mode='r', shape=(2, length, width))
filt_phase = np.memmap(filtfile, dtype='f', mode='r', shape=(length, width))
int_phase = np.memmap(intfile, dtype='f', mode='r', shape=(length, width))
outfile = np.memmap(outunw, dtype='f', mode='w+', shape=(2, length, width))
for line in range(length):
integer_jumps = unw_phase[1, line, :] - np.angle(filt_phase[line, :])
outfile[1, line, :] = integer_jumps + np.angle(int_phase[line, :])
outfile[0, line, :] = unw_phase[0, line, :]
unwImage = isceobj.Image.createImage()
unwImage.setFilename(outunw)
unwImage.setWidth(width)
unwImage.setLength(length)
unwImage.imageType = 'unw'
unwImage.bands = 2
unwImage.scheme = 'BIL'
unwImage.dataType = 'FLOAT'
unwImage.setAccessMode('read')
unwImage.renderHdr()
return
def main(iargs=None): def main(iargs=None):
''' '''
The main driver. The main driver.
''' '''
inps = cmdLineParse(iargs) inps = cmdLineParse(iargs)
interferogramDir = os.path.dirname(inps.intfile)
print ('unwrapping method : ' , inps.method) print ('unwrapping method : ' , inps.method)
if inps.method == 'snaphu': if inps.method == 'snaphu':
if inps.nomcf: if inps.nomcf:
fncall = runUnwrap fncall = runUnwrap
@ -298,6 +337,13 @@ def main(iargs=None):
elif inps.method == 'icu': elif inps.method == 'icu':
runUnwrapIcu(inps.intfile, inps.unwfile) runUnwrapIcu(inps.intfile, inps.unwfile)
if inps.rmfilter:
filtfile = os.path.abspath(inps.intfile)
intfile = filtfile.split('filt_')
intfile = intfile[0] + intfile[1]
remove_filter(intfile, filtfile, inps.unwfile)
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -120,14 +120,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -120,12 +120,13 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and radar-coordinate water body is created four times in runRdr2Geo.py, runLook.py, runIonUwrap.py
runLookSd.py, respectively. radar-coordinate water body is used in: and runLookSd.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) masking filtered interferogram or unwrapped interferogram in sd processing (3) masking filtered interferogram or unwrapped interferogram in sd processing
(4) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -107,14 +107,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -107,14 +107,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -107,14 +107,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -107,14 +107,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -107,14 +107,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -106,12 +106,13 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and radar-coordinate water body is created four times in runRdr2Geo.py, runLook.py, runIonUwrap.py
runLookSd.py, respectively. radar-coordinate water body is used in: and runLookSd.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) masking filtered interferogram or unwrapped interferogram in sd processing (3) masking filtered interferogram or unwrapped interferogram in sd processing
(4) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -106,12 +106,13 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and radar-coordinate water body is created four times in runRdr2Geo.py, runLook.py, runIonUwrap.py
runLookSd.py, respectively. radar-coordinate water body is used in: and runLookSd.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) masking filtered interferogram or unwrapped interferogram in sd processing (3) masking filtered interferogram or unwrapped interferogram in sd processing
(4) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -106,12 +106,13 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and radar-coordinate water body is created four times in runRdr2Geo.py, runLook.py, runIonUwrap.py
runLookSd.py, respectively. radar-coordinate water body is used in: and runLookSd.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) masking filtered interferogram or unwrapped interferogram in sd processing (3) masking filtered interferogram or unwrapped interferogram in sd processing
(4) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -106,12 +106,13 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and radar-coordinate water body is created four times in runRdr2Geo.py, runLook.py, runIonUwrap.py
runLookSd.py, respectively. radar-coordinate water body is used in: and runLookSd.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) masking filtered interferogram or unwrapped interferogram in sd processing (3) masking filtered interferogram or unwrapped interferogram in sd processing
(4) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -105,14 +105,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -105,14 +105,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -105,14 +105,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -107,14 +107,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -105,14 +105,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->

View File

@ -105,14 +105,15 @@ IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 8, pp. 4492-450
<!--========================================================================================= <!--=========================================================================================
this water body is used to create water body in radar coordinate used in processing. this water body is used to create water body in radar coordinate used in processing.
radar-coordinate water body is created two times in runRdr2Geo.py and runLook.py, radar-coordinate water body is created three times in runRdr2Geo.py, runLook.py and
respectively. radar-coordinate water body is used in: runIonUwrap.py, respectively. radar-coordinate water body is used in:
(1) determining the number of offsets in slc offset estimation, and radar/dem offset (1) determining the number of offsets in slc offset estimation, and radar/dem offset
estimation estimation
(2) masking filtered interferogram or unwrapped interferogram (2) masking filtered interferogram or unwrapped interferogram
(3) determining the number of offsets in slc residual offset estimation after geometric (3) determining the number of offsets in slc residual offset estimation after geometric
offset computation in coregistering slcs in dense offset. offset computation in coregistering slcs in dense offset.
(4) masking dense offset field (4) masking dense offset field
(5) mask coherence in ionosphere fitting and filtering
==========================================================================================--> ==========================================================================================-->
<!--<property name="water body">None</property>--> <!--<property name="water body">None</property>-->