def test_get_satpos(self, warn_mock): """Test getting the satellite position.""" orb_params = { 'nadir_longitude': 1, 'satellite_actual_longitude': 1.1, 'satellite_nominal_longitude': 1.2, 'projection_longitude': 1.3, 'nadir_latitude': 2, 'satellite_actual_latitude': 2.1, 'satellite_nominal_latitude': 2.2, 'projection_latitude': 2.3, 'satellite_actual_altitude': 3, 'satellite_nominal_altitude': 3.1, 'projection_altitude': 3.2 } dataset = mock.MagicMock( attrs={ 'orbital_parameters': orb_params, 'satellite_longitude': -1, 'satellite_latitude': -2, 'satellite_altitude': -3 }) # Nadir lon, lat, alt = get_satpos(dataset) self.assertTupleEqual((lon, lat, alt), (1, 2, 3)) # Actual orb_params.pop('nadir_longitude') orb_params.pop('nadir_latitude') lon, lat, alt = get_satpos(dataset) self.assertTupleEqual((lon, lat, alt), (1.1, 2.1, 3)) # Nominal orb_params.pop('satellite_actual_longitude') orb_params.pop('satellite_actual_latitude') orb_params.pop('satellite_actual_altitude') lon, lat, alt = get_satpos(dataset) self.assertTupleEqual((lon, lat, alt), (1.2, 2.2, 3.1)) # Projection orb_params.pop('satellite_nominal_longitude') orb_params.pop('satellite_nominal_latitude') orb_params.pop('satellite_nominal_altitude') lon, lat, alt = get_satpos(dataset) self.assertTupleEqual((lon, lat, alt), (1.3, 2.3, 3.2)) warn_mock.assert_called() # Legacy dataset.attrs.pop('orbital_parameters') lon, lat, alt = get_satpos(dataset) self.assertTupleEqual((lon, lat, alt), (-1, -2, -3))
def test_get_satpos(self, included_prefixes, preference, expected_result): """Test getting the satellite position.""" all_orb_params = { 'nadir_longitude': 1, 'satellite_actual_longitude': 1.1, 'satellite_nominal_longitude': 1.2, 'projection_longitude': 1.3, 'nadir_latitude': 2, 'satellite_actual_latitude': 2.1, 'satellite_nominal_latitude': 2.2, 'projection_latitude': 2.3, 'satellite_actual_altitude': 3, 'satellite_nominal_altitude': 3.1, 'projection_altitude': 3.2 } orb_params = { key: value for key, value in all_orb_params.items() if any(in_prefix in key for in_prefix in included_prefixes) } data_arr = xr.DataArray((), attrs={'orbital_parameters': orb_params}) with warnings.catch_warnings(record=True) as caught_warnings: lon, lat, alt = get_satpos(data_arr, preference=preference) has_satpos_warnings = any("using projection" in str(msg.message) for msg in caught_warnings) expect_warning = included_prefixes == ( "projection_", ) and preference != "projection" if expect_warning: assert has_satpos_warnings else: assert not has_satpos_warnings assert (lon, lat, alt) == expected_result
def _get_sensor_angles(data_arr: xr.DataArray) -> tuple[xr.DataArray, xr.DataArray]: sat_lon, sat_lat, sat_alt = get_satpos(data_arr) area_def = data_arr.attrs["area"] sata, satz = _get_sensor_angles_from_sat_pos(sat_lon, sat_lat, sat_alt, data_arr.attrs["start_time"], area_def, data_arr.data.chunks) sata = _geo_dask_to_data_array(sata) satz = _geo_dask_to_data_array(satz) return sata, satz
def _get_sensor_angles(data_arr: xr.DataArray) -> tuple[xr.DataArray, xr.DataArray]: preference = satpy.config.get('sensor_angles_position_preference', 'actual') sat_lon, sat_lat, sat_alt = get_satpos(data_arr, preference=preference) area_def = data_arr.attrs["area"] sata, satz = _get_sensor_angles_from_sat_pos(sat_lon, sat_lat, sat_alt, data_arr.attrs["start_time"], area_def, data_arr.data.chunks) sata = _geo_dask_to_data_array(sata) satz = _geo_dask_to_data_array(satz) return sata, satz
def _get_sensor_angles(self, vis, lons, lats): from pyorbital.orbital import get_observer_look sat_lon, sat_lat, sat_alt = get_satpos(vis) sata, satel = get_observer_look( sat_lon, sat_lat, sat_alt / 1000.0, # km vis.attrs['start_time'], lons, lats, 0) satz = 90 - satel return sata, satz
def get_angles(self, vis): """Get sun and satellite angles to use in crefl calculations.""" from pyorbital.astronomy import get_alt_az, sun_zenith_angle from pyorbital.orbital import get_observer_look lons, lats = vis.attrs['area'].get_lonlats(chunks=vis.data.chunks) lons = da.where(lons >= 1e30, np.nan, lons) lats = da.where(lats >= 1e30, np.nan, lats) suna = get_alt_az(vis.attrs['start_time'], lons, lats)[1] suna = np.rad2deg(suna) sunz = sun_zenith_angle(vis.attrs['start_time'], lons, lats) sat_lon, sat_lat, sat_alt = get_satpos(vis) sata, satel = get_observer_look( sat_lon, sat_lat, sat_alt / 1000.0, # km vis.attrs['start_time'], lons, lats, 0) satz = 90 - satel return sata, satz, suna, sunz
def get_angles(self, vis): from pyorbital.astronomy import get_alt_az, sun_zenith_angle from pyorbital.orbital import get_observer_look lons, lats = vis.attrs['area'].get_lonlats_dask(chunks=vis.data.chunks) suna = get_alt_az(vis.attrs['start_time'], lons, lats)[1] suna = np.rad2deg(suna) sunz = sun_zenith_angle(vis.attrs['start_time'], lons, lats) sat_lon, sat_lat, sat_alt = get_satpos(vis) sata, satel = get_observer_look( sat_lon, sat_lat, sat_alt / 1000.0, # km vis.attrs['start_time'], lons, lats, 0) satz = 90 - satel return sata, satz, suna, sunz
def __call__(self, projectables, optional_datasets=None, **info): """Get the atmospherical correction. Uses pyspectral. """ from pyspectral.atm_correction_ir import AtmosphericalCorrection band = projectables[0] if optional_datasets: satz = optional_datasets[0] else: from pyorbital.orbital import get_observer_look lons, lats = band.attrs['area'].get_lonlats( chunks=band.data.chunks) sat_lon, sat_lat, sat_alt = get_satpos(band) try: dummy, satel = get_observer_look( sat_lon, sat_lat, sat_alt / 1000.0, # km band.attrs['start_time'], lons, lats, 0) except KeyError: raise KeyError('Band info is missing some meta data!') satz = 90 - satel del satel logger.info('Correction for limb cooling') corrector = AtmosphericalCorrection(band.attrs['platform_name'], band.attrs['sensor']) atm_corr = corrector.get_correction(satz, band.attrs['name'], band) proj = xr.DataArray(atm_corr, attrs=band.attrs, dims=band.dims, coords=band.coords) self.apply_modifier_info(band, proj) return proj
def test_get_satpos_fails_with_informative_error(self, attrs): """Test that get_satpos raises an informative error message.""" data_arr = xr.DataArray((), attrs=attrs) with pytest.raises(KeyError, match="Unable to determine satellite position.*"): get_satpos(data_arr)