Exemple #1
0
 def test_default_geoid_path(self):
     self.assertIsInstance(
         GeoidModel.default_geoid_path(), str)
     self.assertEqual(
         GeoidModel.default_geoid_path(),
         os.path.join(get_default_data_path(), 'geoids')
     )
Exemple #2
0
class ComputationTestCase(unittest.TestCase):
    LAT = +dms_to_dec(16, 46, 33)   # 16:46:33N
    LON = -dms_to_dec(3, 0, 34)     # 03:00:34W
    HEIGHT = +28.7068               # [m]
    GHEIGHT = +300                  # [m]
    EHEIGHT = HEIGHT + GHEIGHT      # [m]

    # $ echo 16:46:33N 3:00:34W | GeoidEval
    # 28.7068
    # $ echo 16.775833333333335 -3.0094444444444446 | GeoidEval
    # 28.7068

    def setUp(self) -> None:
        self.name = GeoidModel.default_geoid_name()
        self.model = GeoidModel(self.name)

    def test_compute_scalar(self):
        h = self.model(self.LAT, self.LON)
        npt.assert_allclose(h, self.HEIGHT)

    def test_geoid_to_ellipsoid_scalar(self):
        dir_ = EHeightConvDir.GEOIDTOELLIPSOID
        h = self.model.convert_height(self.LAT, self.LON, self.GHEIGHT, dir_)
        npt.assert_allclose(h, self.EHEIGHT)

    def test_ellipsoid_to_geoid_scalar(self):
        dir_ = EHeightConvDir.ELLIPSOIDTOGEOID
        h = self.model.convert_height(self.LAT, self.LON, self.EHEIGHT, dir_)
        npt.assert_allclose(h, self.GHEIGHT)

    def test_convert_height_dir_none(self):
        dir_ = EHeightConvDir.NONE
        h = self.model.convert_height(self.LON, self.LAT, self.EHEIGHT, dir_)
        npt.assert_allclose(h, self.EHEIGHT)
Exemple #3
0
    def test_custom_path(self):
        default_path = pathlib.Path(GeoidModel.default_geoid_path())
        with tempfile.TemporaryDirectory() as dirname:
            geoid_path = pathlib.Path(dirname) / default_path.name
            geoid_path.mkdir()
            for filename in default_path.glob(f'{self.MODEL_NAME}*'):
                shutil.copy(filename, geoid_path)

            model = GeoidModel(self.MODEL_NAME, geoid_path)
            self.assertEqual(model.geoid_name(), self.MODEL_NAME)
            self.assertEqual(model.geoid_directory(), str(geoid_path))
Exemple #4
0
 def test_positional_false_true(self):
     path = GeoidModel.default_geoid_path()
     model = GeoidModel(self.MODEL_NAME, path, False, True)
     self.assertEqual(model.geoid_name(), self.MODEL_NAME)
     self.assertEqual(model.geoid_directory(), path)
     self.assertEqual(model.interpolation(), 'bilinear')
     self.assertTrue(model.threadsafe())
Exemple #5
0
    def test_custom_path_from_env02(self):
        default_path = pathlib.Path(GeoidModel.default_geoid_path())
        with tempfile.TemporaryDirectory() as dirname:
            geoid_path = pathlib.Path(dirname) / default_path.name
            geoid_path.mkdir()
            for filename in default_path.glob(f'{self.MODEL_NAME}*'):
                shutil.copy(filename, geoid_path)

            old_env = os.environ.get('GEOGRAPHICLIB_GEOID_PATH')
            os.environ['GEOGRAPHICLIB_GEOID_PATH'] = str(geoid_path)
            try:
                model = GeoidModel(self.MODEL_NAME)
                self.assertEqual(model.geoid_name(), self.MODEL_NAME)
                self.assertEqual(model.geoid_directory(), str(geoid_path))
            finally:
                if old_env is None:
                    del os.environ['GEOGRAPHICLIB_GEOID_PATH']
                else:
                    os.environ['GEOGRAPHICLIB_GEOID_PATH'] = old_env
Exemple #6
0
 def test_default_geoid_name(self):
     names = (
         'egm84-30',
         'egm84-15',
         'egm96-15',
         'egm96-5',
         'egm2008-5',
         'egm2008-2_5',
         'egm2008-1',
     )
     self.assertTrue(GeoidModel.default_geoid_name() in names)
