Esempio n. 1
0
    def test_fy3d_250_resolutions(self):
        """Test loading data when only 250m resolutions are available."""
        from satpy.tests.utils import make_dataid
        from satpy.readers import load_reader
        from satpy.dataset.data_dict import get_key
        filenames = [
            'tf2019071182739.FY3D-X_MERSI_0250M_L1B.HDF',
            'tf2019071182739.FY3D-X_MERSI_GEOQK_L1B.HDF',
        ]
        reader = load_reader(self.reader_configs)
        files = reader.select_files_from_pathnames(filenames)
        self.assertEqual(2, len(files))
        reader.create_filehandlers(files)
        # Make sure we have some files
        self.assertTrue(reader.file_handlers)

        # Verify that we have multiple resolutions for:
        #     - Bands 1-4 (visible)
        #     - Bands 24-25 (IR)
        available_datasets = reader.available_dataset_ids
        for band_name in ('1', '2', '3', '4', '24', '25'):
            if band_name in ('24', '25'):
                # don't know how to get radiance for IR bands
                num_results = 2
            else:
                num_results = 3
            ds_id = make_dataid(name=band_name, resolution=250)
            res = get_key(ds_id, available_datasets,
                          num_results=num_results, best=False)
            self.assertEqual(num_results, len(res))
            ds_id = make_dataid(name=band_name, resolution=1000)
            with pytest.raises(KeyError):
                res = get_key(ds_id, available_datasets,
                              num_results=num_results, best=False)

        res = reader.load(['1', '2', '3', '4', '5', '20', '24', '25'])
        self.assertEqual(6, len(res))
        self.assertRaises(KeyError, res.__getitem__, '5')
        self.assertRaises(KeyError, res.__getitem__, '20')
        self.assertEqual((2 * 40, 2048 * 2), res['1'].shape)
        self.assertEqual('reflectance', res['1'].attrs['calibration'])
        self.assertEqual('%', res['1'].attrs['units'])
        self.assertEqual((2 * 40, 2048 * 2), res['2'].shape)
        self.assertEqual('reflectance', res['2'].attrs['calibration'])
        self.assertEqual('%', res['2'].attrs['units'])
        self.assertEqual((2 * 40, 2048 * 2), res['3'].shape)
        self.assertEqual('reflectance', res['3'].attrs['calibration'])
        self.assertEqual('%', res['3'].attrs['units'])
        self.assertEqual((2 * 40, 2048 * 2), res['4'].shape)
        self.assertEqual('reflectance', res['4'].attrs['calibration'])
        self.assertEqual('%', res['4'].attrs['units'])
        self.assertEqual((2 * 40, 2048 * 2), res['24'].shape)
        self.assertEqual('brightness_temperature', res['24'].attrs['calibration'])
        self.assertEqual('K', res['24'].attrs['units'])
        self.assertEqual((2 * 40, 2048 * 2), res['25'].shape)
        self.assertEqual('brightness_temperature', res['25'].attrs['calibration'])
        self.assertEqual('K', res['25'].attrs['units'])
