コード例 #1
0
ファイル: test_utils.py プロジェクト: xingyaozhang1/satpy
    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))
コード例 #2
0
    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
コード例 #3
0
ファイル: angles.py プロジェクト: xwtang/satpy
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
コード例 #4
0
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
コード例 #5
0
 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
コード例 #6
0
 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
コード例 #7
0
ファイル: viirs.py プロジェクト: rolle-at-work/satpy
    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
コード例 #8
0
ファイル: atmosphere.py プロジェクト: youssef-osrhir/satpy
    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
コード例 #9
0
 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)