Exemple #7
0
class ConstHeightVectorComputationTestCase(unittest.TestCase):
    LAT = np.asarray([
        [+dms_to_dec(16, 46, 33), +dms_to_dec(16, 56, 43)],
        [+dms_to_dec(16, 46, 33), +dms_to_dec(16, 56, 43)],
    ])
    LON = np.asarray([
        [-dms_to_dec(3, 0, 34), -dms_to_dec(3, 10, 44)],
        [-dms_to_dec(3, 0, 34), -dms_to_dec(3, 10, 44)],
    ])
    HEIGHT = np.asarray([
        [+28.7068, +28.6599],
        [+28.7068, +28.6599],
    ])
    KHEIGHT = +300
    RTOL = 2.5e-6

    def setUp(self) -> None:
        self.name = GeoidModel.default_geoid_name()
        self.model = GeoidModel(self.name)

    def test_geoid_to_ellipsoid_vector(self):
        dir_ = EHeightConvDir.GEOIDTOELLIPSOID
        h = self.model.convert_height(
            self.LAT.flatten(), self.LON.flatten(), self.KHEIGHT, dir_)
        eheight = self.HEIGHT + self.KHEIGHT
        npt.assert_allclose(h, eheight.flatten(), rtol=self.RTOL)

    def test_geoid_to_ellipsoid_matrix(self):
        dir_ = EHeightConvDir.GEOIDTOELLIPSOID
        h = self.model.convert_height(self.LAT, self.LON, self.KHEIGHT, dir_)
        eheight = self.HEIGHT + self.KHEIGHT
        npt.assert_allclose(h, eheight, rtol=self.RTOL)

    def test_ellipsoid_to_geoid_vector(self):
        dir_ = EHeightConvDir.ELLIPSOIDTOGEOID
        h = self.model.convert_height(
            self.LAT.flatten(), self.LON.flatten(), self.KHEIGHT, dir_)
        gheight = self.KHEIGHT - self.HEIGHT
        npt.assert_allclose(h, gheight.flatten(), rtol=self.RTOL)

    def test_ellipsoid_to_geoid_matrix(self):
        dir_ = EHeightConvDir.ELLIPSOIDTOGEOID
        h = self.model.convert_height(self.LAT, self.LON, self.KHEIGHT, dir_)
        gheight = self.KHEIGHT - self.HEIGHT
        npt.assert_allclose(h, gheight, rtol=self.RTOL)

    def test_convert_height_dir_none_vector(self):
        dir_ = EHeightConvDir.NONE
        h = self.model.convert_height(
            self.LON.flatten(), self.LAT.flatten(), self.KHEIGHT, dir_)
        npt.assert_allclose(h, np.full_like(h, self.KHEIGHT))

    def test_convert_height_dir_none_matrix(self):
        dir_ = EHeightConvDir.NONE
        h = self.model.convert_height(self.LON, self.LAT, self.KHEIGHT, dir_)
        npt.assert_allclose(h, np.full_like(h, self.KHEIGHT))
Exemple #8
0
 def test_cubic_false(self):
     path = GeoidModel.default_geoid_path()
     model = GeoidModel(self.MODEL_NAME, path, cubic=False)
     self.assertEqual(model.geoid_name(), self.MODEL_NAME)
     self.assertEqual(model.geoid_directory(), path)
     self.assertEqual(model.interpolation(), 'bilinear')