Esempio n. 2
0
    def test_fy4a_1km_resolutions(self):
        """Test loading data when only 1km resolutions are available."""
        from satpy.tests.utils import make_dsq
        from satpy.readers import load_reader
        from satpy.dataset.data_dict import get_key
        filenames = [
            'FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190603003000_20190603003416_1000M_V0001.HDF',
        ]
        reader = load_reader(self.reader_configs)
        files = reader.select_files_from_pathnames(filenames)
        self.assertEqual(1, len(files))
        reader.create_filehandlers(files)
        # Make sure we have some files
        self.assertTrue(reader.file_handlers)

        # Verify that the resolution is only 1km
        available_datasets = reader.available_dataset_ids
        band_names = ['C' + '%02d' % ch for ch in np.linspace(1, 3, 3)]

        for band_name in band_names:
            for resolution in [500, 2000, 4000]:
                ds_q = make_dsq(name=band_name, resolution=resolution)
                with pytest.raises(KeyError):
                    res = get_key(ds_q,
                                  available_datasets,
                                  num_results=0,
                                  best=False)

            ds_q = make_dsq(name=band_name, resolution=1000)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            self.assertEqual(2, len(res))

        res = reader.load(band_names)
        self.assertEqual(3, len(res))
        expected = {
            1:
            np.array([[2.01, 2.02, 2.03, 2.04, 2.05],
                      [2.06, 2.07, 2.08, 2.09, 2.1]]),
            2:
            np.array([[4.03, 4.06, 4.09, 4.12, 4.15],
                      [4.18, 4.21, 4.24, 4.27, 4.3]]),
            3:
            np.array([[6.05, 6.1, 6.15, 6.2, 6.25],
                      [6.3, 6.35, 6.4, 6.45, 6.5]])
        }

        for index, band_name in enumerate(band_names):
            self.assertEqual(1, res[band_name].attrs['sensor'].islower())
            self.assertEqual((2, 5), res[band_name].shape)
            self.assertEqual('reflectance',
                             res[band_name].attrs['calibration'])
            self.assertEqual('%', res[band_name].attrs['units'])
            self.assertTrue(
                np.allclose(res[band_name].values,
                            expected[index + 1],
                            equal_nan=True))
Esempio n. 3
0
    def test_fy4a_500m_resolutions(self):
        """Test loading data when only 500m resolutions are available."""
        from satpy.tests.utils import make_dsq
        from satpy.readers import load_reader
        from satpy.dataset.data_dict import get_key
        filenames = [
            'FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190603003000_20190603003416_0500M_V0001.HDF',
        ]
        reader = load_reader(self.reader_configs)
        files = reader.select_files_from_pathnames(filenames)
        self.assertEqual(1, len(files))
        reader.create_filehandlers(files)
        # Make sure we have some files
        self.assertTrue(reader.file_handlers)

        # Verify that the resolution is only 500m
        available_datasets = reader.available_dataset_ids
        band_names = ['C' + '%02d' % ch for ch in np.linspace(2, 2, 1)]

        for band_name in band_names:
            for resolution in [1000, 2000, 4000]:
                ds_q = make_dsq(name=band_name, resolution=resolution)
                with pytest.raises(KeyError):
                    res = get_key(ds_q,
                                  available_datasets,
                                  num_results=0,
                                  best=False)

            ds_q = make_dsq(name=band_name, resolution=500)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            self.assertEqual(2, len(res))

        res = reader.load(band_names)
        self.assertEqual(1, len(res))
        expected = np.array([[2.01, 2.02, 2.03, 2.04, 2.05],
                             [2.06, 2.07, 2.08, 2.09, 2.1]])

        for band_name in band_names:
            self.assertEqual((2, 5), res[band_name].shape)
            self.assertEqual('reflectance',
                             res[band_name].attrs['calibration'])
            self.assertEqual('%', res[band_name].attrs['units'])
            self.assertTrue(
                np.allclose(res[band_name].values, expected, equal_nan=True))
Esempio n. 4
0
    def test_get_key(self):
        """Test 'get_key' special functions."""
        from satpy.dataset import DataQuery
        d = self.test_dict
        res1 = get_key(make_dataid(name='test4'), d, calibration='radiance')
        res2 = get_key(make_dataid(name='test4'),
                       d,
                       calibration='radiance',
                       num_results=0)
        res3 = get_key(make_dataid(name='test4'),
                       d,
                       calibration='radiance',
                       num_results=3)
        self.assertEqual(len(res2), 1)
        self.assertEqual(len(res3), 1)
        res2 = res2[0]
        res3 = res3[0]
        self.assertEqual(res1, res2)
        self.assertEqual(res1, res3)
        res1 = get_key('test4', d, query=DataQuery(polarization='V'))
        self.assertEqual(
            res1,
            make_dataid(name='test4', calibration='radiance',
                        polarization='V'))

        res1 = get_key(0.5, d, query=DataQuery(resolution=500))
        self.assertEqual(
            res1,
            make_dataid(name='testh', wavelength=(0, 0.5, 1), resolution=500))

        res1 = get_key('test6', d, query=DataQuery(level=100))
        self.assertEqual(res1, make_dataid(name='test6', level=100))

        res1 = get_key('test5', d)
        res2 = get_key('test5', d, query=DataQuery(modifiers=('mod2', )))
        res3 = get_key('test5',
                       d,
                       query=DataQuery(modifiers=(
                           'mod1',
                           'mod2',
                       )))
        self.assertEqual(res1, make_dataid(name='test5', modifiers=('mod2', )))
        self.assertEqual(res1, res2)
        self.assertNotEqual(res1, res3)

        # more than 1 result when default is to ask for 1 result
        self.assertRaises(KeyError, get_key, 'test4', d, best=False)
