def prepare_los_geometry(geom_file): """Prepare LOS geometry data/info in geo-coordinates Parameters: geom_file - str, path of geometry file Returns: inc_angle - 2D np.ndarray, incidence angle in radians head_angle - 2D np.ndarray, heading angle in radians atr - dict, metadata in geo-coordinate """ print('read/prepare LOS geometry from file: {}'.format(geom_file)) atr = readfile.read_attribute(geom_file) print('read incidence / azimuth angle') inc_angle = readfile.read(geom_file, datasetName='incidenceAngle')[0] az_angle = readfile.read(geom_file, datasetName='azimuthAngle')[0] # geocode inc/az angle data if in radar-coord if 'Y_FIRST' not in atr.keys(): print('-' * 50) print('geocoding the incidence / azimuth angle ...') res_obj = resample(lut_file=geom_file, src_file=geom_file) res_obj.open() res_obj.prepare() # resample data box = res_obj.src_box_list[0] inc_angle = res_obj.run_resample(src_data=inc_angle[box[1]:box[3], box[0]:box[2]]) az_angle = res_obj.run_resample(src_data=az_angle[box[1]:box[3], box[0]:box[2]]) # update attribute atr = attr.update_attribute4radar2geo(atr, res_obj=res_obj) # azimuth angle --> heading angle head_angle = ut.azimuth2heading_angle(az_angle) # unit: degree to radian inc_angle *= np.pi / 180. head_angle *= np.pi / 180. return inc_angle, head_angle, atr
def run_geocode(inps): """geocode all input files""" start_time = time.time() # feed the largest file for resample object initiation ind_max = np.argmax([os.path.getsize(i) for i in inps.file]) # prepare geometry for geocoding res_obj = resample(lut_file=inps.lookupFile, src_file=inps.file[ind_max], SNWE=inps.SNWE, lalo_step=inps.laloStep, interp_method=inps.interpMethod, fill_value=inps.fillValue, nprocs=inps.nprocs, max_memory=inps.maxMemory, software=inps.software, print_msg=True) res_obj.open() res_obj.prepare() # resample input files one by one for infile in inps.file: print('-' * 50 + '\nresampling file: {}'.format(infile)) ext = os.path.splitext(infile)[1] atr = readfile.read_attribute(infile, datasetName=inps.dset) outfile = auto_output_filename(infile, inps) # update_mode if inps.updateMode: print('update mode: ON') if ut.run_or_skip(outfile, in_file=[infile, inps.lookupFile]) == 'skip': continue ## prepare output # update metadata if inps.radar2geo: atr = attr.update_attribute4radar2geo(atr, res_obj=res_obj) else: atr = attr.update_attribute4geo2radar(atr, res_obj=res_obj) # instantiate output file file_is_hdf5 = os.path.splitext(infile)[1] in ['.h5', '.he5'] if file_is_hdf5: writefile.layout_hdf5(outfile, metadata=atr, ref_file=infile) else: dsDict = dict() ## run dsNames = readfile.get_dataset_list(infile, datasetName=inps.dset) maxDigit = max([len(i) for i in dsNames]) for dsName in dsNames: if not file_is_hdf5: dsDict[dsName] = np.zeros((res_obj.length, res_obj.width)) # loop for block-by-block IO for i in range(res_obj.num_box): src_box = res_obj.src_box_list[i] dest_box = res_obj.dest_box_list[i] # read print('-' * 50 + '\nreading {d:<{w}} in block {b} from {f} ...'.format( d=dsName, w=maxDigit, b=src_box, f=os.path.basename(infile))) data = readfile.read(infile, datasetName=dsName, box=src_box, print_msg=False)[0] # resample data = res_obj.run_resample(src_data=data, box_ind=i) # write / save block data if data.ndim == 3: block = [ 0, data.shape[0], dest_box[1], dest_box[3], dest_box[0], dest_box[2] ] else: block = [ dest_box[1], dest_box[3], dest_box[0], dest_box[2] ] if file_is_hdf5: print('write data in block {} to file: {}'.format( block, outfile)) writefile.write_hdf5_block(outfile, data=data, datasetName=dsName, block=block, print_msg=False) else: dsDict[dsName][block[0]:block[1], block[2]:block[3]] = data # for binary file: ensure same data type if not file_is_hdf5: dsDict[dsName] = np.array(dsDict[dsName], dtype=data.dtype) # write binary file if not file_is_hdf5: writefile.write(dsDict, out_file=outfile, metadata=atr, ref_file=infile) m, s = divmod(time.time() - start_time, 60) print('time used: {:02.0f} mins {:02.1f} secs.\n'.format(m, s)) return outfile
def prepare_los_geometry(geom_file): """Prepare LOS geometry data/info in geo-coordinates Parameters: geom_file - str, path of geometry file Returns: inc_angle - 2D np.ndarray, incidence angle in radians head_angle - 2D np.ndarray, heading angle in radians atr - dict, metadata in geo-coordinate """ print('prepare LOS geometry in geo-coordinates from file: {}'.format( geom_file)) atr = readfile.read_attribute(geom_file) print('read incidenceAngle from file: {}'.format(geom_file)) inc_angle = readfile.read(geom_file, datasetName='incidenceAngle')[0] if 'azimuthAngle' in readfile.get_dataset_list(geom_file): print('read azimuthAngle from file: {}'.format(geom_file)) print('convert azimuth angle to heading angle') az_angle = readfile.read(geom_file, datasetName='azimuthAngle')[0] head_angle = ut.azimuth2heading_angle(az_angle) else: print('use the HEADING attribute as the mean heading angle') head_angle = np.ones(inc_angle.shape, dtype=np.float32) * float( atr['HEADING']) # geocode inc/az angle data if in radar-coord if 'Y_FIRST' not in atr.keys(): print('-' * 50) print('geocoding the incidence / heading angles ...') res_obj = resample(lut_file=geom_file, src_file=geom_file) res_obj.open() res_obj.prepare() # resample data box = res_obj.src_box_list[0] inc_angle = res_obj.run_resample(src_data=inc_angle[box[1]:box[3], box[0]:box[2]]) head_angle = res_obj.run_resample(src_data=head_angle[box[1]:box[3], box[0]:box[2]]) # update attribute atr = attr.update_attribute4radar2geo(atr, res_obj=res_obj) # for 'Y_FIRST' not in 'degree' # e.g. meters for UTM projection from ASF HyP3 if not atr['Y_UNIT'].lower().startswith('deg'): # get SNWE in meter length, width = int(atr['LENGTH']), int(atr['WIDTH']) N = float(atr['Y_FIRST']) W = float(atr['X_FIRST']) y_step = float(atr['Y_STEP']) x_step = float(atr['X_STEP']) S = N + y_step * length E = W + x_step * width # SNWE in meter --> degree lat0, lon0 = ut.to_latlon(atr['OG_FILE_PATH'], W, N) lat1, lon1 = ut.to_latlon(atr['OG_FILE_PATH'], E, S) lat_step = (lat1 - lat0) / length lon_step = (lon1 - lon0) / width # update Y/X_FIRST/STEP/UNIT atr['Y_FIRST'] = lat0 atr['X_FIRST'] = lon0 atr['Y_STEP'] = lat_step atr['X_STEP'] = lon_step atr['Y_UNIT'] = 'degrees' atr['X_UNIT'] = 'degrees' # unit: degree to radian inc_angle *= np.pi / 180. head_angle *= np.pi / 180. return inc_angle, head_angle, atr