def __call__(self, projectables, optional_datasets=None, **info): """Get the corrected reflectance when removing Rayleigh scattering. Uses pyspectral. """ from pyspectral.rayleigh import Rayleigh if not optional_datasets or len(optional_datasets) != 4: vis, red = self.match_data_arrays(projectables) sata, satz, suna, sunz = self.get_angles(vis) red.data = da.rechunk(red.data, vis.data.chunks) else: vis, red, sata, satz, suna, sunz = self.match_data_arrays( projectables + optional_datasets) sata, satz, suna, sunz = optional_datasets # get the dask array underneath sata = sata.data satz = satz.data suna = suna.data sunz = sunz.data # First make sure the two azimuth angles are in the range 0-360: sata = sata % 360. suna = suna % 360. ssadiff = da.absolute(suna - sata) ssadiff = da.minimum(ssadiff, 360 - ssadiff) del sata, suna atmosphere = self.attrs.get('atmosphere', 'us-standard') aerosol_type = self.attrs.get('aerosol_type', 'marine_clean_aerosol') rayleigh_key = (vis.attrs['platform_name'], vis.attrs['sensor'], atmosphere, aerosol_type) logger.info( "Removing Rayleigh scattering with atmosphere '%s' and " "aerosol type '%s' for '%s'", atmosphere, aerosol_type, vis.attrs['name']) if rayleigh_key not in self._rayleigh_cache: corrector = Rayleigh(vis.attrs['platform_name'], vis.attrs['sensor'], atmosphere=atmosphere, aerosol_type=aerosol_type) self._rayleigh_cache[rayleigh_key] = corrector else: corrector = self._rayleigh_cache[rayleigh_key] try: refl_cor_band = corrector.get_reflectance(sunz, satz, ssadiff, vis.attrs['name'], red.data) except (KeyError, IOError): logger.warning( "Could not get the reflectance correction using band name: %s", vis.attrs['name']) logger.warning( "Will try use the wavelength, however, this may be ambiguous!") refl_cor_band = corrector.get_reflectance( sunz, satz, ssadiff, vis.attrs['wavelength'][1], red.data) proj = vis - refl_cor_band proj.attrs = vis.attrs self.apply_modifier_info(vis, proj) return proj
def __call__(self, projectables, optional_datasets=None, **info): """Get the corrected reflectance when removing Rayleigh scattering. Uses pyspectral. """ from pyspectral.rayleigh import Rayleigh (vis, red) = projectables if vis.shape != red.shape: raise IncompatibleAreas try: (sata, satz, suna, sunz) = optional_datasets except ValueError: from pyorbital.astronomy import get_alt_az, sun_zenith_angle from pyorbital.orbital import get_observer_look lons, lats = vis.info['area'].get_lonlats() sunalt, suna = get_alt_az(vis.info['start_time'], lons, lats) suna = np.rad2deg(suna) sunz = sun_zenith_angle(vis.info['start_time'], lons, lats) sata, satel = get_observer_look(vis.info['satellite_longitude'], vis.info['satellite_latitude'], vis.info['satellite_altitude'], vis.info['start_time'], lons, lats, 0) satz = 90 - satel del satel LOG.info('Removing Rayleigh scattering and aerosol absorption') # First make sure the two azimuth angles are in the range 0-360: sata = np.mod(sata, 360.) suna = np.mod(suna, 360.) ssadiff = np.abs(suna - sata) ssadiff = np.where(ssadiff > 180, 360 - ssadiff, ssadiff) del sata, suna atmosphere = self.info.get('atmosphere', 'us-standard') aerosol_type = self.info.get('aerosol_type', 'marine_clean_aerosol') corrector = Rayleigh(vis.info['platform_name'], vis.info['sensor'], atmosphere=atmosphere, aerosol_type=aerosol_type) try: refl_cor_band = corrector.get_reflectance(sunz, satz, ssadiff, vis.id.name, red) except KeyError: LOG.warning( "Could not get the reflectance correction using band name: %s", vis.id.name) LOG.warning( "Will try use the wavelength, however, this may be ambiguous!") refl_cor_band = corrector.get_reflectance(sunz, satz, ssadiff, vis.id.wavelength[1], red) proj = Dataset(vis - refl_cor_band, copy=False, **vis.info) self.apply_modifier_info(vis, proj) return proj
def __call__(self, projectables, optional_datasets=None, **info): """Get the corrected reflectance when removing Rayleigh scattering. Uses pyspectral. """ from pyspectral.rayleigh import Rayleigh if not optional_datasets or len(optional_datasets) != 4: vis, red = self.check_areas(projectables) sata, satz, suna, sunz = self.get_angles(vis) red.data = da.rechunk(red.data, vis.data.chunks) else: vis, red, sata, satz, suna, sunz = self.check_areas( projectables + optional_datasets) sata, satz, suna, sunz = optional_datasets # get the dask array underneath sata = sata.data satz = satz.data suna = suna.data sunz = sunz.data LOG.info('Removing Rayleigh scattering and aerosol absorption') # First make sure the two azimuth angles are in the range 0-360: sata = sata % 360. suna = suna % 360. ssadiff = da.absolute(suna - sata) ssadiff = da.minimum(ssadiff, 360 - ssadiff) del sata, suna atmosphere = self.attrs.get('atmosphere', 'us-standard') aerosol_type = self.attrs.get('aerosol_type', 'marine_clean_aerosol') rayleigh_key = (vis.attrs['platform_name'], vis.attrs['sensor'], atmosphere, aerosol_type) if rayleigh_key not in self._rayleigh_cache: corrector = Rayleigh(vis.attrs['platform_name'], vis.attrs['sensor'], atmosphere=atmosphere, aerosol_type=aerosol_type) self._rayleigh_cache[rayleigh_key] = corrector else: corrector = self._rayleigh_cache[rayleigh_key] try: refl_cor_band = corrector.get_reflectance(sunz, satz, ssadiff, vis.attrs['name'], red.data) except (KeyError, IOError): LOG.warning("Could not get the reflectance correction using band name: %s", vis.attrs['name']) LOG.warning("Will try use the wavelength, however, this may be ambiguous!") refl_cor_band = corrector.get_reflectance(sunz, satz, ssadiff, vis.attrs['wavelength'][1], red.data) proj = vis - refl_cor_band proj.attrs = vis.attrs self.apply_modifier_info(vis, proj) return proj
def __call__(self, projectables, optional_datasets=None, **info): """Get the corrected reflectance when removing Rayleigh scattering. Uses pyspectral. """ from pyspectral.rayleigh import Rayleigh (vis, blue) = projectables if vis.shape != blue.shape: raise IncompatibleAreas try: (sata, satz, suna, sunz) = optional_datasets except ValueError: from pyorbital.astronomy import get_alt_az, sun_zenith_angle from pyorbital.orbital import get_observer_look sunalt, suna = get_alt_az( vis.info['start_time'], *vis.info['area'].get_lonlats()) suna = np.rad2deg(suna) sunz = sun_zenith_angle( vis.info['start_time'], *vis.info['area'].get_lonlats()) lons, lats = vis.info['area'].get_lonlats() sata, satel = get_observer_look(vis.info['satellite_longitude'], vis.info['satellite_latitude'], vis.info['satellite_altitude'], vis.info['start_time'], lons, lats, 0) satz = 90 - satel del satel LOG.info('Removing Rayleigh scattering and aerosol absorption') ssadiff = np.abs(suna - sata) ssadiff = np.where(ssadiff > 180, 360 - ssadiff, ssadiff) del sata, suna atmosphere = self.info.get('atmosphere', 'us-standard') aerosol_type = self.info.get('aerosol_type', 'marine_clean_aerosol') corrector = Rayleigh(vis.info['platform_name'], vis.info['sensor'], atmosphere=atmosphere, aerosol_type=aerosol_type) refl_cor_band = corrector.get_reflectance( sunz, satz, ssadiff, vis.id.wavelength[1], blue) proj = Dataset(vis - refl_cor_band, copy=False, **vis.info) self.apply_modifier_info(vis, proj) return proj
def __call__(self, projectables, optional_datasets=None, **info): """Get the corrected reflectance when removing Rayleigh scattering. Uses pyspectral. """ from pyspectral.rayleigh import Rayleigh (vis, ) = projectables try: (sata, satz, suna, sunz) = optional_datasets except ValueError: from pyorbital.astronomy import get_alt_az, sun_zenith_angle from pyorbital.orbital import get_observer_look sunalt, suna = get_alt_az(vis.info['start_time'], *vis.info['area'].get_lonlats()) sunz = sun_zenith_angle(vis.info['start_time'], *vis.info['area'].get_lonlats()) lons, lats = vis.info['area'].get_lonlats() sata, satel = get_observer_look(vis.info['satellite_longitude'], vis.info['satellite_latitude'], vis.info['satellite_altitude'], vis.info['start_time'], lons, lats, 0) satz = 90 - satel LOG.info('Removing Rayleigh scattering') ssadiff = np.abs(suna - sata) ssadiff = np.where(np.greater(ssadiff, 180), 360 - ssadiff, ssadiff) corrector = Rayleigh(vis.info['platform_name'], vis.info['sensor'], atmosphere='us-standard', rural_aerosol=False) refl_cor_band = corrector.get_reflectance(sunz, satz, ssadiff, vis.info['id'].wavelength[1], vis) proj = Projectable(vis - refl_cor_band, copy=False, **vis.info) self.apply_modifier_info(vis, proj) return proj
def __call__(self, projectables, optional_datasets=None, **info): """Get the corrected reflectance when removing Rayleigh scattering. Uses pyspectral. """ from pyspectral.rayleigh import Rayleigh (vis,) = projectables try: (sata, satz, suna, sunz) = optional_datasets except ValueError: from pyorbital.astronomy import get_alt_az, sun_zenith_angle from pyorbital.orbital import get_observer_look sunalt, suna = get_alt_az( vis.info['start_time'], *vis.info['area'].get_lonlats()) sunz = sun_zenith_angle( vis.info['start_time'], *vis.info['area'].get_lonlats()) lons, lats = vis.info['area'].get_lonlats() sata, satel = get_observer_look(vis.info['satellite_longitude'], vis.info['satellite_latitude'], vis.info['satellite_altitude'], vis.info['start_time'], lons, lats, 0) satz = 90 - satel LOG.info('Removing Rayleigh scattering') ssadiff = np.abs(suna - sata) ssadiff = np.where(np.greater(ssadiff, 180), 360 - ssadiff, ssadiff) corrector = Rayleigh( vis.info['platform_name'], vis.info['sensor'], atmosphere='us-standard', rural_aerosol=False) refl_cor_band = corrector.get_reflectance( sunz, satz, ssadiff, vis.info['id'].wavelength[1], vis) proj = Projectable(vis - refl_cor_band, copy=False, **vis.info) self.apply_modifier_info(vis, proj) return proj
from pyorbital.astronomy import get_alt_az from pyorbital.orbital import get_observer_look sunalt, suna = get_alt_az(utc_time, lons, lats) suna = np.rad2deg(suna) #sata, satel = get_observer_look(sat_lon, sat_lat, sat_alt, vis.attrs['start_time'], lons, lats, 0) sata, satel = get_observer_look(longitude, 0.0, sat_h, utc_time, lons, lats, 0) satz = 90 - satel # Reyleigh Correction atmosphere = 'us-standard' aerosol_type = 'rayleigh_only' rayleigh_key = ('GOES-16', 'abi', atmosphere, aerosol_type) corrector = Rayleigh('GOES-16', 'abi', atmosphere=atmosphere, aerosol_type=aerosol_type) sata = sata % 360. suna = suna % 360. ssadiff = np.absolute(suna - sata) ssadiff = np.minimum(ssadiff, 360 - ssadiff) red = data2 * 100 refl_cor_band_c01 = corrector.get_reflectance(sun_zenith, satz, ssadiff, 'C01', redband=red) data1 = data1 - (refl_cor_band_c01 / 100)