Exemple #9
0
class InfoMethodsTestCase(unittest.TestCase):
    def setUp(self) -> None:
        self.name = GeoidModel.default_geoid_name()
        self.datapath = GeoidModel.default_geoid_path()
        self.model = GeoidModel(self.name, self.datapath)

    def test_description(self):
        description = self.model.description()
        self.assertIsInstance(description, str)
        self.assertNotEqual(description, 'NONE')

    def test_datetime(self):
        datestr = self.model.datetime()
        self.assertIsInstance(datestr, str)
        self.assertNotEqual(datestr, 'UNKNOWN')
        # date = datetime.datetime.strptime(datestr, '%Y-%m-%d')
        date = datetime.datetime.strptime(datestr, '%Y-%m-%d %H:%M:%S')
        self.assertLess(date, datetime.datetime.now())

    def test_geoid_file(self):
        filename = self.model.geoid_file()
        self.assertIn(self.name, filename)
        self.assertIn(self.datapath, filename)

    def test_geoid_name(self):
        name = self.model.geoid_name()
        self.assertEqual(name, self.name)

    def test_geoid_directory(self):
        path = self.model.geoid_directory()
        self.assertEqual(path, self.datapath)

    def test_interpolation(self):
        self.assertIn(self.model.interpolation(), ['cubic', 'bilinear'])

    def test_threadsafe(self):
        self.assertIsInstance(self.model.threadsafe(), bool)

    def test_max_error(self):
        self.assertIsInstance(self.model.max_error(), float)
        self.assertGreater(self.model.max_error(), 0)

    def test_rms_error(self):
        self.assertIsInstance(self.model.rms_error(), float)
        self.assertGreater(self.model.rms_error(), 0)

    def test_max_vs_rms_error(self):
        self.assertLessEqual(self.model.rms_error(), self.model.max_error())

    def test_offset(self):
        self.assertIsInstance(self.model.offset(), float)

    def test_scale(self):
        self.assertIsInstance(self.model.scale(), float)
        self.assertGreater(self.model.scale(), 0)

    def equator_radius(self):
        self.assertIsInstance(self.model.equator_radius(), float)
        self.assertGreater(self.model.equator_radius(), 5e6)

    def test_flattening(self):
        self.assertIsInstance(self.model.flattening(), float)
        self.assertGreater(self.model.flattening(), 0)
        self.assertLess(self.model.flattening(), 1)
Exemple #10
0
 def test_default_path(self):
     path = GeoidModel.default_geoid_path()
     model = GeoidModel(self.MODEL_NAME, path)
     self.assertEqual(model.geoid_name(), self.MODEL_NAME)
     self.assertEqual(model.geoid_directory(), path)
Exemple #11
0
 def test_name(self):
     model = GeoidModel(self.MODEL_NAME)
     self.assertIsInstance(model, GeoidModel)
     self.assertEqual(model.geoid_name(), self.MODEL_NAME)
Exemple #12
0
 def setUp(self) -> None:
     self.name = GeoidModel.default_geoid_name()
     self.model = GeoidModel(self.name)
Exemple #13
0
 def test_no_args(self):
     model = GeoidModel()
     self.assertIsInstance(model, GeoidModel)
     self.assertEqual(model.geoid_name(), GeoidModel.default_geoid_name())
Exemple #14
0
class VectorComputationTestCase(unittest.TestCase):
    LAT = np.asarray([
        [+dms_to_dec(16, 46, 33), -dms_to_dec(16, 46, 43)],
        [-dms_to_dec(16, 56, 33), +dms_to_dec(16, 56, 43)],
    ])
    LON = np.asarray([
        [-dms_to_dec(3, 0, 34), +dms_to_dec(3, 0, 44)],
        [+dms_to_dec(3, 10, 34), -dms_to_dec(3, 10, 44)],
    ])
    HEIGHT = np.asarray([
        [+28.7068, +14.8866],
        [+15.0314, +28.6599],
    ])
    GHEIGHT = np.asarray([
        [+300, +400000],
        [+400000, +300],
    ])
    EHEIGHT = HEIGHT + GHEIGHT
    RTOL = 2.5e-6

    def setUp(self) -> None:
        self.name = GeoidModel.default_geoid_name()
        self.model = GeoidModel(self.name)

    def test_compute_vector(self):
        h = self.model(self.LAT.flatten(), self.LON.flatten())
        npt.assert_allclose(h, self.HEIGHT.flatten(), rtol=self.RTOL)

    def test_compute_matrix(self):
        h = self.model(self.LAT, self.LON)
        npt.assert_allclose(h, self.HEIGHT, rtol=self.RTOL)

    def test_geoid_to_ellipsoid_vector(self):
        dir_ = EHeightConvDir.GEOIDTOELLIPSOID
        h = self.model.convert_height(
            self.LAT.flatten(), self.LON.flatten(), self.GHEIGHT.flatten(),
            dir_)
        npt.assert_allclose(h, self.EHEIGHT.flatten(), rtol=self.RTOL)

    def test_geoid_to_ellipsoid_matrix(self):
        dir_ = EHeightConvDir.GEOIDTOELLIPSOID
        h = self.model.convert_height(self.LAT, self.LON, self.GHEIGHT, dir_)
        npt.assert_allclose(h, self.EHEIGHT, rtol=self.RTOL)

    def test_ellipsoid_to_geoid_vector(self):
        dir_ = EHeightConvDir.ELLIPSOIDTOGEOID
        h = self.model.convert_height(
            self.LAT.flatten(), self.LON.flatten(), self.EHEIGHT.flatten(),
            dir_)
        npt.assert_allclose(h, self.GHEIGHT.flatten(), rtol=self.RTOL)

    def test_ellipsoid_to_geoid_matrix(self):
        dir_ = EHeightConvDir.ELLIPSOIDTOGEOID
        h = self.model.convert_height(self.LAT, self.LON, self.EHEIGHT, dir_)
        npt.assert_allclose(h, self.GHEIGHT, rtol=self.RTOL)

    def test_convert_height_dir_none_vector(self):
        dir_ = EHeightConvDir.NONE
        h = self.model.convert_height(
            self.LON.flatten(), self.LAT.flatten(), self.EHEIGHT.flatten(),
            dir_)
        npt.assert_allclose(h, self.EHEIGHT.flatten())

    def test_convert_height_dir_none_matrix(self):
        dir_ = EHeightConvDir.NONE
        h = self.model.convert_height(self.LON, self.LAT, self.EHEIGHT, dir_)
        npt.assert_allclose(h, self.EHEIGHT)
