def process_one_scene(scene_files, out_path, use_iband_res=False, engine='h5netcdf', all_channels=False, pps_channels=False, orbit_n=0): """Make level 1c files in PPS-format.""" tic = time.time() scn_ = Scene(reader='viirs_sdr', filenames=scene_files) MY_MBAND = MBAND_DEFAULT MY_IBAND_I = IBAND_DEFAULT_I MY_IBAND_M = IBAND_DEFAULT_M if all_channels: MY_MBAND = MBANDS MY_IBAND_I = IBANDS MY_IBAND_M = MBANDS if pps_channels: MY_MBAND = MBAND_PPS MY_IBAND_I = IBAND_PPS_I MY_IBAND_M = IBAND_PPS_M if use_iband_res: scn_.load(MY_IBAND_I + ANGLE_NAMES + ['i_latitude', 'i_longitude'], resolution=371) scn_.load(MY_IBAND_M, resolution=742) scn_ = scn_.resample(resampler='native') else: scn_.load(MY_MBAND + ANGLE_NAMES + ['m_latitude', 'm_longitude'], resolution=742) # one ir channel irch = scn_['M15'] # Set header and band attributes set_header_and_band_attrs(scn_, orbit_n=orbit_n) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Convert angles to PPS convert_angles(scn_, delete_azimuth=True) update_angle_attributes(scn_, irch) filename = compose_filename(scn_, out_path, instrument='viirs', band=irch) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='viirs'), engine=engine, include_lonlats=False, flatten_attrs=True, encoding=get_encoding_viirs(scn_)) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time() - tic)) return filename
def process_one_scene(scene_files, out_path, engine='h5netcdf', all_channels=False, pps_channels=False, orbit_n=0): """Make level 1c files in PPS-format.""" tic = time.time() scn_ = Scene(reader='modis_l1b', filenames=scene_files) MY_BANDNAMES = BANDNAMES_DEFAULT if all_channels: MY_BANDNAMES = BANDNAMES if pps_channels: MY_BANDNAMES = BANDNAMES_PPS scn_.load(MY_BANDNAMES + ['latitude', 'longitude'] + ANGLE_NAMES, resolution=1000) # one ir channel irch = scn_['31'] # Set header and band attributes set_header_and_band_attrs(scn_, orbit_n=orbit_n) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Convert angles to PPS convert_angles(scn_, delete_azimuth=True) update_angle_attributes(scn_, irch) # Apply sunz correction apply_sunz_correction(scn_, REFL_BANDS) filename = compose_filename(scn_, out_path, instrument='modis', band=irch) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='modis'), engine=engine, include_lonlats=False, flatten_attrs=True, encoding=get_encoding_modis(scn_)) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time() - tic)) return filename
def process_one_scene(scene_files, out_path): """Make level 1c files in PPS-format.""" tic = time.time() scn_ = Scene(reader='vii_l1b_nc', filenames=scene_files) scn_.load(BANDNAMES + ANGLE_NAMES + ['lat_pixels', 'lon_pixels']) # Transpose data to get scanlines as row dimension for key in BANDNAMES + ANGLE_NAMES + ['lat_pixels', 'lon_pixels']: if 'num_pixels' in scn_[key].dims: # satpy <= 0 .26.0 scn_[key] = scn_[key].transpose('num_lines', 'num_pixels') elif scn_[key].dims[0] == 'x': # first dim should be y scn_[key] = scn_[key].transpose('y', 'x') # one ir channel irch = scn_['vii_10690'] # Set header and band attributes set_header_and_band_attrs(scn_) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Adjust lons to valid range: adjust_lons_to_valid_range(scn_) # Convert angles to PPS convert_angles(scn_, delete_azimuth=True) update_angle_attributes(scn_, irch) # Apply sunz correction # apply_sunz_correction(scn_, REFL_BANDS) filename = compose_filename(scn_, out_path, instrument='metimage', band=irch) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='metimage'), engine='h5netcdf', include_lonlats=False, flatten_attrs=True, encoding=get_encoding_metimage(scn_)) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time()-tic))
def process_one_scene(scene_files, out_path, engine='h5netcdf', orbit_n=0): """Make level 1c files in PPS-format.""" tic = time.time() if 'AVHR_xxx' in scene_files[0]: avhrr_reader = 'avhrr_l1b_eps' angles = ANGLE_NAMES_EPS else: avhrr_reader = 'avhrr_l1b_aapp' angles = ANGLE_NAMES_AAPP scn_ = Scene( reader=avhrr_reader, filenames=scene_files) scn_.load(BANDNAMES + ['latitude', 'longitude'] + angles) # one ir channel irch = scn_['4'] # Check if we have old hrpt format with data only every 20th line check_broken_data(scn_) # Set header and band attributes set_header_and_band_attrs(scn_, orbit_n=orbit_n) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Convert angles to PPS convert_angles(scn_, delete_azimuth=True) update_angle_attributes(scn_, irch) # Apply sunz correction apply_sunz_correction(scn_, REFL_BANDS) filename = compose_filename(scn_, out_path, instrument='avhrr', band=irch) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='avhrr'), engine=engine, include_lonlats=False, flatten_attrs=True, encoding=get_encoding_avhrr(scn_)) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time()-tic)) return filename
def process_one_scene(scene_files, out_path, engine='h5netcdf', all_channels=False, pps_channels=False): """Make level 1c files in PPS-format.""" tic = time.time() scn_ = Scene( reader='slstr_l1b', filenames=scene_files) MY_BANDNAMES = BANDNAMES_DEFAULT if all_channels: MY_BANDNAMES = BANDNAMES if pps_channels: MY_BANDNAMES = BANDNAMES_PPS scn_.load(MY_BANDNAMES + ['latitude', 'longitude'] + ANGLE_NAMES) # Everything should be on the same grid, to be saved as ppsleve1c scn_ = scn_.resample(resampler="native") # one ir channel irch = scn_['S8'] # Set header and band attributes set_header_and_band_attrs(scn_) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Convert angles to PPS convert_angles(scn_, delete_azimuth=True) update_angle_attributes(scn_, irch) filename = compose_filename(scn_, out_path, instrument='slstr', band=irch) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='slstr'), engine=engine, include_lonlats=False, flatten_attrs=True, encoding=get_encoding_slstr(scn_)) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time()-tic))
def process_one_scene(scene_files, out_path, engine='h5netcdf'): """Make level 1c files in PPS-format.""" tic = time.time() scn_ = Scene(reader='mersi2_l1b', filenames=scene_files) scn_.load(BANDNAMES + ['latitude', 'longitude'] + ANGLE_NAMES, resolution=1000) # Remove bad data at first and last column remove_broken_data(scn_) # one ir channel irch = scn_['24'] # Set header and band attributes set_header_and_band_attrs(scn_) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Convert angles to PPS convert_angles(scn_, delete_azimuth=True) update_angle_attributes(scn_, irch) for angle in ['sunzenith', 'satzenith', 'azimuthdiff']: scn_[angle].attrs['file_key'] = ANGLE_ATTRIBUTES['mersi2_file_key'][ angle] filename = compose_filename(scn_, out_path, instrument='mersi2', band=irch) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='mersi-2'), engine=engine, include_lonlats=False, flatten_attrs=True, encoding=get_encoding_mersi2(scn_)) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time() - tic)) return filename
def process_one_file(eumgacfdr_file, out_path='.', reader_kwargs=None, start_line=None, end_line=None, engine='h5netcdf', remove_broken=True): """Make level 1c files in PPS-format.""" tic = time.time() scn_ = Scene(reader='avhrr_l1c_eum_gac_fdr_nc', filenames=[eumgacfdr_file]) scn_.load(BANDNAMES) scn_.load([ 'latitude', 'longitude', 'qual_flags', 'equator_crossing_time', 'equator_crossing_longitude', 'acq_time' ] + ANGLENAMES) # Only load these if we do not crop data if start_line is None and end_line is None: scn_.load(['overlap_free_end', 'overlap_free_start', 'midnight_line']) # Needs to be done before everything else to avoid problems with attributes. if remove_broken: logger.info("Setting low quality data (qual_flags) to nodata.") remove_broken_data(scn_) # Crop after all renaming of variables are done # Problems to rename if cropping is done first. set_exact_time_and_crop(scn_, start_line, end_line, time_key='acq_time') irch = scn_[ 'brightness_temperature_channel_4'] # Redefine, to get updated start/end_times # One ir channel irch = scn_['brightness_temperature_channel_4'] # Set header and band attributes set_header_and_band_attrs(scn_) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Convert angles to PPS convert_angles(scn_) update_angle_attributes(scn_, irch) # Standard name etc # Handle gac specific datasets qual_flags and scanline_timestamps update_ancilliary_datasets(scn_) filename = compose_filename(scn_, out_path, instrument='avhrr', band=irch) encoding = get_encoding_gac(scn_) scn_.save_datasets( writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='avhrr'), engine=engine, flatten_attrs=True, include_lonlats=False, # Included anyway as they are datasets in scn_ pretty=True, encoding=encoding) logger.info("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time() - tic)) return filename
def process_one_scan(tslot_files, out_path, rotate=True, engine='h5netcdf', use_nominal_time_in_filename=False, apply_sun_earth_distance_correction=True): """Make level 1c files in PPS-format.""" for fname in tslot_files: if not os.path.isfile(fname): raise FileNotFoundError('No such file: {}'.format(fname)) tic = time.time() scn_ = load_and_calibrate( tslot_files, apply_sun_earth_distance_correction=apply_sun_earth_distance_correction, rotate=rotate) # Find lat/lon data lons, lats = get_lonlats(scn_['IR_108']) # Compute angles suna, sunz = get_solar_angles(scn_, lons=lons, lats=lats) sata, satz = get_satellite_angles(scn_['IR_108'], lons=lons, lats=lats) azidiff = make_azidiff_angle(sata, suna) # Update coordinates update_coords(scn_) # Add ancillary datasets to the scene add_ancillary_datasets(scn_, lons=lons, lats=lats, sunz=sunz, satz=satz, azidiff=azidiff) add_proj_satpos(scn_) # Set attributes. This changes SEVIRI band names to PPS band names. set_attrs(scn_) # Write datasets to netcdf ir108_for_filename = scn_['IR_108'] if use_nominal_time_in_filename: ir108_for_filename = set_nominal_scan_time(ir108_for_filename) filename = compose_filename(scene=scn_, out_path=out_path, instrument='seviri', band=ir108_for_filename) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_), engine=engine, encoding=get_encoding_seviri(scn_), unlimited_dims=['time'], include_lonlats=False, pretty=True, flatten_attrs=True, exclude_attrs=['raw_metadata']) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time() - tic)) # About 40 seconds return filename
def process_one_file(gac_file, out_path='.', reader_kwargs=None, engine='h5netcdf', orbit_n=99999): """Make level 1c files in PPS-format.""" tic = time.time() if reader_kwargs is None: reader_kwargs = {} if 'tle_dir' not in reader_kwargs: from pygac.configuration import get_config conf = get_config() tle_dir = conf.get('tle', 'tledir', raw=True) tle_name = conf.get('tle', 'tlename', raw=True) reader_kwargs['tle_dir'] = tle_dir reader_kwargs['tle_name'] = tle_name scn_ = Scene(reader='avhrr_l1b_gaclac', filenames=[gac_file], reader_kwargs=reader_kwargs) # Loading all at once sometimes fails with newer satpy, so start with BANDNAMES ... scn_.load(BANDNAMES) scn_.load([ 'latitude', 'longitude', 'qual_flags', 'sensor_zenith_angle', 'solar_zenith_angle', 'solar_azimuth_angle', 'sensor_azimuth_angle', 'sun_sensor_azimuth_difference_angle' ]) # one ir channel irch = scn_['4'] # Set header and band attributes set_header_and_band_attrs(scn_, orbit_n=orbit_n) # Rename longitude, latitude to lon, lat. rename_latitude_longitude(scn_) # Convert angles to PPS convert_angles(scn_) update_angle_attributes(scn_, irch) # Handle gac specific datasets qual_flags and scanline_timestamps update_ancilliary_datasets(scn_) filename = compose_filename(scn_, out_path, instrument='avhrr', band=irch) encoding = get_encoding_gac(scn_) encoding['scanline_timestamps'].pop('units') scn_.save_datasets( writer='cf', filename=filename, header_attrs=get_header_attrs(scn_, band=irch, sensor='avhrr'), engine=engine, flatten_attrs=True, include_lonlats=False, # Included anyway as they are datasets in scn_ pretty=True, encoding=encoding) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time() - tic)) return filename
def process_one_scan(tslot_files, out_path, rotate=True, engine='h5netcdf'): """Make level 1c files in PPS-format.""" for fname in tslot_files: if not os.path.isfile(fname): raise FileNotFoundError('No such file: {}'.format(fname)) tic = time.time() parser = Parser(HRIT_FILE_PATTERN) platform_shortname = parser.parse(os.path.basename( tslot_files[0]))['platform_shortname'] start_time = parser.parse(os.path.basename(tslot_files[0]))['start_time'] # Load and calibrate data using inter-calibration coefficients from # Meirink et al coefs = get_calibration_for_time(platform=platform_shortname, time=start_time) scn_ = Scene(reader='seviri_l1b_hrit', filenames=tslot_files, reader_kwargs={ 'calib_mode': CALIB_MODE, 'ext_calib_coefs': coefs }) if not scn_.attrs['sensor'] == {'seviri'}: raise ValueError('Not SEVIRI data') scn_.load(BANDNAMES) # By default pixel (0,0) is S-E. Rotate bands so that (0,0) is N-W. if rotate: for band in BANDNAMES: rotate_band(scn_, band) scn_.attrs['image_rotated'] = rotate # Find lat/lon data lons, lats = get_lonlats(scn_['IR_108']) # Compute angles suna, sunz = get_solar_angles(scn_, lons=lons, lats=lats) sata, satz = get_satellite_angles(scn_['IR_108'], lons=lons, lats=lats) azidiff = make_azidiff_angle(sata, suna) # Update coordinates update_coords(scn_) # Add ancillary datasets to the scene add_ancillary_datasets(scn_, lons=lons, lats=lats, sunz=sunz, satz=satz, azidiff=azidiff) add_proj_satpos(scn_) # Set attributes. This changes SEVIRI band names to PPS band names. set_attrs(scn_) # Write datasets to netcdf filename = compose_filename(scene=scn_, out_path=out_path, instrument='seviri', band=scn_['IR_108']) scn_.save_datasets(writer='cf', filename=filename, header_attrs=get_header_attrs(scn_), engine=engine, encoding=get_encoding_seviri(scn_), unlimited_dims=['time'], include_lonlats=False, pretty=True, flatten_attrs=True, exclude_attrs=['raw_metadata']) print("Saved file {:s} after {:3.1f} seconds".format( os.path.basename(filename), time.time() - tic)) # About 40 seconds return filename