2020-03-29 02:19:21 +00:00
|
|
|
#
|
|
|
|
# Author: Cunren Liang
|
|
|
|
# Copyright 2015-present, NASA-JPL/Caltech
|
|
|
|
#
|
|
|
|
|
|
|
|
import os
|
|
|
|
import logging
|
|
|
|
|
|
|
|
import isceobj
|
|
|
|
from isceobj.Alos2Proc.runSwathMosaic import swathMosaic
|
|
|
|
from isceobj.Alos2Proc.runSwathMosaic import swathMosaicParameters
|
|
|
|
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
|
|
|
|
|
|
|
|
logger = logging.getLogger('isce.alos2burstinsar.runSwathMosaic')
|
|
|
|
|
|
|
|
def runSwathMosaic(self):
|
|
|
|
'''mosaic subswaths
|
|
|
|
'''
|
|
|
|
catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
|
|
|
|
self.updateParamemetersFromUser()
|
|
|
|
|
2020-07-02 19:40:49 +00:00
|
|
|
referenceTrack = self._insar.loadTrack(reference=True)
|
|
|
|
secondaryTrack = self._insar.loadTrack(reference=False)
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
|
2020-07-02 19:40:49 +00:00
|
|
|
for i, frameNumber in enumerate(self._insar.referenceFrames):
|
2020-03-29 02:19:21 +00:00
|
|
|
frameDir = 'f{}_{}'.format(i+1, frameNumber)
|
|
|
|
os.chdir(frameDir)
|
|
|
|
|
|
|
|
mosaicDir = 'mosaic'
|
2020-04-13 19:40:32 +00:00
|
|
|
os.makedirs(mosaicDir, exist_ok=True)
|
2020-03-29 02:19:21 +00:00
|
|
|
os.chdir(mosaicDir)
|
|
|
|
|
|
|
|
if self._insar.endingSwath-self._insar.startingSwath+1 == 1:
|
|
|
|
import shutil
|
2020-07-02 19:40:49 +00:00
|
|
|
swathDir = 's{}'.format(referenceTrack.frames[i].swaths[0].swathNumber)
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
if not os.path.isfile(self._insar.interferogram):
|
|
|
|
os.symlink(os.path.join('../', swathDir, self._insar.interferogram), self._insar.interferogram)
|
|
|
|
shutil.copy2(os.path.join('../', swathDir, self._insar.interferogram+'.vrt'), self._insar.interferogram+'.vrt')
|
|
|
|
shutil.copy2(os.path.join('../', swathDir, self._insar.interferogram+'.xml'), self._insar.interferogram+'.xml')
|
|
|
|
if not os.path.isfile(self._insar.amplitude):
|
|
|
|
os.symlink(os.path.join('../', swathDir, self._insar.amplitude), self._insar.amplitude)
|
|
|
|
shutil.copy2(os.path.join('../', swathDir, self._insar.amplitude+'.vrt'), self._insar.amplitude+'.vrt')
|
|
|
|
shutil.copy2(os.path.join('../', swathDir, self._insar.amplitude+'.xml'), self._insar.amplitude+'.xml')
|
|
|
|
|
|
|
|
# os.rename(os.path.join('../', swathDir, self._insar.interferogram), self._insar.interferogram)
|
|
|
|
# os.rename(os.path.join('../', swathDir, self._insar.interferogram+'.vrt'), self._insar.interferogram+'.vrt')
|
|
|
|
# os.rename(os.path.join('../', swathDir, self._insar.interferogram+'.xml'), self._insar.interferogram+'.xml')
|
|
|
|
# os.rename(os.path.join('../', swathDir, self._insar.amplitude), self._insar.amplitude)
|
|
|
|
# os.rename(os.path.join('../', swathDir, self._insar.amplitude+'.vrt'), self._insar.amplitude+'.vrt')
|
|
|
|
# os.rename(os.path.join('../', swathDir, self._insar.amplitude+'.xml'), self._insar.amplitude+'.xml')
|
|
|
|
|
|
|
|
#update frame parameters
|
|
|
|
#########################################################
|
2020-07-02 19:40:49 +00:00
|
|
|
frame = referenceTrack.frames[i]
|
2020-03-29 02:19:21 +00:00
|
|
|
infImg = isceobj.createImage()
|
|
|
|
infImg.load(self._insar.interferogram+'.xml')
|
|
|
|
#mosaic size
|
|
|
|
frame.numberOfSamples = infImg.width
|
|
|
|
frame.numberOfLines = infImg.length
|
|
|
|
#NOTE THAT WE ARE STILL USING SINGLE LOOK PARAMETERS HERE
|
|
|
|
#range parameters
|
|
|
|
frame.startingRange = frame.swaths[0].startingRange
|
|
|
|
frame.rangeSamplingRate = frame.swaths[0].rangeSamplingRate
|
|
|
|
frame.rangePixelSize = frame.swaths[0].rangePixelSize
|
|
|
|
#azimuth parameters
|
|
|
|
frame.sensingStart = frame.swaths[0].sensingStart
|
|
|
|
frame.prf = frame.swaths[0].prf
|
|
|
|
frame.azimuthPixelSize = frame.swaths[0].azimuthPixelSize
|
|
|
|
frame.azimuthLineInterval = frame.swaths[0].azimuthLineInterval
|
|
|
|
|
2020-07-02 19:40:49 +00:00
|
|
|
#update frame parameters, secondary
|
2020-03-29 02:19:21 +00:00
|
|
|
#########################################################
|
2020-07-02 19:40:49 +00:00
|
|
|
frame = secondaryTrack.frames[i]
|
2020-03-29 02:19:21 +00:00
|
|
|
#mosaic size
|
|
|
|
frame.numberOfSamples = int(frame.swaths[0].numberOfSamples/self._insar.numberRangeLooks1)
|
|
|
|
frame.numberOfLines = int(frame.swaths[0].numberOfLines/self._insar.numberAzimuthLooks1)
|
|
|
|
#NOTE THAT WE ARE STILL USING SINGLE LOOK PARAMETERS HERE
|
|
|
|
#range parameters
|
|
|
|
frame.startingRange = frame.swaths[0].startingRange
|
|
|
|
frame.rangeSamplingRate = frame.swaths[0].rangeSamplingRate
|
|
|
|
frame.rangePixelSize = frame.swaths[0].rangePixelSize
|
|
|
|
#azimuth parameters
|
|
|
|
frame.sensingStart = frame.swaths[0].sensingStart
|
|
|
|
frame.prf = frame.swaths[0].prf
|
|
|
|
frame.azimuthPixelSize = frame.swaths[0].azimuthPixelSize
|
|
|
|
frame.azimuthLineInterval = frame.swaths[0].azimuthLineInterval
|
|
|
|
|
|
|
|
os.chdir('../')
|
|
|
|
|
|
|
|
#save parameter file
|
2020-07-02 19:40:49 +00:00
|
|
|
self._insar.saveProduct(referenceTrack.frames[i], self._insar.referenceFrameParameter)
|
|
|
|
self._insar.saveProduct(secondaryTrack.frames[i], self._insar.secondaryFrameParameter)
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
os.chdir('../')
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
#choose offsets
|
2020-07-02 19:40:49 +00:00
|
|
|
numberOfFrames = len(referenceTrack.frames)
|
|
|
|
numberOfSwaths = len(referenceTrack.frames[i].swaths)
|
2020-03-29 02:19:21 +00:00
|
|
|
if self.swathOffsetMatching:
|
|
|
|
#no need to do this as the API support 2-d list
|
2020-07-02 19:40:49 +00:00
|
|
|
#rangeOffsets = (np.array(self._insar.swathRangeOffsetMatchingReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
#azimuthOffsets = (np.array(self._insar.swathAzimuthOffsetMatchingReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
rangeOffsets = self._insar.swathRangeOffsetMatchingReference
|
|
|
|
azimuthOffsets = self._insar.swathAzimuthOffsetMatchingReference
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
else:
|
2020-07-02 19:40:49 +00:00
|
|
|
#rangeOffsets = (np.array(self._insar.swathRangeOffsetGeometricalReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
#azimuthOffsets = (np.array(self._insar.swathAzimuthOffsetGeometricalReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
rangeOffsets = self._insar.swathRangeOffsetGeometricalReference
|
|
|
|
azimuthOffsets = self._insar.swathAzimuthOffsetGeometricalReference
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
rangeOffsets = rangeOffsets[i]
|
|
|
|
azimuthOffsets = azimuthOffsets[i]
|
|
|
|
|
|
|
|
#list of input files
|
|
|
|
inputInterferograms = []
|
|
|
|
inputAmplitudes = []
|
|
|
|
for j, swathNumber in enumerate(range(self._insar.startingSwath, self._insar.endingSwath + 1)):
|
|
|
|
swathDir = 's{}'.format(swathNumber)
|
|
|
|
inputInterferograms.append(os.path.join('../', swathDir, self._insar.interferogram))
|
|
|
|
inputAmplitudes.append(os.path.join('../', swathDir, self._insar.amplitude))
|
|
|
|
|
|
|
|
#note that frame parameters are updated after mosaicking
|
|
|
|
#mosaic amplitudes
|
2020-07-02 19:40:49 +00:00
|
|
|
swathMosaic(referenceTrack.frames[i], inputAmplitudes, self._insar.amplitude,
|
2020-03-29 02:19:21 +00:00
|
|
|
rangeOffsets, azimuthOffsets, self._insar.numberRangeLooks1, self._insar.numberAzimuthLooks1, resamplingMethod=0)
|
|
|
|
#mosaic interferograms
|
2020-07-02 19:40:49 +00:00
|
|
|
swathMosaic(referenceTrack.frames[i], inputInterferograms, self._insar.interferogram,
|
2020-03-29 02:19:21 +00:00
|
|
|
rangeOffsets, azimuthOffsets, self._insar.numberRangeLooks1, self._insar.numberAzimuthLooks1, updateFrame=True, resamplingMethod=1)
|
|
|
|
|
2020-07-02 19:40:49 +00:00
|
|
|
create_xml(self._insar.amplitude, referenceTrack.frames[i].numberOfSamples, referenceTrack.frames[i].numberOfLines, 'amp')
|
|
|
|
create_xml(self._insar.interferogram, referenceTrack.frames[i].numberOfSamples, referenceTrack.frames[i].numberOfLines, 'int')
|
2020-03-29 02:19:21 +00:00
|
|
|
|
2020-07-02 19:40:49 +00:00
|
|
|
#update secondary frame parameters here
|
|
|
|
#no matching for secondary, always use geometry
|
|
|
|
rangeOffsets = self._insar.swathRangeOffsetGeometricalSecondary
|
|
|
|
azimuthOffsets = self._insar.swathAzimuthOffsetGeometricalSecondary
|
2020-03-29 02:19:21 +00:00
|
|
|
rangeOffsets = rangeOffsets[i]
|
|
|
|
azimuthOffsets = azimuthOffsets[i]
|
2020-07-02 19:40:49 +00:00
|
|
|
swathMosaicParameters(secondaryTrack.frames[i], rangeOffsets, azimuthOffsets, self._insar.numberRangeLooks1, self._insar.numberAzimuthLooks1)
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
os.chdir('../')
|
|
|
|
|
|
|
|
#save parameter file
|
2020-07-02 19:40:49 +00:00
|
|
|
self._insar.saveProduct(referenceTrack.frames[i], self._insar.referenceFrameParameter)
|
|
|
|
self._insar.saveProduct(secondaryTrack.frames[i], self._insar.secondaryFrameParameter)
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
os.chdir('../')
|
|
|
|
|
|
|
|
|
|
|
|
#mosaic spectral diversity interferograms
|
2020-07-02 19:40:49 +00:00
|
|
|
for i, frameNumber in enumerate(self._insar.referenceFrames):
|
2020-03-29 02:19:21 +00:00
|
|
|
frameDir = 'f{}_{}'.format(i+1, frameNumber)
|
|
|
|
os.chdir(frameDir)
|
|
|
|
|
|
|
|
mosaicDir = 'mosaic'
|
2020-04-13 19:40:32 +00:00
|
|
|
os.makedirs(mosaicDir, exist_ok=True)
|
2020-03-29 02:19:21 +00:00
|
|
|
os.chdir(mosaicDir)
|
|
|
|
|
|
|
|
if self._insar.endingSwath-self._insar.startingSwath+1 == 1:
|
|
|
|
import shutil
|
2020-07-02 19:40:49 +00:00
|
|
|
swathDir = 's{}'.format(referenceTrack.frames[i].swaths[0].swathNumber)
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
for sdFile in self._insar.interferogramSd:
|
|
|
|
if not os.path.isfile(sdFile):
|
|
|
|
os.symlink(os.path.join('../', swathDir, 'spectral_diversity', sdFile), sdFile)
|
|
|
|
shutil.copy2(os.path.join('../', swathDir, 'spectral_diversity', sdFile+'.vrt'), sdFile+'.vrt')
|
|
|
|
shutil.copy2(os.path.join('../', swathDir, 'spectral_diversity', sdFile+'.xml'), sdFile+'.xml')
|
|
|
|
|
|
|
|
os.chdir('../')
|
|
|
|
os.chdir('../')
|
|
|
|
continue
|
|
|
|
|
|
|
|
#choose offsets
|
2020-07-02 19:40:49 +00:00
|
|
|
numberOfFrames = len(referenceTrack.frames)
|
|
|
|
numberOfSwaths = len(referenceTrack.frames[i].swaths)
|
2020-03-29 02:19:21 +00:00
|
|
|
if self.swathOffsetMatching:
|
|
|
|
#no need to do this as the API support 2-d list
|
2020-07-02 19:40:49 +00:00
|
|
|
#rangeOffsets = (np.array(self._insar.swathRangeOffsetMatchingReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
#azimuthOffsets = (np.array(self._insar.swathAzimuthOffsetMatchingReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
rangeOffsets = self._insar.swathRangeOffsetMatchingReference
|
|
|
|
azimuthOffsets = self._insar.swathAzimuthOffsetMatchingReference
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
else:
|
2020-07-02 19:40:49 +00:00
|
|
|
#rangeOffsets = (np.array(self._insar.swathRangeOffsetGeometricalReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
#azimuthOffsets = (np.array(self._insar.swathAzimuthOffsetGeometricalReference)).reshape(numberOfFrames, numberOfSwaths)
|
|
|
|
rangeOffsets = self._insar.swathRangeOffsetGeometricalReference
|
|
|
|
azimuthOffsets = self._insar.swathAzimuthOffsetGeometricalReference
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
rangeOffsets = rangeOffsets[i]
|
|
|
|
azimuthOffsets = azimuthOffsets[i]
|
|
|
|
|
|
|
|
#list of input files
|
|
|
|
inputSd = [[], [], []]
|
|
|
|
for j, swathNumber in enumerate(range(self._insar.startingSwath, self._insar.endingSwath + 1)):
|
|
|
|
swathDir = 's{}'.format(swathNumber)
|
|
|
|
for k, sdFile in enumerate(self._insar.interferogramSd):
|
|
|
|
inputSd[k].append(os.path.join('../', swathDir, 'spectral_diversity', sdFile))
|
|
|
|
|
|
|
|
#mosaic spectral diversity interferograms
|
|
|
|
for inputSdList, outputSdFile in zip(inputSd, self._insar.interferogramSd):
|
2020-07-02 19:40:49 +00:00
|
|
|
swathMosaic(referenceTrack.frames[i], inputSdList, outputSdFile,
|
2020-03-29 02:19:21 +00:00
|
|
|
rangeOffsets, azimuthOffsets, self._insar.numberRangeLooks1, self._insar.numberAzimuthLooks1, updateFrame=False, phaseCompensation=True, pcRangeLooks=5, pcAzimuthLooks=5, filt=True, resamplingMethod=1)
|
|
|
|
|
|
|
|
for sdFile in self._insar.interferogramSd:
|
2020-07-02 19:40:49 +00:00
|
|
|
create_xml(sdFile, referenceTrack.frames[i].numberOfSamples, referenceTrack.frames[i].numberOfLines, 'int')
|
2020-03-29 02:19:21 +00:00
|
|
|
|
|
|
|
os.chdir('../')
|
|
|
|
os.chdir('../')
|
|
|
|
|
|
|
|
|
|
|
|
catalog.printToLog(logger, "runSwathMosaic")
|
|
|
|
self._insar.procDoc.addAllFromCatalog(catalog)
|
|
|
|
|
|
|
|
|