Exemple #15
0
 def test_threadsafe_false(self):
     path = GeoidModel.default_geoid_path()
     model = GeoidModel(self.MODEL_NAME, path, threadsafe=False)
     self.assertEqual(model.geoid_name(), self.MODEL_NAME)
     self.assertEqual(model.geoid_directory(), path)
     self.assertFalse(model.threadsafe())
Exemple #16
0
class CacheTestCase(unittest.TestCase):
    def setUp(self) -> None:
        self.name = GeoidModel.default_geoid_name()
        self.model = GeoidModel(self.name)

    def test_cache_clear(self):
        self.model.cache_clear()
        self.assertFalse(self.model.cache())
        self.model.cache_clear()
        self.assertFalse(self.model.cache())

    def test_cache_all(self):
        self.model.cache_clear()
        self.assertFalse(self.model.cache())
        self.model.cache_all()
        self.assertTrue(self.model.cache())
        self.assertEqual(self.model.cache_south(), -90)
        self.assertEqual(self.model.cache_west(), 0)
        self.assertEqual(self.model.cache_north(), +90)
        self.assertEqual(self.model.cache_east(), 360)
        self.model.cache_clear()

    def test_cache_area(self):
        south = -10
        west = -10
        north = 10
        east = 10

        self.model.cache_clear()
        self.assertFalse(self.model.cache())
        self.model.cache_area(south, west, north, east)
        self.assertTrue(self.model.cache())
        self.assertAlmostEqual(self.model.cache_south(), south, delta=0.1)
        self.assertAlmostEqual(self.model.cache_west(), west, delta=0.1)
        self.assertAlmostEqual(self.model.cache_north(), north, delta=0.1)
        self.assertAlmostEqual(self.model.cache_east(), east, delta=0.1)
        self.model.cache_clear()

    def test_cache(self):
        self.model.cache_clear()
        self.assertIsInstance(self.model.cache(), bool)
        self.assertFalse(self.model.cache())

    def test_cache_south(self):
        self.model.cache_all()
        self.assertIsInstance(self.model.cache_south(), float)
        self.assertAlmostEqual(self.model.cache_south(), -90)
        self.model.cache_clear()

    def test_cache_west(self):
        self.model.cache_all()
        self.assertIsInstance(self.model.cache_west(), float)
        self.assertAlmostEqual(self.model.cache_west(), 0)
        self.model.cache_clear()

    def test_cache_north(self):
        self.model.cache_all()
        self.assertIsInstance(self.model.cache_north(), float)
        self.assertAlmostEqual(self.model.cache_north(), +90)
        self.model.cache_clear()

    def test_cache_east(self):
        self.model.cache_all()
        self.assertIsInstance(self.model.cache_east(), float)
        self.assertAlmostEqual(self.model.cache_east(), 360)
        self.model.cache_clear()
Exemple #17
0
 def setUp(self) -> None:
     self.name = GeoidModel.default_geoid_name()
     self.datapath = GeoidModel.default_geoid_path()
     self.model = GeoidModel(self.name, self.datapath)