def get_los_geometry(self, geom_obj, print_msg=False): """Get the Line-of-Sight geometry info in incidence and azimuth angle in degrees.""" lat, lon = self.get_stat_lat_lon(print_msg=print_msg) # get LOS geometry if isinstance(geom_obj, str): # geometry file atr = readfile.read_attribute(geom_obj) coord = coordinate(atr, lookup_file=geom_obj) y, x = coord.geo2radar(lat, lon, print_msg=print_msg)[0:2] # check against image boundary y = max(0, y); y = min(int(atr['LENGTH'])-1, y) x = max(0, x); x = min(int(atr['WIDTH'])-1, x) box = (x, y, x+1, y+1) inc_angle = readfile.read(geom_obj, datasetName='incidenceAngle', box=box, print_msg=print_msg)[0][0,0] az_angle = readfile.read(geom_obj, datasetName='azimuthAngle', box=box, print_msg=print_msg)[0][0,0] elif isinstance(geom_obj, dict): # use mean inc/az_angle from metadata inc_angle = ut.incidence_angle(geom_obj, dimension=0, print_msg=print_msg) az_angle = ut.heading2azimuth_angle(float(geom_obj['HEADING'])) else: raise ValueError('input geom_obj is neight str nor dict: {}'.format(geom_obj)) return inc_angle, az_angle
def get_full_resolution(meta_file): """ Grab the full resolution in terms of pixel_size and ground spacing """ # check metadata file extension: only ISCE format is supported. fext = os.path.splitext(meta_file)[1] if fext not in ['.xml', '.dat']: raise ValueError('input ISCE metadata file extension "{}" not in [.xml, .dat]'.format(fext)) # get middle sub-swath xml file for Sentinel-1 data if meta_file.endswith('.xml'): meta_files = glob.glob(meta_file) mid_idx = int(len(meta_files) / 2) meta_file = meta_files[mid_idx] # extract metadata meta, frame = extract_isce_metadata(meta_file, update_mode=False) meta['WIDTH'] = frame.numberOfSamples # calculate the full azimuth/range ground resolution az_pixel_size = float(meta['AZIMUTH_PIXEL_SIZE']) #azimuth pixel size on the orbit rg_pixel_size = float(meta['RANGE_PIXEL_SIZE']) #range pixel size in LOS direction height = float(meta['HEIGHT']) inc_angle = ut.incidence_angle(meta, dimension=0) az_spacing = az_pixel_size * EARTH_RADIUS / (EARTH_RADIUS + height) #azimuth pixel size on the ground rg_spacing = rg_pixel_size / np.sin(inc_angle / 180. * np.pi) #range pixel size on the ground return az_pixel_size, az_spacing, rg_pixel_size, rg_spacing
def get_los_geometry(self, geom_obj, print_msg=False): lat, lon = self.get_stat_lat_lon(print_msg=print_msg) # get LOS geometry if isinstance(geom_obj, str): # geometry file atr = readfile.read_attribute(geom_obj) coord = coordinate(atr, lookup_file=geom_obj) y, x = coord.geo2radar(lat, lon, print_msg=print_msg)[0:2] box = (x, y, x + 1, y + 1) inc_angle = readfile.read(geom_obj, datasetName='incidenceAngle', box=box, print_msg=print_msg)[0][0, 0] az_angle = readfile.read(geom_obj, datasetName='azimuthAngle', box=box, print_msg=print_msg)[0][0, 0] head_angle = ut.azimuth2heading_angle(az_angle) elif isinstance(geom_obj, dict): # use mean inc/head_angle from metadata inc_angle = ut.incidence_angle(geom_obj, dimension=0, print_msg=print_msg) head_angle = float(geom_obj['HEADING']) # for old reading of los.rdr band2 data into headingAngle directly if (head_angle + 180.) > 45.: head_angle = ut.azimuth2heading_angle(head_angle) else: raise ValueError( 'input geom_obj is neight str nor dict: {}'.format(geom_obj)) return inc_angle, head_angle