Esempio n. 5
0
    def get_key(self, match_key):
        """Get multiple fully-specified keys that match the provided query.

        Args:
            match_key (DataID): DataID or DataQuery of query parameters to use for
                                searching. Can also be a string representing the
                                dataset name or a number representing the dataset
                                wavelength.

        """
        return get_key(match_key, self.keys())
Esempio n. 6
0
    def _check_keys_for_dsq(available_datasets, resolution_to_test):
        from satpy.dataset.data_dict import get_key
        from satpy.tests.utils import make_dsq

        band_names = CHANNELS_BY_RESOLUTION[resolution_to_test]
        for band_name in band_names:
            ds_q = make_dsq(name=band_name, resolution=resolution_to_test)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            if band_name < 'C07':
                assert len(res) == 2
            else:
                assert len(res) == 3
Esempio n. 7
0
    def _assert_which_channels_are_loaded(available_datasets, band_names,
                                          resolution_to_test):
        from satpy.dataset.data_dict import get_key
        from satpy.tests.utils import make_dsq

        other_resolutions = RESOLUTION_LIST.copy()
        other_resolutions.remove(resolution_to_test)
        for band_name in band_names:
            for resolution in other_resolutions:
                ds_q = make_dsq(name=band_name, resolution=resolution)
                with pytest.raises(KeyError):
                    _ = get_key(ds_q,
                                available_datasets,
                                num_results=0,
                                best=False)

            ds_q = make_dsq(name=band_name, resolution=resolution_to_test)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            if band_name < 'C07':
                assert len(res) == 2
            else:
                assert len(res) == 3
Esempio n. 8
0
    def test_fy4a_2km_resolutions(self):
        """Test loading data when only 2km resolutions are available."""
        from satpy.tests.utils import make_dsq
        from satpy.readers import load_reader
        from satpy.dataset.data_dict import get_key
        filenames = [
            'FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190603003000_20190603003416_2000M_V0001.HDF',
        ]
        reader = load_reader(self.reader_configs)
        files = reader.select_files_from_pathnames(filenames)
        self.assertEqual(1, len(files))
        reader.create_filehandlers(files)
        # Make sure we have some files
        self.assertTrue(reader.file_handlers)

        # Verify that the resolution is only 2km
        available_datasets = reader.available_dataset_ids
        band_names = ['C' + '%02d' % ch for ch in np.linspace(1, 7, 7)]

        for band_name in band_names:
            for resolution in [500, 1000, 4000]:
                ds_q = make_dsq(name=band_name, resolution=resolution)
                with pytest.raises(KeyError):
                    res = get_key(ds_q,
                                  available_datasets,
                                  num_results=0,
                                  best=False)

            ds_q = make_dsq(name=band_name, resolution=2000)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            if band_name < 'C07':
                self.assertEqual(2, len(res))
            else:
                self.assertEqual(3, len(res))

        res = reader.load(band_names)
        self.assertEqual(7, len(res))
        expected = {
            1:
            np.array([[2.01, 2.02, 2.03, 2.04, 2.05],
                      [2.06, 2.07, 2.08, 2.09, 2.1]]),
            2:
            np.array([[4.03, 4.06, 4.09, 4.12, 4.15],
                      [4.18, 4.21, 4.24, 4.27, 4.3]]),
            3:
            np.array([[6.05, 6.1, 6.15, 6.2, 6.25],
                      [6.3, 6.35, 6.4, 6.45, 6.5]]),
            4:
            np.array([[8.07, 8.14, 8.21, 8.28, 8.35],
                      [8.42, 8.49, 8.56, 8.63, 8.7]]),
            5:
            np.array([[10.09, 10.18, 10.27, 10.36, 10.45],
                      [10.54, 10.63, 10.72, 10.81, 10.9]]),
            6:
            np.array([[12.11, 12.22, 12.33, 12.44, 12.55],
                      [12.66, 12.77, 12.88, 12.99, 13.1]]),
            7:
            np.array([[0.2, 0.3, 0.4, 0.5, 0.6], [0.7, 0.8, 0.9, 1., np.nan]])
        }

        for index, band_name in enumerate(band_names):
            self.assertEqual((2, 5), res[band_name].shape)
            if band_name < 'C07':
                self.assertEqual('reflectance',
                                 res[band_name].attrs['calibration'])
            else:
                self.assertEqual('brightness_temperature',
                                 res[band_name].attrs['calibration'])
            if band_name < 'C07':
                self.assertEqual('%', res[band_name].attrs['units'])
            else:
                self.assertEqual('K', res[band_name].attrs['units'])
            self.assertTrue(
                np.allclose(res[band_name].values,
                            expected[index + 1],
                            equal_nan=True))
