Files

111 lines
3.4 KiB
C++
Raw Permalink Normal View History

#include <gtest/gtest.h>
#include <vanetza/geodesy/geodesy.hpp>
#include <vanetza/geodesy/haversine.hpp>
#ifdef VANETZA_WITH_GEOGRAPHICLIB
#include <vanetza/geodesy/geographiclib.hpp>
#endif
using namespace vanetza::geodesy;
namespace units = vanetza::units;
using units::si::meter;
using units::degree;
// Technische Hochschule Ingolstadt
static const GeodeticPosition thi(48.76714 * degree, 11.43263 * degree);
// Zentrum fuer Angewandte Forschung
static const GeodeticPosition zaf(48.7656 * degree, 11.4296 * degree);
// Munich (short range ~70 km)
static const GeodeticPosition munich(48.1351 * degree, 11.5820 * degree);
// Frankfurt (medium range ~304 km)
static const GeodeticPosition frankfurt(50.1109 * degree, 8.6821 * degree);
// Sao Paulo (long range ~10000 km)
static const GeodeticPosition sao_paulo(-25.41272 * degree, -49.24815 * degree);
TEST(GeodesyHaversine, distance_zero)
{
auto d = haversine::distance(thi, thi);
EXPECT_DOUBLE_EQ(0.0, d / meter);
}
TEST(GeodesyHaversine, distance_short_range)
{
auto d = haversine::distance(thi, zaf);
EXPECT_NEAR(d / meter, 280.0, 10.0);
}
TEST(GeodesyHaversine, distance_medium_range)
{
auto d = haversine::distance(frankfurt, munich);
EXPECT_NEAR(d / meter, 304000.0, 3000.0);
}
TEST(GeodesyHaversine, local_cartesian_short_range)
{
auto cart = haversine::local_cartesian(thi, zaf);
// ZAF is roughly south-west of THI
EXPECT_NEAR(cart.x / meter, -222.0, 5.0);
EXPECT_NEAR(cart.y / meter, -171.0, 5.0);
}
TEST(GeodesyHaversine, local_cartesian_zero)
{
auto cart = haversine::local_cartesian(thi, thi);
EXPECT_DOUBLE_EQ(cart.x / meter, 0.0);
EXPECT_DOUBLE_EQ(cart.y / meter, 0.0);
}
#ifdef VANETZA_WITH_GEOGRAPHICLIB
TEST(GeodesyGeographicLib, distance_matches_known_value)
{
auto d = geographiclib::distance(thi, sao_paulo);
EXPECT_NEAR(d / meter, 10185367.442, 0.5);
}
TEST(GeodesyGeographicLib, local_cartesian_known_value)
{
auto cart = geographiclib::local_cartesian(thi, zaf);
EXPECT_NEAR(cart.x / meter, -222.74, 0.01);
EXPECT_NEAR(cart.y / meter, -171.25, 0.01);
}
TEST(GeodesyComparison, distance_short_range)
{
auto h = haversine::distance(thi, zaf);
auto g = geographiclib::distance(thi, zaf);
EXPECT_NEAR(h / meter, g / meter, std::abs(g / meter * 0.005)); // <0.5%
}
TEST(GeodesyComparison, distance_medium_range)
{
auto h = haversine::distance(frankfurt, munich);
auto g = geographiclib::distance(frankfurt, munich);
EXPECT_NEAR(h / meter, g / meter, std::abs(g / meter * 0.005)); // <0.5%
}
TEST(GeodesyComparison, distance_long_range)
{
auto h = haversine::distance(thi, sao_paulo);
auto g = geographiclib::distance(thi, sao_paulo);
EXPECT_NEAR(h / meter, g / meter, std::abs(g / meter * 0.005)); // <0.5%
}
TEST(GeodesyComparison, local_cartesian_short_range)
{
auto h = haversine::local_cartesian(thi, zaf);
auto g = geographiclib::local_cartesian(thi, zaf);
EXPECT_NEAR(h.x / meter, g.x / meter, 1.0); // <1m
EXPECT_NEAR(h.y / meter, g.y / meter, 1.0);
}
TEST(GeodesyComparison, local_cartesian_medium_range)
{
auto h = haversine::local_cartesian(thi, munich);
auto g = geographiclib::local_cartesian(thi, munich);
EXPECT_NEAR(h.x / meter, g.x / meter, std::abs(g.x / meter * 0.02)); // <2%
EXPECT_NEAR(h.y / meter, g.y / meter, std::abs(g.y / meter * 0.02));
}
#endif // VANETZA_WITH_GEOGRAPHICLIB