[core] Harden Projection::project()
This commit is contained in:
@@ -94,9 +94,10 @@ public:
|
||||
|
||||
private:
|
||||
static Point<double> project_(const LatLng& latLng, double worldSize) {
|
||||
const double latitude = util::clamp(latLng.latitude(), -util::LATITUDE_MAX, util::LATITUDE_MAX);
|
||||
return Point<double> {
|
||||
util::LONGITUDE_MAX + latLng.longitude(),
|
||||
util::LONGITUDE_MAX - util::RAD2DEG * std::log(std::tan(M_PI / 4 + latLng.latitude() * M_PI / util::DEGREES_MAX))
|
||||
util::LONGITUDE_MAX - util::RAD2DEG * std::log(std::tan(M_PI / 4 + latitude * M_PI / util::DEGREES_MAX))
|
||||
} * worldSize / util::DEGREES_MAX;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -7,6 +7,49 @@
|
||||
|
||||
using namespace mbgl;
|
||||
|
||||
TEST(Projection, Boundaries) {
|
||||
LatLng sw { -90.0, -180.0 };
|
||||
LatLng ne { 90.0, 180.0 };
|
||||
|
||||
const double minScale = std::pow(2, 0);
|
||||
const double maxScale = std::pow(2, util::DEFAULT_MAX_ZOOM);
|
||||
|
||||
Point<double> projected {};
|
||||
LatLng unprojected {};
|
||||
|
||||
projected = Projection::project(sw, minScale);
|
||||
EXPECT_DOUBLE_EQ(projected.x, 0.0);
|
||||
EXPECT_DOUBLE_EQ(projected.y, util::tileSize);
|
||||
|
||||
unprojected = Projection::unproject(projected, minScale);
|
||||
EXPECT_DOUBLE_EQ(unprojected.latitude(), -util::LATITUDE_MAX);
|
||||
EXPECT_DOUBLE_EQ(unprojected.longitude(), sw.longitude());
|
||||
|
||||
projected = Projection::project(sw, maxScale);
|
||||
EXPECT_DOUBLE_EQ(projected.x, 0.0);
|
||||
EXPECT_DOUBLE_EQ(projected.y, util::tileSize * maxScale);
|
||||
|
||||
unprojected = Projection::unproject(projected, maxScale);
|
||||
EXPECT_DOUBLE_EQ(unprojected.latitude(), -util::LATITUDE_MAX);
|
||||
EXPECT_DOUBLE_EQ(unprojected.longitude(), sw.longitude());
|
||||
|
||||
projected = Projection::project(ne, minScale);
|
||||
EXPECT_DOUBLE_EQ(projected.x, util::tileSize);
|
||||
ASSERT_NEAR(projected.y, 0.0, 1e-10);
|
||||
|
||||
unprojected = Projection::unproject(projected, minScale);
|
||||
EXPECT_DOUBLE_EQ(unprojected.latitude(), util::LATITUDE_MAX);
|
||||
EXPECT_DOUBLE_EQ(unprojected.longitude(), ne.longitude());
|
||||
|
||||
projected = Projection::project(ne, maxScale);
|
||||
EXPECT_DOUBLE_EQ(projected.x, util::tileSize * maxScale);
|
||||
ASSERT_NEAR(projected.y, 0.0, 1e-6);
|
||||
|
||||
unprojected = Projection::unproject(projected, maxScale);
|
||||
EXPECT_DOUBLE_EQ(unprojected.latitude(), util::LATITUDE_MAX);
|
||||
EXPECT_DOUBLE_EQ(unprojected.longitude(), ne.longitude());
|
||||
}
|
||||
|
||||
TEST(Projection, MetersPerPixelAtLatitude) {
|
||||
double zoom = 0;
|
||||
EXPECT_DOUBLE_EQ(Projection::getMetersPerPixelAtLatitude(0, zoom), 78271.516964020484);
|
||||
|
||||
Reference in New Issue
Block a user