302 lines
11 KiB
Python
302 lines
11 KiB
Python
#!/usr/bin/env python3
|
|
|
|
#
|
|
# Author: Cunren Liang
|
|
# Copyright 2015-present, NASA-JPL/Caltech
|
|
#
|
|
|
|
import os
|
|
import glob
|
|
import datetime
|
|
import numpy as np
|
|
|
|
import isce, isceobj
|
|
import isceobj.Sensor.MultiMode as MultiMode
|
|
|
|
from StackPulic import saveProduct
|
|
from StackPulic import acquisitionModesAlos2
|
|
|
|
|
|
def getAlos2StackDirs(dataDir):
|
|
'''
|
|
1. this function takes the data directory containing a list of folders, in each of
|
|
which data of a date is located, and then returns a list of date directory sorted
|
|
by acquisition date.
|
|
|
|
2. under dataDir, only folders are recognized
|
|
'''
|
|
import os
|
|
import glob
|
|
|
|
def sorter(item):
|
|
#return date
|
|
return item.split('-')[-2]
|
|
|
|
#get only folders in dataDir
|
|
dateDirs = sorted(glob.glob(os.path.join(dataDir, '*')))
|
|
dateDirs = [x for x in dateDirs if os.path.isdir(x)]
|
|
ndate = len(dateDirs)
|
|
|
|
#get first LED files in dateDirs
|
|
dateFirstleaderFiles = [sorted(glob.glob(os.path.join(x, 'LED-ALOS2*-*-*')))[0] for x in dateDirs]
|
|
#sort first LED files using date in LED file name
|
|
dateFirstleaderFiles = sorted(dateFirstleaderFiles, key=sorter)
|
|
#keep only directory from the path
|
|
dateDirs = [os.path.dirname(x) for x in dateFirstleaderFiles]
|
|
|
|
return dateDirs
|
|
|
|
|
|
def cmdLineParse():
|
|
'''
|
|
command line parser.
|
|
'''
|
|
import sys
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description='read a number of dates of data')
|
|
parser.add_argument('-idir', dest='idir', type=str, required=True,
|
|
help = 'input directory where data of each date is located. only folders are recognized')
|
|
parser.add_argument('-odir', dest='odir', type=str, required=True,
|
|
help = 'output directory where data of each date is output')
|
|
parser.add_argument('-ref_date', dest='ref_date', type=str, required=True,
|
|
help = 'reference date. format: YYMMDD')
|
|
parser.add_argument('-sec_date', dest='sec_date', type=str, nargs='+', default=[],
|
|
help = 'a number of secondary dates seperated by blanks, can also include reference date. format: YYMMDD YYMMDD YYMMDD. If provided, only read data of these dates')
|
|
parser.add_argument('-pol', dest='pol', type=str, default='HH',
|
|
help = 'polarization to process, default: HH')
|
|
parser.add_argument('-frames', dest='frames', type=str, nargs='+', default=None,
|
|
help = 'frames to process, must specify frame numbers of reference if frames are different among dates. e.g. -frames 2800 2850')
|
|
parser.add_argument('-starting_swath', dest='starting_swath', type=int, default=None,
|
|
help = 'starting swath to process.')
|
|
parser.add_argument('-ending_swath', dest='ending_swath', type=int, default=None,
|
|
help = 'starting swath to process')
|
|
parser.add_argument('-virtual', dest='virtual', action='store_true', default=False,
|
|
help='use virtual file')
|
|
|
|
|
|
if len(sys.argv) <= 1:
|
|
print('')
|
|
parser.print_help()
|
|
sys.exit(1)
|
|
else:
|
|
return parser.parse_args()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
inps = cmdLineParse()
|
|
|
|
|
|
#get user parameters from input
|
|
idir = inps.idir
|
|
odir = inps.odir
|
|
dateReference = inps.ref_date
|
|
dateSecondary = inps.sec_date
|
|
pol = inps.pol
|
|
framesInput = inps.frames
|
|
startingSwath = inps.starting_swath
|
|
endingSwath = inps.ending_swath
|
|
useVirtualFile = inps.virtual
|
|
#######################################################
|
|
|
|
|
|
#date directories sorted by acquistion date retrieved from filenames under each directory
|
|
dateDirs = getAlos2StackDirs(os.path.abspath(idir))
|
|
ndate = len(dateDirs)
|
|
|
|
if framesInput is not None:
|
|
framesInput = sorted(framesInput)
|
|
else:
|
|
framesInput = None
|
|
|
|
|
|
#1. find index of reference date:
|
|
dates = []
|
|
dateIndexReference = None
|
|
for i in range(ndate):
|
|
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
|
|
date = os.path.basename(ledFiles[0]).split('-')[-2]
|
|
dates.append(date)
|
|
if date == dateReference:
|
|
dateIndexReference = i
|
|
if dateIndexReference is None:
|
|
raise Exception('cannot get reference date {} from the data list, pleasae check your input'.format(dateReference))
|
|
|
|
|
|
#2. check if data are in the same mode
|
|
spotlightModes, stripmapModes, scansarNominalModes, scansarWideModes, scansarModes = acquisitionModesAlos2()
|
|
|
|
#first frame of reference date
|
|
ledFilesReference = sorted(glob.glob(os.path.join(dateDirs[dateIndexReference], 'LED-ALOS2*-*-*')))
|
|
modeReference = os.path.basename(ledFilesReference[0]).split('-')[-1][0:3]
|
|
|
|
if modeReference in spotlightModes:
|
|
modeGroupReference = spotlightModes
|
|
if modeReference in stripmapModes:
|
|
modeGroupReference = stripmapModes
|
|
if modeReference in scansarNominalModes:
|
|
modeGroupReference = scansarNominalModes
|
|
if modeReference in scansarWideModes:
|
|
modeGroupReference = scansarWideModes
|
|
|
|
#check aquistion mode of all frames of each date
|
|
for i in range(ndate):
|
|
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
|
|
nframe = len(ledFiles)
|
|
for j in range(nframe):
|
|
mode = os.path.basename(ledFiles[j]).split('-')[-1][0:3]
|
|
if mode not in modeGroupReference:
|
|
raise Exception('all data must be in the same acquistion mode: spotlight, stripmap, or ScanSAR mode')
|
|
|
|
|
|
#3. find frame numbers and save it in a 2-d list
|
|
frames = []
|
|
#if not set, find frames automatically
|
|
if framesInput is None:
|
|
for i in range(ndate):
|
|
frames0 = []
|
|
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
|
|
for led in ledFiles:
|
|
frames0.append( os.path.basename(led).split('-')[-3][-4:] )
|
|
frames.append(sorted(frames0))
|
|
else:
|
|
for i in range(ndate):
|
|
frames.append(framesInput)
|
|
|
|
framesReference = frames[dateIndexReference]
|
|
|
|
#check if there is equal number of frames
|
|
nframe = len(frames[dateIndexReference])
|
|
for i in range(ndate):
|
|
if nframe != len(frames[i]):
|
|
raise Exception('there are not equal number of frames to process, please check your directory of each date')
|
|
|
|
|
|
#4. set starting and ending swaths
|
|
if modeReference in spotlightModes:
|
|
if startingSwath is None:
|
|
startingSwath = 1
|
|
if endingSwath is None:
|
|
endingSwath = 1
|
|
if modeReference in stripmapModes:
|
|
if startingSwath is None:
|
|
startingSwath = 1
|
|
if endingSwath is None:
|
|
endingSwath = 1
|
|
if modeReference in scansarNominalModes:
|
|
if startingSwath is None:
|
|
startingSwath = 1
|
|
if endingSwath is None:
|
|
endingSwath = 5
|
|
if modeReference in scansarWideModes:
|
|
if startingSwath is None:
|
|
startingSwath = 1
|
|
if endingSwath is None:
|
|
endingSwath = 7
|
|
|
|
#print result
|
|
print('\nlist of dates:')
|
|
print(' index date frames')
|
|
print('=======================================================')
|
|
for i in range(ndate):
|
|
if dates[i] == dateReference:
|
|
print(' %03d %s'%(i, dates[i])+' {}'.format(frames[i])+' reference')
|
|
else:
|
|
print(' %03d %s'%(i, dates[i])+' {}'.format(frames[i]))
|
|
print('\n')
|
|
|
|
|
|
##################################################
|
|
#1. create directories and read data
|
|
##################################################
|
|
if not os.path.isdir(odir):
|
|
print('output directory {} does not exist, create'.format(odir))
|
|
os.makedirs(odir, exist_ok=True)
|
|
|
|
os.chdir(odir)
|
|
for i in range(ndate):
|
|
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
|
|
date = os.path.basename(ledFiles[0]).split('-')[-2]
|
|
dateDir = date
|
|
|
|
if dateSecondary != []:
|
|
if date not in dateSecondary:
|
|
continue
|
|
|
|
if os.path.isdir(dateDir):
|
|
print('{} already exists, do not create'.format(dateDir))
|
|
continue
|
|
else:
|
|
os.makedirs(dateDir, exist_ok=True)
|
|
os.chdir(dateDir)
|
|
|
|
sensor = MultiMode.createSensor(sensor='ALOS2', name=None)
|
|
sensor.configure()
|
|
sensor.track.configure()
|
|
|
|
for j in range(nframe):
|
|
#frame number starts with 1
|
|
frameDir = 'f{}_{}'.format(j+1, framesReference[j])
|
|
os.makedirs(frameDir, exist_ok=True)
|
|
os.chdir(frameDir)
|
|
|
|
#attach a frame to reference and secondary
|
|
frameObj = MultiMode.createFrame()
|
|
frameObj.configure()
|
|
sensor.track.frames.append(frameObj)
|
|
|
|
#swath number starts with 1
|
|
for k in range(startingSwath, endingSwath+1):
|
|
print('processing date {} frame {} swath {}'.format(date, framesReference[j], k))
|
|
|
|
swathDir = 's{}'.format(k)
|
|
os.makedirs(swathDir, exist_ok=True)
|
|
os.chdir(swathDir)
|
|
|
|
#attach a swath to sensor
|
|
swathObj = MultiMode.createSwath()
|
|
swathObj.configure()
|
|
sensor.track.frames[-1].swaths.append(swathObj)
|
|
|
|
#setup sensor
|
|
#sensor.leaderFile = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*{}-*-*'.format(framesReference[j]))))[0]
|
|
sensor.leaderFile = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*{}-*-*'.format(frames[i][j]))))[0]
|
|
if modeReference in scansarModes:
|
|
#sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*-F{}'.format(pol.upper(), framesReference[j], k))))[0]
|
|
sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*-F{}'.format(pol.upper(), frames[i][j], k))))[0]
|
|
else:
|
|
#sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*'.format(pol.upper(), framesReference[j]))))[0]
|
|
sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*'.format(pol.upper(), frames[i][j]))))[0]
|
|
sensor.outputFile = date + '.slc'
|
|
sensor.useVirtualFile = useVirtualFile
|
|
#read sensor
|
|
(imageFDR, imageData)=sensor.readImage()
|
|
(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord)=sensor.readLeader()
|
|
sensor.setSwath(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord, imageFDR, imageData)
|
|
sensor.setFrame(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord, imageFDR, imageData)
|
|
sensor.setTrack(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord, imageFDR, imageData)
|
|
os.chdir('../')
|
|
#!!!frame numbers of all dates are reset to those of reference date
|
|
sensor.track.frames[j].frameNumber = framesReference[j]
|
|
saveProduct(sensor.track.frames[-1], date + '.frame.xml')
|
|
os.chdir('../')
|
|
saveProduct(sensor.track, date + '.track.xml')
|
|
os.chdir('../')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|