add "unpack" and "prepare" UAVSAR_HDF5 scripts for stripmap stack (#328)
* add unpack and prepare files for UAVSAR HDF5 files * fix acq typo, expand stackStripMap to HDF5 UAVSAR * remove comments from previous UAVSAR skeleton * fix hard coded freq A, clarity on gdal format commandLT1AB
parent
ddcd4d85b9
commit
9f9e2e89fc
|
|
@ -0,0 +1,120 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
import isce # noqa
|
||||||
|
import isceobj
|
||||||
|
import subprocess
|
||||||
|
import shelve
|
||||||
|
|
||||||
|
|
||||||
|
def get_cli_args():
|
||||||
|
"""
|
||||||
|
Create command line parser.
|
||||||
|
"""
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="Prepare UAVSAR HDF5 SLC Stack files.")
|
||||||
|
parser.add_argument(
|
||||||
|
"-i",
|
||||||
|
"--input-dir",
|
||||||
|
dest="input_dir",
|
||||||
|
required=True,
|
||||||
|
help="Input UAVSAR HDF5 file",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-o",
|
||||||
|
"--output",
|
||||||
|
required=True,
|
||||||
|
help="Output SLC directory",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-p",
|
||||||
|
"--polarization",
|
||||||
|
dest="polarization",
|
||||||
|
default="VV",
|
||||||
|
help="SLC polarization (default=%(default)s ) ",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-f",
|
||||||
|
"--frequency",
|
||||||
|
default="A",
|
||||||
|
choices=("A", "B"),
|
||||||
|
help="NISAR frequency choices (choices = %(choices)s , default=%(default)s )",
|
||||||
|
)
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
def write_xml(shelveFile, slcFile):
|
||||||
|
with shelve.open(shelveFile, flag="r") as db:
|
||||||
|
frame = db["frame"]
|
||||||
|
|
||||||
|
length = frame.numberOfLines
|
||||||
|
width = frame.numberOfSamples
|
||||||
|
print(width, length)
|
||||||
|
|
||||||
|
slc = isceobj.createSlcImage()
|
||||||
|
slc.setWidth(width)
|
||||||
|
slc.setLength(length)
|
||||||
|
slc.filename = slcFile
|
||||||
|
slc.setAccessMode("write")
|
||||||
|
slc.renderHdr()
|
||||||
|
slc.renderVRT()
|
||||||
|
|
||||||
|
|
||||||
|
def get_date(file):
|
||||||
|
yyyymmdd = "20" + file.split("_")[4]
|
||||||
|
return yyyymmdd
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
The main driver.
|
||||||
|
"""
|
||||||
|
|
||||||
|
inps = get_cli_args()
|
||||||
|
|
||||||
|
outputDir = os.path.abspath(inps.output)
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
slc_files = glob.glob(os.path.join(inps.input_dir, "*.h5"))
|
||||||
|
|
||||||
|
for h5_file in slc_files:
|
||||||
|
imgDate = get_date(h5_file)
|
||||||
|
print(imgDate)
|
||||||
|
print(h5_file)
|
||||||
|
imgDir = os.path.join(outputDir, imgDate)
|
||||||
|
os.makedirs(imgDir, exist_ok=True)
|
||||||
|
|
||||||
|
cmd = (
|
||||||
|
"unpackFrame_UAVSAR_HDF5_SLC.py -i "
|
||||||
|
+ h5_file
|
||||||
|
+ " -p "
|
||||||
|
+ inps.polarization
|
||||||
|
+ " -f "
|
||||||
|
+ inps.frequency
|
||||||
|
+ " -o "
|
||||||
|
+ imgDir
|
||||||
|
)
|
||||||
|
print(cmd)
|
||||||
|
subprocess.check_call(cmd, shell=True)
|
||||||
|
|
||||||
|
slcFile = os.path.join(imgDir, imgDate + ".slc")
|
||||||
|
|
||||||
|
# Now extract the correct pol SLC from the HDF5 file
|
||||||
|
subdataset = "/science/LSAR/SLC/swaths"
|
||||||
|
subdataset += "/frequency{}/{}".format(inps.frequency, inps.polarization)
|
||||||
|
cmd = 'gdal_translate -of ISCE HDF5:"{fname}":"/{sds}" {out}'.format(
|
||||||
|
fname=h5_file, sds=subdataset, out=slcFile
|
||||||
|
)
|
||||||
|
|
||||||
|
print(cmd)
|
||||||
|
subprocess.check_call(cmd, shell=True)
|
||||||
|
|
||||||
|
shelveFile = os.path.join(imgDir, "data")
|
||||||
|
write_xml(shelveFile, slcFile)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
@ -117,7 +117,7 @@ def cmdLineParse(iargs = None):
|
||||||
def get_dates(inps):
|
def get_dates(inps):
|
||||||
|
|
||||||
dirs = glob.glob(inps.slcDir+'/*')
|
dirs = glob.glob(inps.slcDir+'/*')
|
||||||
acuisitionDates = []
|
acquisitionDates = []
|
||||||
for dirf in dirs:
|
for dirf in dirs:
|
||||||
if inps.nofocus:
|
if inps.nofocus:
|
||||||
expectedRaw = os.path.join(dirf,os.path.basename(dirf) + '.slc')
|
expectedRaw = os.path.join(dirf,os.path.basename(dirf) + '.slc')
|
||||||
|
|
@ -125,18 +125,18 @@ def get_dates(inps):
|
||||||
expectedRaw = os.path.join(dirf, os.path.basename(dirf) + '.raw')
|
expectedRaw = os.path.join(dirf, os.path.basename(dirf) + '.raw')
|
||||||
|
|
||||||
if os.path.exists(expectedRaw):
|
if os.path.exists(expectedRaw):
|
||||||
acuisitionDates.append(os.path.basename(dirf))
|
acquisitionDates.append(os.path.basename(dirf))
|
||||||
|
|
||||||
acuisitionDates.sort()
|
acquisitionDates.sort()
|
||||||
print (dirs)
|
print("dirs = ", dirs)
|
||||||
print (acuisitionDates)
|
print("acquisitionDates = ", acquisitionDates)
|
||||||
if inps.referenceDate not in acuisitionDates:
|
if inps.referenceDate not in acquisitionDates:
|
||||||
print('reference date was not found. The first acquisition will be considered as the stack reference date.')
|
print('reference date was not found. The first acquisition will be considered as the stack reference date.')
|
||||||
if inps.referenceDate is None or inps.referenceDate not in acuisitionDates:
|
if inps.referenceDate is None or inps.referenceDate not in acquisitionDates:
|
||||||
inps.referenceDate = acuisitionDates[0]
|
inps.referenceDate = acquisitionDates[0]
|
||||||
secondaryDates = acuisitionDates.copy()
|
secondaryDates = acquisitionDates.copy()
|
||||||
secondaryDates.remove(inps.referenceDate)
|
secondaryDates.remove(inps.referenceDate)
|
||||||
return acuisitionDates, inps.referenceDate, secondaryDates
|
return acquisitionDates, inps.referenceDate, secondaryDates
|
||||||
|
|
||||||
|
|
||||||
def slcStack(inps, acquisitionDates, stackReferenceDate, secondaryDates, pairs, splitFlag=False, rubberSheet=False):
|
def slcStack(inps, acquisitionDates, stackReferenceDate, secondaryDates, pairs, splitFlag=False, rubberSheet=False):
|
||||||
|
|
@ -334,7 +334,7 @@ def main(iargs=None):
|
||||||
runDir = os.path.join(inps.workDir,'run_files')
|
runDir = os.path.join(inps.workDir,'run_files')
|
||||||
os.makedirs(runDir, exist_ok=True)
|
os.makedirs(runDir, exist_ok=True)
|
||||||
|
|
||||||
if inps.sensor and inps.sensor.lower() == 'uavsar_stack': # don't try to calculate baselines for UAVSAR_STACK data
|
if inps.sensor and inps.sensor.lower().startswith('uavsar'): # don't try to calculate baselines for UAVSAR_STACK data
|
||||||
pairs = selectPairs(inps,stackReferenceDate, secondaryDates, acquisitionDates,doBaselines=False)
|
pairs = selectPairs(inps,stackReferenceDate, secondaryDates, acquisitionDates,doBaselines=False)
|
||||||
else:
|
else:
|
||||||
pairs = selectPairs(inps,stackReferenceDate, secondaryDates, acquisitionDates,doBaselines=True)
|
pairs = selectPairs(inps,stackReferenceDate, secondaryDates, acquisitionDates,doBaselines=True)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import isce # noqa
|
||||||
|
from isceobj.Sensor import createSensor
|
||||||
|
import shelve
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def cmdLineParse():
|
||||||
|
"""
|
||||||
|
Command line parser.
|
||||||
|
"""
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Unpack UAVSAR SLC data and store metadata in pickle file."
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-i",
|
||||||
|
"--input",
|
||||||
|
dest="h5_file",
|
||||||
|
required=True,
|
||||||
|
help="Input UAVSAR HDF5 file",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-o",
|
||||||
|
"--output",
|
||||||
|
dest="slc_dir",
|
||||||
|
required=True,
|
||||||
|
help="Output SLC directory",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-p",
|
||||||
|
"--polarization",
|
||||||
|
dest="polarization",
|
||||||
|
default="VV",
|
||||||
|
help="SLC polarization (default=%(default)s ) ",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-f",
|
||||||
|
"--frequency",
|
||||||
|
default="A",
|
||||||
|
choices=("A", "B"),
|
||||||
|
help="NISAR frequency choices (choices = %(choices)s , default=%(default)s )",
|
||||||
|
)
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
def unpack(h5_file, slc_dir, frequency="A", polarization="VV"):
|
||||||
|
"""
|
||||||
|
Unpack HDF5 to binary SLC file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
obj = createSensor("UAVSAR_HDF5_SLC")
|
||||||
|
obj.configure()
|
||||||
|
obj.hdf5 = h5_file
|
||||||
|
obj.frequency = "frequency" + frequency
|
||||||
|
obj.polarization = polarization
|
||||||
|
|
||||||
|
if not os.path.isdir(slc_dir):
|
||||||
|
os.mkdir(slc_dir)
|
||||||
|
|
||||||
|
# obj.parse()
|
||||||
|
date = os.path.basename(slc_dir)
|
||||||
|
obj.output = os.path.join(slc_dir, date + ".slc")
|
||||||
|
|
||||||
|
obj.extractImage()
|
||||||
|
obj.frame.getImage().renderHdr()
|
||||||
|
|
||||||
|
obj.extractDoppler()
|
||||||
|
|
||||||
|
pickName = os.path.join(slc_dir, "data")
|
||||||
|
with shelve.open(pickName) as db:
|
||||||
|
db["frame"] = obj.frame
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
"""
|
||||||
|
Main driver.
|
||||||
|
"""
|
||||||
|
|
||||||
|
inps = cmdLineParse()
|
||||||
|
inps.slc_dir.rstrip("/")
|
||||||
|
inps.h5_file.rstrip("/")
|
||||||
|
|
||||||
|
unpack(inps.h5_file, inps.slc_dir, inps.frequency, inps.polarization)
|
||||||
Loading…
Reference in New Issue