Esempio n. 9
0
    def test_fy4a_all_resolutions(self):
        """Test loading data when all resolutions are available."""
        from satpy.tests.utils import make_dsq
        from satpy.readers import load_reader
        from satpy.dataset.data_dict import get_key
        filenames = [
            'FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190603003000_20190603003416_0500M_V0001.HDF',
            'FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190603003000_20190603003416_1000M_V0001.HDF',
            'FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190603003000_20190603003416_2000M_V0001.HDF',
            'FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190603003000_20190603003416_4000M_V0001.HDF',
        ]
        reader = load_reader(self.reader_configs)
        files = reader.select_files_from_pathnames(filenames)
        self.assertEqual(4, len(files))
        reader.create_filehandlers(files)
        # Make sure we have some files
        self.assertTrue(reader.file_handlers)

        available_datasets = reader.available_dataset_ids

        # 500m
        band_names = ['C' + '%02d' % ch for ch in np.linspace(2, 2, 1)]
        for band_name in band_names:
            ds_q = make_dsq(name=band_name, resolution=500)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            self.assertEqual(2, len(res))

        # 1km
        band_names = ['C' + '%02d' % ch for ch in np.linspace(1, 3, 3)]
        for band_name in band_names:
            ds_q = make_dsq(name=band_name, resolution=1000)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            self.assertEqual(2, len(res))

        # 2km
        band_names = ['C' + '%02d' % ch for ch in np.linspace(1, 7, 7)]
        for band_name in band_names:
            ds_q = make_dsq(name=band_name, resolution=2000)
            res = get_key(ds_q, available_datasets, num_results=0, best=False)
            if band_name < 'C07':
                self.assertEqual(2, len(res))
            else:
                self.assertEqual(3, len(res))

        band_names = ['C' + '%02d' % ch for ch in np.linspace(1, 14, 14)]
        res = reader.load(band_names)
        self.assertEqual(14, len(res))

        for band_name in band_names:
            self.assertEqual((2, 5), res[band_name].shape)
            if band_name < 'C07':
                self.assertEqual('reflectance',
                                 res[band_name].attrs['calibration'])
            else:
                self.assertEqual('brightness_temperature',
                                 res[band_name].attrs['calibration'])
            if band_name < 'C07':
                self.assertEqual('%', res[band_name].attrs['units'])
            else:
                self.assertEqual('K', res[band_name].attrs['units'])

        # check whether the data type of orbital_parameters is float
        orbital_parameters = res[band_names[0]].attrs['orbital_parameters']
        for attr in orbital_parameters:
            self.assertEqual(type(orbital_parameters[attr]), float)
        self.assertEqual(orbital_parameters['satellite_nominal_latitude'], 0.)
        self.assertEqual(orbital_parameters['satellite_nominal_longitude'],
                         104.7)
        self.assertEqual(orbital_parameters['satellite_nominal_altitude'],
                         3.5786E7)