def prepare_stack(inputDir, filePattern, metadata=dict(), baseline_dict=dict(), update_mode=True): print('prepare .rsc file for ', filePattern) isce_files = sorted(glob.glob(os.path.join(os.path.abspath(inputDir), '*', filePattern))) if len(isce_files) == 0: raise FileNotFoundError('no file found in pattern: {}'.format(filePattern)) # write .rsc file for each interferogram file num_file = len(isce_files) prog_bar = ptime.progressBar(maxValue=num_file) for i in range(num_file): isce_file = isce_files[i] # prepare metadata for current file ifg_metadata = readfile.read_attribute(isce_file, metafile_ext='.xml') ifg_metadata.update(metadata) dates = os.path.basename(os.path.dirname(isce_file)).split('_') ifg_metadata = add_ifgram_metadata(ifg_metadata, dates, baseline_dict) # write .rsc file rsc_file = isce_file+'.rsc' writefile.write_roipac_rsc(ifg_metadata, rsc_file, update_mode=update_mode, print_msg=False) prog_bar.update(i+1, suffix='{}_{}'.format(dates[0], dates[1])) prog_bar.close() return
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(meta, out_file): # initiate meta dict rsc = dict() rsc['FILE_LENGTH'] = meta.length rsc['WIDTH'] = meta.width rsc['XMIN'] = 0 rsc['XMAX'] = meta.width - 1 rsc['YMIN'] = 0 rsc['YMAX'] = meta.length - 1 rsc['X_FIRST'] = '{:.12f}'.format(meta.west) rsc['Y_FIRST'] = '{:.12f}'.format(meta.north) rsc['X_STEP'] = '{:.12f}'.format(meta.lon_step) rsc['Y_STEP'] = '{:.12f}'.format(meta.lat_step) rsc['X_UNIT'] = 'degrees' rsc['Y_UNIT'] = 'degrees' rsc['RLOOKS'] = 1 rsc['ALOOKS'] = 1 rsc['Z_OFFSET'] = 0 rsc['Z_SCALE'] = 1 rsc['PROJECTION'] = 'LATLON' rsc['DATE12'] = '111111-222222' rsc['DATA_TYPE'] = 'int16' # write rsc file writefile.write_roipac_rsc(rsc, out_file, print_msg=True) return out_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_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 prepare_geometry(geom_dir, metadata=dict(), update_mode=True): """Prepare and extract metadata from geometry files""" print('prepare .rsc file for geometry files') # grab all existed files isce_files = [os.path.join(os.path.abspath(geom_dir), '{}.rdr'.format(i)) for i in ['hgt','lat','lon','los','shadowMask','incLocal']] isce_files = [i for i in isce_files if os.path.isfile(i)] # write rsc file for each file for isce_file in isce_files: # prepare metadata for current file geom_metadata = readfile.read_attribute(isce_file, metafile_ext='.xml') geom_metadata.update(metadata) # write .rsc file rsc_file = isce_file+'.rsc' writefile.write_roipac_rsc(geom_metadata, rsc_file, update_mode=update_mode, print_msg=True) 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, 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: metadata : 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) metadata, frame = extract_tops_metadata(meta_file) else: print('extract metadata from ISCE/stripmapStack shelve file:', meta_file) metadata, frame = extract_stripmap_metadata(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, frame
def prepare_stack(inputDir, filePattern, metadata=dict(), baseline_dict=dict(), update_mode=True): print('prepare .rsc file for ', filePattern) if not os.path.exists( glob.glob( os.path.join(os.path.abspath(inputDir), '*', filePattern + '.xml'))[0]): filePattern = filePattern.split('.full')[0] isce_files = sorted( glob.glob( os.path.join(os.path.abspath(inputDir), '*', filePattern + '.xml'))) if len(isce_files) == 0: raise FileNotFoundError( 'no file found in pattern: {}'.format(filePattern)) slc_dates = np.sort(os.listdir(inputDir)) # write .rsc file for each interferogram file num_file = len(isce_files) prog_bar = ptime.progressBar(maxValue=num_file) for i in range(num_file): isce_file = isce_files[i].split('.xml')[0] # prepare metadata for current file slc_metadata = read_attribute(isce_file, metafile_ext='.xml') slc_metadata.update(metadata) dates = [slc_dates[0], os.path.basename(os.path.dirname(isce_file))] slc_metadata = add_slc_metadata(slc_metadata, dates, baseline_dict) # write .rsc file rsc_file = isce_file + '.rsc' writefile.write_roipac_rsc(slc_metadata, rsc_file, update_mode=update_mode, print_msg=False) prog_bar.update(i + 1, suffix='{}_{}'.format(dates[0], dates[1])) prog_bar.close() return
def prepare_stack(inputDir, filePattern, metadata=dict(), baseline_dict=dict(), update_mode=True): print('prepare .rsc file for ', filePattern) isce_files = sorted( glob.glob(os.path.join(os.path.abspath(inputDir), '*', filePattern))) if len(isce_files) == 0: raise FileNotFoundError( 'no file found in pattern: {}'.format(filePattern)) # write .rsc file for each interferogram file num_file = len(isce_files) prog_bar = ptime.progressBar(maxValue=num_file) for i in range(num_file): isce_file = isce_files[i] # prepare metadata for current file ifg_metadata = readfile.read_attribute(isce_file, metafile_ext='.xml') ifg_metadata.update(metadata) dates = os.path.basename(os.path.dirname(isce_file)).split('_') if len(dates) == 1: date1 = metadata['startUTC'][0:10].replace( '-', '') #could also be done using datetime date2 = os.path.basename(os.path.dirname(isce_file)) dates = [date1, date2] ifg_metadata = add_ifgram_metadata(ifg_metadata, dates, baseline_dict) # write .rsc file rsc_file = isce_file + '.rsc' writefile.write_roipac_rsc(ifg_metadata, rsc_file, update_mode=update_mode, print_msg=False) prog_bar.update(i + 1, suffix='{}_{}'.format(dates[0], dates[1])) prog_bar.close() return
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 prepare_stack(inputDir, filePattern, metadata=dict(), baseline_dict=dict(), processor='tops', update_mode=True): print('prepare .rsc file for ', filePattern) if processor in ['tops', 'stripmap']: isce_files = sorted(glob.glob(os.path.join(os.path.abspath(inputDir), '*', filePattern))) elif processor == 'alosStack': isce_files = sorted(glob.glob(os.path.join(os.path.abspath(inputDir), filePattern))) else: raise ValueError('Un-recognized ISCE stack processor: {}'.format(processor)) if len(isce_files) == 0: raise FileNotFoundError('no file found in pattern: {}'.format(filePattern)) # write .rsc file for each interferogram file num_file = len(isce_files) prog_bar = ptime.progressBar(maxValue=num_file) for i in range(num_file): # prepare metadata for current file isce_file = isce_files[i] if processor in ['tops', 'stripmap']: dates = os.path.basename(os.path.dirname(isce_file)).split('_') # to modify to YYYYMMDDTHHMMSS elif processor == 'alosStack': dates = os.path.basename(os.path.dirname(os.path.dirname(isce_file))).split('-') # to modify to YYYYMMDDTHHMMSS dates = ptime.yyyymmdd(dates) else: raise ValueError('Un-recognized ISCE stack processor: {}'.format(processor)) ifg_metadata = readfile.read_attribute(isce_file, metafile_ext='.xml') ifg_metadata.update(metadata) ifg_metadata = add_ifgram_metadata(ifg_metadata, dates, baseline_dict) # write .rsc file rsc_file = isce_file+'.rsc' writefile.write_roipac_rsc(ifg_metadata, rsc_file, update_mode=update_mode, print_msg=False) prog_bar.update(i+1, suffix='{}_{}'.format(dates[0], dates[1])) prog_bar.close() return
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 prepare_geometry(geom_files, meta, update_mode=True): """Prepare .rsc file for all geometry files.""" num_file = len(geom_files) if num_file == 0: raise FileNotFoundError('NO geometry file found!') # write .rsc file for each geometry file for geom_file in geom_files: # copy over the common metadata geom_meta = {} for key, value in meta.items(): geom_meta[key] = value # update from .grd file geom_meta.update(readfile.read_gdal_vrt(geom_file)) # write .rsc file rsc_file = geom_file+'.rsc' writefile.write_roipac_rsc(geom_meta, rsc_file, update_mode=update_mode, print_msg=True) return
def prepare_geometry(geom_dir, metadata=dict(), update_mode=True): """Prepare and extract metadata from geometry files""" print('prepare .rsc file for geometry files') # grab all existed files isce_files = [ os.path.join(os.path.abspath(geom_dir), '{}.rdr'.format(i)) for i in ['hgt', 'lat', 'lon', 'los', 'shadowMask', 'incLocal'] ] isce_files = [i for i in isce_files if os.path.isfile(i)] # write rsc file for each file for isce_file in isce_files: # prepare metadata for current file geom_metadata = readfile.read_attribute(isce_file, metafile_ext='.xml') geom_metadata.update(metadata) # write .rsc file rsc_file = isce_file + '.rsc' writefile.write_roipac_rsc(geom_metadata, rsc_file, update_mode=update_mode, print_msg=True) return metadata
def update_file_attribute(fname, atr_new): # Read Original Attributes atr = readfile.read_attribute(fname) print('update {} file attribute: {}'.format(atr['FILE_TYPE'], fname)) ext = os.path.splitext(fname)[1] if ext in ['.h5', '.he5']: fname = ut.add_attribute(fname, atr_new) else: if not ut.update_attribute_or_not(atr_new, atr): print( 'All updated (removed) attributes already exists (do not exists) and have the same value, skip update.' ) else: for key, value in iter(atr_new.items()): if value == 'None' and key in atr.keys(): atr.pop(key) else: atr[key] = value rsc_file = '{}.rsc'.format(fname) print('writing >>> {}'.format(rsc_file)) writefile.write_roipac_rsc(atr, out_file=rsc_file) return fname
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
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_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_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