def extract_metadata(fname): """Read/extract attributes from ROI_PAC .unw, .int, .cor file. For each unwrapped interferogram or spatial coherence file, there are 2 .rsc files: basic metadata file and baseline parameter file. e.g. filt_100901-110117-sim_HDR_4rlks_c10.unw filt_100901-110117-sim_HDR_4rlks_c10.unw.rsc 100901-110117_baseline.rsc Inputs: fname : string, ROI_PAC interferogram filename or path, i.e. /KujuT422F650AlosA/filt_100901-110117-sim_HDR_4rlks_c10.unw Outputs: atr : dict, Attributes dictionary """ # 1. Read basic metadata file basic_rsc_file = fname + '.rsc' if not os.path.isfile(basic_rsc_file) and fname.endswith( '_snap_connect.byt'): unw_rsc_file = '{}.unw.rsc'.format(fname.split('_snap_connect.byt')[0]) copyCmd = 'cp {} {}'.format(unw_rsc_file, basic_rsc_file) print(copyCmd) os.system(copyCmd) basic_dict = readfile.read_roipac_rsc(basic_rsc_file) # return if baseline attributes are already existed. if 'P_BASELINE_TOP_HDR' in basic_dict.keys(): return basic_rsc_file atr = {} atr['PROCESSOR'] = 'roipac' atr['FILE_TYPE'] = os.path.splitext(fname)[1] # 2. Read baseline metadata file date1, date2 = basic_dict['DATE12'].split('-') baseline_rsc_file = os.path.dirname( fname) + '/' + date1 + '_' + date2 + '_baseline.rsc' baseline_dict = readfile.read_roipac_rsc(baseline_rsc_file) # 3. Merge atr.update(basic_dict) atr.update(baseline_dict) # Write to rsc file basic_rsc_file = fname + '.rsc' try: atr_orig = readfile.read_roipac_rsc(basic_rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('merging {} into {} '.format(os.path.basename(baseline_rsc_file), os.path.basename(basic_rsc_file))) writefile.write_roipac_rsc(atr_out, out_file=basic_rsc_file) return basic_rsc_file
def extract_metadata(fname): """Read/extract attributes from ROI_PAC .unw, .int, .cor file. For each unwrapped interferogram or spatial coherence file, there are 2 .rsc files: basic metadata file and baseline parameter file. e.g. filt_100901-110117-sim_HDR_4rlks_c10.unw filt_100901-110117-sim_HDR_4rlks_c10.unw.rsc 100901-110117_baseline.rsc Inputs: fname : string, ROI_PAC interferogram filename or path, i.e. /KujuT422F650AlosA/filt_100901-110117-sim_HDR_4rlks_c10.unw Outputs: atr : dict, Attributes dictionary """ # 1. Read basic metadata file basic_rsc_file = fname+'.rsc' if not os.path.isfile(basic_rsc_file) and fname.endswith('_snap_connect.byt'): unw_rsc_file = '{}.unw.rsc'.format(fname.split('_snap_connect.byt')[0]) copyCmd = 'cp {} {}'.format(unw_rsc_file, basic_rsc_file) print(copyCmd) os.system(copyCmd) basic_dict = readfile.read_roipac_rsc(basic_rsc_file) # return if baseline attributes are already existed. if 'P_BASELINE_TOP_HDR' in basic_dict.keys(): return basic_rsc_file atr = {} atr['PROCESSOR'] = 'roipac' atr['FILE_TYPE'] = os.path.splitext(fname)[1] # 2. Read baseline metadata file date1, date2 = basic_dict['DATE12'].split('-') baseline_rsc_file = os.path.dirname(fname)+'/'+date1+'_'+date2+'_baseline.rsc' baseline_dict = readfile.read_roipac_rsc(baseline_rsc_file) # 3. Merge atr.update(basic_dict) atr.update(baseline_dict) # Write to rsc file basic_rsc_file = fname+'.rsc' try: atr_orig = readfile.read_roipac_rsc(basic_rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('merging {} into {} '.format(os.path.basename(baseline_rsc_file), os.path.basename(basic_rsc_file))) writefile.write_roipac_rsc(atr_out, out_file=basic_rsc_file) return basic_rsc_file
def extract_metadata4geometry_radar(fname): """Read/extract attribute for .hgt_sim file from Gamma to ROI_PAC Input: sim_20070813_20080310.hgt_sim sim_20070813_20080310.rdc.dem Search for: sim_20070813_20080310.diff_par Output: sim_20070813_20080310.hgt_sim.rsc sim_20070813_20080310.rdc.dem.rsc """ # Get/read GAMMA par file # for loop to get rid of multiple dot in filename fname_base = os.path.splitext(fname)[0] for i in range(5): fname_base = os.path.splitext(fname_base)[0] par_file = fname_base+'.diff_par' par_dict = readfile.read_gamma_par(par_file) # Get/read LAT/LON_REF1/2/3/4 msg = 'grab LAT/LON_REF1/2/3/4 from par file: ' # get date of one acquisition try: m_date = str(re.findall('\d{8}', fname_base)[0]) except: m_date = str(re.findall('\d{6}', fname_base)[0]) # search existing par file geom_dir = os.path.dirname(fname) #PROJECT_DIR/geom_master ifg_dir = os.path.join(geom_dir, '../*/{}_*'.format(m_date)) #PROJECT_DIR/interferograms/{m_date}_20141225 m_par_files = [os.path.join(geom_dir, '*{}*{}'.format(m_date, ext)) for ext in PAR_EXT_LIST] m_par_files += [os.path.join(ifg_dir, '*{}*{}'.format(m_date, ext)) for ext in PAR_EXT_LIST] m_par_files = ut.get_file_list(m_par_files) # read par file if len(m_par_files) > 0: m_par_file = m_par_files[0] msg += m_par_file par_dict = get_lalo_ref(m_par_file, par_dict) else: msg += ' no par file found with date: {}'.format(m_date) print(msg) # initiate ROIPAC dict atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = os.path.splitext(fname)[1] atr.update(par_dict) # Write to .rsc file rsc_file = fname+'.rsc' try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('writing >>> '+os.path.basename(rsc_file)) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file
def write_rsc_file(inps, in_file, out_file): """ write rsc file for Geodmod just estract several properities from rsc file""" # read file meta = readfile.read_roipac_rsc(in_file) # initiate dict rsc = dict() rsc['FILE_DIR'] = os.getenv('pwd') rsc['FILE_LENGTH'] = meta["FILE_LENGTH"] rsc['WIDTH'] = meta["WIDTH"] rsc['XMIN'] = 0 rsc['XMAX'] = int(meta["WIDTH"]) - 1 rsc['YMIN'] = 0 rsc['YMAX'] = int(meta["FILE_LENGTH"]) - 1 rsc['X_FIRST'] = float(meta["X_FIRST"]) rsc['Y_FIRST'] = float(meta["Y_FIRST"]) rsc['X_STEP'] = float(meta["X_STEP"]) rsc['Y_STEP'] = float(meta["Y_STEP"]) rsc['X_UNIT'] = 'degrees' rsc['Y_UNIT'] = 'degrees' rsc['RLOOKS'] = meta["RLOOKS"] rsc['ALOOKS'] = meta["ALOOKS"] rsc['Z_OFFSET'] = 0 rsc['Z_SCALE'] = 1 rsc['PROJECTION'] = 'LATLON' rsc['DATE12'] = '111111-222222' # write rsc file writefile.write_roipac_rsc(rsc, out_file, print_msg=True) return out_file
def extract_metadata4geometry_radar(fname): """Read/extract attribute for .hgt_sim file from Gamma to ROI_PAC Input: sim_20070813_20080310.hgt_sim sim_20070813_20080310.rdc.dem Search for: sim_20070813_20080310.diff_par Output: sim_20070813_20080310.hgt_sim.rsc sim_20070813_20080310.rdc.dem.rsc """ # Get/read GAMMA par file # for loop to get rid of multiple dot in filename fname_base = os.path.splitext(fname)[0] for i in range(5): fname_base = os.path.splitext(fname_base)[0] par_file = fname_base+'.diff_par' par_dict = readfile.read_gamma_par(par_file) # Get/read LAT/LON_REF1/2/3/4 msg = 'grab LAT/LON_REF1/2/3/4 from par file: ' # get date of one acquisition try: m_date = str(re.findall('\d{8}', fname_base)[0]) except: m_date = str(re.findall('\d{6}', fname_base)[0]) # search existing par file geom_dir = os.path.dirname(fname) #PROJECT_DIR/geom_master ifg_dir = os.path.join(geom_dir, '../*/{}_*'.format(m_date)) #PROJECT_DIR/interferograms/{m_date}_20141225 m_par_files = [os.path.join(geom_dir, '*{}*{}'.format(m_date, ext)) for ext in PAR_EXT_LIST] m_par_files += [os.path.join(ifg_dir, '*{}*{}'.format(m_date, ext)) for ext in PAR_EXT_LIST] m_par_files = ut.get_file_list(m_par_files) # read par file if len(m_par_files) > 0: m_par_file = m_par_files[0] msg += m_par_file par_dict = get_lalo_ref(m_par_file, par_dict) else: msg += ' no par file found with date: {}'.format(m_date) print(msg) # initiate ROIPAC dict atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = os.path.splitext(fname)[1] atr.update(par_dict) # Write to .rsc file rsc_file = fname+'.rsc' try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('writing >>> '+os.path.basename(rsc_file)) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file
def extract_isce_metadata(meta_file, geom_dir=None, rsc_file=None, update_mode=True): """Extract metadata from ISCE stack products Parameters: meta_file : str, path of metadata file, reference/IW1.xml or referenceShelve/data.dat geom_dir : str, path of geometry directory. rsc_file : str, output file name of ROIPAC format rsc file Returns: metadata : dict """ if not rsc_file: rsc_file = os.path.join(os.path.dirname(meta_file), 'data.rsc') # check existing rsc_file if update_mode and ut.run_or_skip( rsc_file, in_file=meta_file, check_readable=False) == 'skip': return readfile.read_roipac_rsc(rsc_file) # 1. extract metadata from XML / shelve file fbase = os.path.basename(meta_file) if fbase.startswith("IW"): print('extract metadata from ISCE/topsStack xml file:', meta_file) #metadata = extract_tops_metadata(meta_file)[0] metadata = isce_utils.extract_tops_metadata(meta_file)[0] metadata['sensor_type'] = 'tops' elif fbase.startswith("data"): print('extract metadata from ISCE/stripmapStack shelve file:', meta_file) #metadata = extract_stripmap_metadata(meta_file)[0] metadata = isce_utils.extract_stripmap_metadata(meta_file)[0] metadata['sensor_type'] = 'stripmap' elif fbase.endswith(".xml"): #metadata = extract_stripmap_metadata(meta_file)[0] metadata = isce_utils.extract_stripmap_metadata(meta_file)[0] else: raise ValueError( "unrecognized ISCE metadata file: {}".format(meta_file)) # 2. extract metadata from geometry file if geom_dir: metadata = isce_utils.extract_geometry_metadata(geom_dir, metadata) # 3. common metadata metadata['PROCESSOR'] = 'isce' metadata['ANTENNA_SIDE'] = '-1' # convert all value to string format for key, value in metadata.items(): metadata[key] = str(value) # write to .rsc file metadata = readfile.standardize_metadata(metadata) if rsc_file: print('writing ', rsc_file) writefile.write_roipac_rsc(metadata, rsc_file) return metadata
def extract_metadata4geometry_geo(fname): """Read/extract attribute for *.dem / *.UTM_TO_RDC file from Gamma to ROI_PAC Inputs: sim_20070813_20080310.utm.dem sim_20070813_20080310.UTM_TO_RDC Search for: sim_20070813_20080310.utm.dem.par Outputs: sim_20070813_20080310.utm.dem.rsc sim_20070813_20080310.UTM_TO_RDC.rsc """ # Get/read GAMMA par file ext = os.path.splitext(fname)[1] if ext in ['.UTM_TO_RDC']: par_file = os.path.splitext(fname)[0] + '.utm.dem.par' elif fnames[0].endswith('.utm.dem'): par_file = fname + '.par' par_dict = readfile.read_gamma_par(par_file) # initiate ROIPAC dict atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = ext if 'post_lat' in par_dict.keys(): # coordinates in degree atr['Y_UNIT'] = 'degrees' atr['X_UNIT'] = 'degrees' elif 'post_north' in par_dict.keys(): # coordinates in meter atr['Y_UNIT'] = 'm' atr['X_UNIT'] = 'm' atr['X_FIRST'] = float(par_dict['corner_east']) - int( par_dict['width']) * float(par_dict['post_east']) else: msg = 'un-recognized coordinates type:' for key, value in par_dict.items(): if key.startswith(('corner', 'post')): msg += '\n\t{}: {}'.format(key, value) raise ValueError(msg) atr.update(par_dict) # Write to .rsc file rsc_file = fname + '.rsc' try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('writing >>> ' + os.path.basename(rsc_file)) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file
def write_rsc(fname, atr): basic_rsc_file = fname+'.rsc' try: atr_orig = readfile.read_roipac_rsc(basic_rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('Extracting metadata from {} into {} '.format(os.path.basename(fname), os.path.basename(basic_rsc_file))) writefile.write_roipac_rsc(atr_out, out_file=basic_rsc_file) return basic_rsc_file
def extract_isce_metadata(meta_file, geom_dir=None, rsc_file=None, update_mode=True): """Extract metadata from ISCE stack products Parameters: meta_file : str, path of metadata file, reference/IW1.xml or referenceShelve/data.dat geom_dir : str, path of geometry directory. rsc_file : str, output file name of ROIPAC format rsc file. None for not write to disk. Returns: meta : dict frame : object, isceobj.Scene.Frame.Frame / isceobj.Scene.Burst.Burst """ # check existing rsc_file if update_mode and ut.run_or_skip( rsc_file, in_file=meta_file, check_readable=False) == 'skip': return readfile.read_roipac_rsc(rsc_file), None # 1. read/extract metadata from XML / shelve file processor = get_processor(meta_file) if processor == 'tops': print('extract metadata from ISCE/topsStack xml file:', meta_file) meta, frame = extract_tops_metadata(meta_file) elif processor == 'alosStack': print('extract metadata from ISCE/alosStack xml file:', meta_file) meta, frame = extract_alosStack_metadata(meta_file, geom_dir) else: print('extract metadata from ISCE/stripmapStack shelve file:', meta_file) meta, frame = extract_stripmap_metadata(meta_file) # 2. extract metadata from geometry file if geom_dir: if processor != 'alosStack': meta = extract_geometry_metadata(geom_dir, meta) # 3. common metadata meta['PROCESSOR'] = 'isce' if 'ANTENNA_SIDE' not in meta.keys(): meta['ANTENNA_SIDE'] = '-1' # convert all value to string format for key, value in meta.items(): meta[key] = str(value) # write to .rsc file meta = readfile.standardize_metadata(meta) if rsc_file: print('writing ', rsc_file) writefile.write_roipac_rsc(meta, rsc_file) return meta, frame
def write_rsc(atr, out_file): """Write to rsc file""" # grab atr from existing rsc file try: atr_orig = readfile.read_roipac_rsc(out_file) except: atr_orig = dict() # (over)write to rsc file if input atr has more items if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('write metadata to {} '.format(os.path.basename(out_file))) writefile.write_roipac_rsc(atr_out, out_file=out_file) return out_file
def prepare_metadata4giant(fname, meta_files=None): """Extract metadata from xml files for GIAnT time-series file.""" # check xml files if not meta_files: meta_files = auto_xml_file4giant(fname) if not meta_files: raise FileNotFoundError("no xml file found.") # extract metadata from xml files rsc_files = [i for i in meta_files if i.endswith('.rsc')] xml_files = [i for i in meta_files if i.endswith('.xml')] xml_dict = {} for rsc_file in rsc_files: print('reading {}'.format(rsc_file)) rsc_dict = readfile.read_roipac_rsc(rsc_file) for key in ['length', 'LENGTH', 'FILE_LENGTH', 'width', 'WIDTH']: try: rsc_dict.pop(key) except: pass xml_dict.update(rsc_dict) for xml_file in xml_files: print('reading {}'.format(xml_file)) xml_dict.update(read_giant_xml(xml_file)) if not xml_dict: raise ValueError('No metadata found in file: ' + xml_file) # standardize metadata names xml_dict = readfile.standardize_metadata(xml_dict) # project name sensor_name, project_name = sensor.project_name2sensor_name( os.path.abspath(fname)) if sensor_name: xml_dict['PLATFORM'] = sensor_name if project_name: xml_dict['PROJECT_NAME'] = project_name if sensor_name in project_name: tmp = project_name.split(sensor_name)[1][0] if tmp == 'A': xml_dict['ORBIT_DIRECTION'] = 'ASCENDING' else: xml_dict['ORBIT_DIRECTION'] = 'DESCENDING' # update GIAnT HDF5 file fname = ut.add_attribute(fname, xml_dict, print_msg=True) return fname
def prepare_metadata4giant(fname, meta_files=None): """Extract metadata from xml files for GIAnT time-series file.""" # check xml files if not meta_files: meta_files = auto_xml_file4giant(fname) if not meta_files: raise FileNotFoundError("no xml file found.") # extract metadata from xml files rsc_files = [i for i in meta_files if i.endswith('.rsc')] xml_files = [i for i in meta_files if i.endswith('.xml')] xml_dict = {} for rsc_file in rsc_files: print('reading {}'.format(rsc_file)) rsc_dict = readfile.read_roipac_rsc(rsc_file) for key in ['length', 'LENGTH', 'FILE_LENGTH', 'width', 'WIDTH']: try: rsc_dict.pop(key) except: pass xml_dict.update(rsc_dict) for xml_file in xml_files: print('reading {}'.format(xml_file)) xml_dict.update(read_giant_xml(xml_file)) if not xml_dict: raise ValueError('No metadata found in file: '+xml_file) # standardize metadata names xml_dict = readfile.standardize_metadata(xml_dict) # project name sensor_name, project_name = sensor.project_name2sensor_name(os.path.abspath(fname)) if sensor_name: xml_dict['PLATFORM'] = sensor_name if project_name: xml_dict['PROJECT_NAME'] = project_name if sensor_name in project_name: tmp = project_name.split(sensor_name)[1][0] if tmp == 'A': xml_dict['ORBIT_DIRECTION'] = 'ASCENDING' else: xml_dict['ORBIT_DIRECTION'] = 'DESCENDING' # update GIAnT HDF5 file fname = ut.add_attribute(fname, xml_dict, print_msg=True) return fname
def extract_isce_metadata(meta_file, geom_dir=None, rsc_file=None, update_mode=True): """Extract metadata from ISCE stack products Parameters: meta_file : str, path of metadata file, master/IW1.xml or masterShelve/data.dat geom_dir : str, path of geometry directory. rsc_file : str, output file name of ROIPAC format rsc file Returns: metadata : dict """ if not rsc_file: rsc_file = os.path.join(os.path.dirname(meta_file), 'data.rsc') # check existing rsc_file if update_mode and ut.run_or_skip( rsc_file, in_file=meta_file, check_readable=False) == 'skip': return readfile.read_roipac_rsc(rsc_file) # 1. read/extract metadata from XML / shelve file processor = get_processor(meta_file) if processor == 'tops': print('extract metadata from ISCE/topsStack xml file:', meta_file) metadata = extract_tops_metadata(meta_file)[0] else: print('extract metadata from ISCE/stripmapStack shelve file:', meta_file) metadata = extract_stripmap_metadata(meta_file)[0] # 2. extract metadata from geometry file if geom_dir: metadata = extract_geometry_metadata(geom_dir, metadata) # 3. common metadata metadata['PROCESSOR'] = 'isce' metadata['ANTENNA_SIDE'] = '-1' # convert all value to string format for key, value in metadata.items(): metadata[key] = str(value) # write to .rsc file metadata = readfile.standardize_metadata(metadata) if rsc_file: print('writing ', rsc_file) writefile.write_roipac_rsc(metadata, rsc_file) return metadata
def extract_isce_metadata(meta_file, geom_dir=None, rsc_file=None, update_mode=True): """Extract metadata from ISCE stack products Parameters: meta_file : str, path of metadata file, master/IW1.xml or masterShelve/data.dat geom_dir : str, path of geometry directory. rsc_file : str, output file name of ROIPAC format rsc file Returns: metadata : dict """ if not rsc_file: rsc_file = os.path.join(os.path.dirname(meta_file), 'data.rsc') # check existing rsc_file if update_mode and ut.run_or_skip(rsc_file, in_file=meta_file, check_readable=False) == 'skip': return readfile.read_roipac_rsc(rsc_file) # 1. extract metadata from XML / shelve file fbase = os.path.basename(meta_file) if fbase.startswith("IW"): print('extract metadata from ISCE/topsStack xml file:', meta_file) metadata = extract_tops_metadata(meta_file) elif fbase.startswith("data"): print('extract metadata from ISCE/stripmapStack shelve file:', meta_file) metadata = extract_stripmap_metadata(meta_file) elif fbase.endswith(".xml"): metadata = extract_stripmap_metadata(meta_file) else: raise ValueError("unrecognized ISCE metadata file: {}".format(meta_file)) # 2. extract metadata from geometry file if geom_dir: metadata = extract_geometry_metadata(geom_dir, metadata) # 3. common metadata metadata['PROCESSOR'] = 'isce' metadata['ANTENNA_SIDE'] = '-1' # convert all value to string format for key, value in metadata.items(): metadata[key] = str(value) # write to .rsc file metadata = readfile.standardize_metadata(metadata) if rsc_file: print('writing ', rsc_file) writefile.write_roipac_rsc(metadata, rsc_file) return metadata
def write_roipac_rsc(metadata, out_file, update_mode=False, print_msg=False): """Write attribute dict into ROI_PAC .rsc file Inputs: metadata : dict, attributes dictionary out_file : rsc file name, to which attribute is writen update_mode : bool, skip writing if 1) output file existed AND 2) no new metadata key/value print_msg : bool, print message Output: out_file """ run = True if update_mode: rsc_dict = dict() if os.path.isfile(out_file): rsc_dict = readfile.read_roipac_rsc(out_file) # update .rsc file only if there are new metadata key/value if set(metadata.items()).issubset(set(rsc_dict.items())): run = False if run: # Convert MintPy attributes to ROI_PAC attributes if 'LENGTH' in metadata.keys(): metadata['FILE_LENGTH'] = metadata['LENGTH'] # Convert 3.333e-4 to 0.0003333 if 'X_STEP' in metadata.keys(): metadata['X_STEP'] = str(float(metadata['X_STEP'])) metadata['Y_STEP'] = str(float(metadata['Y_STEP'])) metadata['X_FIRST'] = str(float(metadata['X_FIRST'])) metadata['Y_FIRST'] = str(float(metadata['Y_FIRST'])) # writing .rsc file if print_msg: print('write', out_file) maxDigit = max([len(key) for key in metadata.keys()]+[2]) with open(out_file, 'w') as f: for key in sorted(metadata.keys()): f.write('{k:<{d}} {v}\n'.format(k=str(key), d=maxDigit, v=str(metadata[key]))) return out_file
def write_roipac_rsc(metadata, out_file, update_mode=False, print_msg=False): """Write attribute dict into ROI_PAC .rsc file Inputs: metadata : dict, attributes dictionary out_file : rsc file name, to which attribute is writen update_mode : bool, skip writing if 1) output file existed AND 2) no new metadata key/value print_msg : bool, print message Output: out_file """ run = True if update_mode: rsc_dict = dict() if os.path.isfile(out_file): rsc_dict = readfile.read_roipac_rsc(out_file) # update .rsc file only if there are new metadata key/value if set(metadata.items()).issubset(set(rsc_dict.items())): run = False if run: # Convert MintPy attributes to ROI_PAC attributes if 'LENGTH' in metadata.keys(): metadata['FILE_LENGTH'] = metadata['LENGTH'] # Convert 3.333e-4 to 0.0003333 if 'X_STEP' in metadata.keys(): metadata['X_STEP'] = str(float(metadata['X_STEP'])) metadata['Y_STEP'] = str(float(metadata['Y_STEP'])) metadata['X_FIRST'] = str(float(metadata['X_FIRST'])) metadata['Y_FIRST'] = str(float(metadata['Y_FIRST'])) # writing .rsc file if print_msg: print('write', out_file) maxDigit = max([len(key) for key in metadata.keys()] + [2]) with open(out_file, 'w') as f: for key in sorted(metadata.keys()): f.write('{k:<{d}} {v}\n'.format(k=str(key), d=maxDigit, v=str(metadata[key]))) return out_file
def extract_metadata4geometry_geo(fname): """Read/extract attribute for *.dem / *.UTM_TO_RDC file from Gamma to ROI_PAC Inputs: sim_20070813_20080310.utm.dem sim_20070813_20080310.UTM_TO_RDC Search for: sim_20070813_20080310.utm.dem.par Outputs: sim_20070813_20080310.utm.dem.rsc sim_20070813_20080310.UTM_TO_RDC.rsc """ # Get/read GAMMA par file ext = os.path.splitext(fname)[1] if ext in ['.UTM_TO_RDC']: par_file = os.path.splitext(fname)[0]+'.utm.dem.par' elif fnames[0].endswith('.utm.dem'): par_file = fname+'.par' par_dict = readfile.read_gamma_par(par_file) # initiate ROIPAC dict atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = ext atr['Y_UNIT'] = 'degrees' atr['X_UNIT'] = 'degrees' atr.update(par_dict) # Write to .rsc file rsc_file = fname+'.rsc' try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('writing >>> '+os.path.basename(rsc_file)) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file
def extract_metadata4geometry_geo(fname): """Read/extract attribute for *.dem / *.UTM_TO_RDC file from Gamma to ROI_PAC Inputs: sim_20070813_20080310.utm.dem sim_20070813_20080310.UTM_TO_RDC Search for: sim_20070813_20080310.utm.dem.par Outputs: sim_20070813_20080310.utm.dem.rsc sim_20070813_20080310.UTM_TO_RDC.rsc """ # Get/read GAMMA par file ext = os.path.splitext(fname)[1] if ext in ['.UTM_TO_RDC']: par_file = os.path.splitext(fname)[0] + '.utm.dem.par' elif fnames[0].endswith('.utm.dem'): par_file = fname + '.par' par_dict = readfile.read_gamma_par(par_file) # initiate ROIPAC dict atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = ext atr['Y_UNIT'] = 'degrees' atr['X_UNIT'] = 'degrees' atr.update(par_dict) # Write to .rsc file rsc_file = fname + '.rsc' try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('writing >>> ' + os.path.basename(rsc_file)) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file
def extract_gmtsar_metadata(unw_file, template_file, rsc_file=None, update_mode=True): """Extract metadata from GMTSAR interferogram stack.""" # update_mode: check existing rsc_file if update_mode and ut.run_or_skip(rsc_file, in_file=unw_file, check_readable=False) == 'skip': return readfile.read_roipac_rsc(rsc_file) ifg_dir = os.path.dirname(unw_file) # 1. read *.PRM file prm_file = get_prm_files(ifg_dir)[0] meta = readfile.read_gmtsar_prm(prm_file) meta['PROCESSOR'] = 'gmtsar' # 2. read template file: HEADING, ORBIT_DIRECTION template = readfile.read_template(template_file) for key in ['HEADING', 'ORBIT_DIRECTION']: if key in template.keys(): meta[key] = template[key].lower() else: raise ValueError('Attribute {} is missing! Please manually specify it in the template file.') # 3. grab A/RLOOKS from radar-coord data file meta['ALOOKS'], meta['RLOOKS'] = get_multilook_number(ifg_dir) meta['AZIMUTH_PIXEL_SIZE'] *= meta['ALOOKS'] meta['RANGE_PIXEL_SIZE'] *= meta['RLOOKS'] # 4. grab LAT/LON_REF1/2/3/4 from geo-coord data file meta = get_lalo_ref(ifg_dir, meta) # 5. grab X/Y_FIRST/STEP from unw_file if in geo-coord ds = gdal.Open(unw_file, gdal.GA_ReadOnly) transform = ds.GetGeoTransform() x_step = abs(transform[1]) y_step = abs(transform[5]) * -1. if 1e-7 < x_step < 1.: meta['X_STEP'] = x_step meta['Y_STEP'] = y_step meta['X_FIRST'] = transform[0] - x_step / 2. meta['Y_FIRST'] = transform[3] - y_step / 2. # constrain longitude within (-180, 180] if meta['X_FIRST'] > 180.: meta['X_FIRST'] -= 360. # 6. extra metadata for the missing geometry dataset: SLANT_RANGE_DISTANCE / INCIDENCE_ANGLE # for dataset in geo-coordinates if 'Y_FIRST' in meta.keys(): meta = get_slant_range_distance(ifg_dir, meta) Re = float(meta['EARTH_RADIUS']) H = float(meta['HEIGHT']) Rg = float(meta['SLANT_RANGE_DISTANCE']) Inc = (np.pi - np.arccos((Re**2 + Rg**2 - (Re+H)**2) / (2*Re*Rg))) * 180./np.pi meta['INCIDENCE_ANGLE'] = Inc # convert all value to string format for key, value in meta.items(): meta[key] = str(value) # write to .rsc file meta = readfile.standardize_metadata(meta) if rsc_file: print('writing ', rsc_file) os.makedirs(os.path.dirname(rsc_file), exist_ok=True) writefile.write_roipac_rsc(meta, rsc_file) return meta
def extract_metadata4interferogram(fname, sensor_name=None): """Read/extract attributes from Gamma .unw, .cor and .int file Parameters: fname : str, Gamma interferogram filename or path, i.e. /PopoSLT143TsxD/diff_filt_HDR_130118-130129_4rlks.unw Returns: atr : dict, Attributes dictionary """ file_dir = os.path.dirname(fname) file_basename = os.path.basename(fname) rsc_file = fname+'.rsc' # if os.path.isfile(rsc_file): # return rsc_file atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = os.path.splitext(fname)[1] # Get info: date12, num of loooks try: date12 = str(re.findall('\d{8}[-_]\d{8}', file_basename)[0]) except: date12 = str(re.findall('\d{6}[-_]\d{6}', file_basename)[0]) m_date, s_date = date12.replace('-', '_').split('_') atr['DATE12'] = ptime.yymmdd(m_date)+'-'+ptime.yymmdd(s_date) lks = os.path.splitext(file_basename)[0].split(date12)[1] #lks = os.path.splitext(file_basename.split(date12)[1])[0] # Read .off and .par file off_files = file_dir+'/*'+date12+lks+'.off' m_par_files = [file_dir+'/*'+m_date+lks+i for i in PAR_EXT_LIST] s_par_files = [file_dir+'/*'+s_date+lks+i for i in PAR_EXT_LIST] try: m_par_file = ut.get_file_list(m_par_files)[0] except: m_par_file = None print('\nERROR: Can not find reference date .par file, it supposed to be like: '+m_par_files) try: s_par_file = ut.get_file_list(s_par_files)[0] except: s_par_file = None print('\nERROR: Can not find secondary date .par file, it supposed to be like: '+s_par_files) try: off_file = ut.get_file_list(off_files)[0] except: off_file = file_dir+'/'+date12+lks+'.off' offCmd = 'create_offset {} {} {} 1 1 1 0'.format(m_par_file, s_par_file, off_file) print(offCmd) os.system(offCmd) par_dict = readfile.read_gamma_par(m_par_file) off_dict = readfile.read_gamma_par(off_file) atr.update(par_dict) atr.update(off_dict) # Perp Baseline Info atr = get_perp_baseline(m_par_file, s_par_file, off_file, atr) # LAT/LON_REF1/2/3/4 atr = get_lalo_ref(m_par_file, atr) # NCORRLOOKS if sensor_name: rg_bandwidth = float(atr['chirp_bandwidth']) rg_resolution = SPEED_OF_LIGHT / (2. * rg_bandwidth) rg_pixel_size = float(atr['RANGE_PIXEL_SIZE']) / float(atr['RLOOKS']) rg_fact = rg_resolution / rg_pixel_size antenna_length = sensor.SENSOR_DICT[sensor_name]['antenna_length'] az_resolution = antenna_length / 2 az_pixel_size = float(atr['AZIMUTH_PIXEL_SIZE']) / float(atr['ALOOKS']) az_fact = az_resolution / az_pixel_size ncorr_looks = float(atr['RLOOKS']) * float(atr['ALOOKS']) / (rg_fact * az_fact) atr['NCORRLOOKS'] = ncorr_looks # Write to .rsc file try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('merge %s, %s and %s into %s' % (os.path.basename(m_par_file), os.path.basename(s_par_file), os.path.basename(off_file), os.path.basename(rsc_file))) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file
def extract_metadata4interferogram(fname): """Read/extract attributes from Gamma .unw, .cor and .int file Parameters: fname : str, Gamma interferogram filename or path, i.e. /PopoSLT143TsxD/diff_filt_HDR_130118-130129_4rlks.unw Returns: atr : dict, Attributes dictionary """ file_dir = os.path.dirname(fname) file_basename = os.path.basename(fname) rsc_file = fname+'.rsc' # if os.path.isfile(rsc_file): # return rsc_file atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = os.path.splitext(fname)[1] # Get info: date12, num of loooks try: date12 = str(re.findall('\d{8}[-_]\d{8}', file_basename)[0]) except: date12 = str(re.findall('\d{6}[-_]\d{6}', file_basename)[0]) m_date, s_date = date12.replace('-', '_').split('_') atr['DATE12'] = ptime.yymmdd(m_date)+'-'+ptime.yymmdd(s_date) lks = os.path.splitext(file_basename)[0].split(date12)[1] #lks = os.path.splitext(file_basename.split(date12)[1])[0] # Read .off and .par file off_files = file_dir+'/*'+date12+lks+'.off' m_par_files = [file_dir+'/*'+m_date+lks+i for i in PAR_EXT_LIST] s_par_files = [file_dir+'/*'+s_date+lks+i for i in PAR_EXT_LIST] try: m_par_file = ut.get_file_list(m_par_files)[0] except: m_par_file = None print('\nERROR: Can not find master date .par file, it supposed to be like: '+m_par_files) try: s_par_file = ut.get_file_list(s_par_files)[0] except: s_par_file = None print('\nERROR: Can not find slave date .par file, it supposed to be like: '+s_par_files) try: off_file = ut.get_file_list(off_files)[0] except: off_file = file_dir+'/'+date12+lks+'.off' offCmd = 'create_offset {} {} {} 1 1 1 0'.format(m_par_file, s_par_file, off_file) print(offCmd) os.system(offCmd) par_dict = readfile.read_gamma_par(m_par_file) off_dict = readfile.read_gamma_par(off_file) atr.update(par_dict) atr.update(off_dict) # Perp Baseline Info atr = get_perp_baseline(m_par_file, s_par_file, off_file, atr) # LAT/LON_REF1/2/3/4 atr = get_lalo_ref(m_par_file, atr) # Write to .rsc file try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('merge %s, %s and %s into %s' % (os.path.basename(m_par_file), os.path.basename(s_par_file), os.path.basename(off_file), os.path.basename(rsc_file))) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file
def extract_metadata4interferogram(fname): """Read/extract attributes from Gamma .unw, .cor and .int file Parameters: fname : str, Gamma interferogram filename or path, i.e. /PopoSLT143TsxD/diff_filt_HDR_130118-130129_4rlks.unw Returns: atr : dict, Attributes dictionary """ file_dir = os.path.dirname(fname) file_basename = os.path.basename(fname) rsc_file = fname+'.rsc' # if os.path.isfile(rsc_file): # return rsc_file atr = {} atr['PROCESSOR'] = 'gamma' atr['FILE_TYPE'] = os.path.splitext(fname)[1] # Get info: date12, num of loooks try: date12 = str(re.findall('\d{8}[-_]\d{8}', file_basename)[0]) except: date12 = str(re.findall('\d{6}[-_]\d{6}', file_basename)[0]) m_date, s_date = date12.replace('-', '_').split('_') atr['DATE12'] = ptime.yymmdd(m_date)+'-'+ptime.yymmdd(s_date) lks = os.path.splitext(file_basename)[0].split(date12)[1] #lks = os.path.splitext(file_basename.split(date12)[1])[0] # Read .off and .par file off_files = file_dir+'/*'+date12+lks+'.off' m_par_files = [file_dir+'/*'+m_date+lks+i for i in PAR_EXT_LIST] s_par_files = [file_dir+'/*'+s_date+lks+i for i in PAR_EXT_LIST] try: m_par_file = ut.get_file_list(m_par_files)[0] except: m_par_file = None print('\nERROR: Can not find master date .par file, it supposed to be like: '+m_par_files) try: s_par_file = ut.get_file_list(s_par_files)[0] except: s_par_file = None print('\nERROR: Can not find slave date .par file, it supposed to be like: '+s_par_files) try: off_file = ut.get_file_list(off_files)[0] except: off_file = file_dir+'/'+date12+lks+'.off' offCmd = 'create_offset {} {} {} 1 1 1 0'.format(m_par_file, s_par_file, off_file) print(offCmd) os.system(offCmd) par_dict = readfile.read_gamma_par(m_par_file) off_dict = readfile.read_gamma_par(off_file) atr.update(par_dict) atr.update(off_dict) # Perp Baseline Info atr = get_perp_baseline(m_par_file, s_par_file, off_file, atr) # LAT/LON_REF1/2/3/4 atr = get_lalo_ref(m_par_file, atr) # Write to .rsc file try: atr_orig = readfile.read_roipac_rsc(rsc_file) except: atr_orig = dict() if not set(atr.items()).issubset(set(atr_orig.items())): atr_out = {**atr_orig, **atr} print('merge %s, %s and %s into %s' % (os.path.basename(m_par_file), os.path.basename(s_par_file), os.path.basename(off_file), os.path.basename(rsc_file))) writefile.write_roipac_rsc(atr_out, out_file=rsc_file) return rsc_file