osrm-backend/test/t/geom/test_projection.cpp
Dennis Luxen 73efcc6b0c Squashed 'third_party/libosmium/' content from commit 910f8f1
git-subtree-dir: third_party/libosmium
git-subtree-split: 910f8f1e992402e0f1acd0132eaffa7539ca83d2
2015-01-13 16:54:25 +01:00

132 lines
4.5 KiB
C++

#include "catch.hpp"
#include <osmium/geom/factory.hpp>
#include <osmium/geom/mercator_projection.hpp>
#include <osmium/geom/projection.hpp>
TEST_CASE("Projection") {
SECTION("identity_projection") {
osmium::geom::IdentityProjection projection;
REQUIRE(4326 == projection.epsg());
REQUIRE("+proj=longlat +datum=WGS84 +no_defs" == projection.proj_string());
}
SECTION("project_location_4326") {
osmium::geom::Projection projection(4326);
REQUIRE(4326 == projection.epsg());
REQUIRE("+init=epsg:4326" == projection.proj_string());
const osmium::Location loc(1.0, 2.0);
const osmium::geom::Coordinates c {1.0, 2.0};
REQUIRE(c == projection(loc));
}
SECTION("project_location_4326_string") {
osmium::geom::Projection projection("+init=epsg:4326");
REQUIRE(-1 == projection.epsg());
REQUIRE("+init=epsg:4326" == projection.proj_string());
const osmium::Location loc(1.0, 2.0);
const osmium::geom::Coordinates c {1.0, 2.0};
REQUIRE(c == projection(loc));
}
SECTION("unknown_projection_string") {
REQUIRE_THROWS_AS(osmium::geom::Projection projection("abc"), osmium::projection_error);
}
SECTION("unknown_epsg_code") {
REQUIRE_THROWS_AS(osmium::geom::Projection projection(9999999), osmium::projection_error);
}
SECTION("project_location_3857") {
osmium::geom::Projection projection(3857);
REQUIRE(3857 == projection.epsg());
REQUIRE("+init=epsg:3857" == projection.proj_string());
{
const osmium::Location loc(0.0, 0.0);
const osmium::geom::Coordinates c {0.0, 0.0};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
{
const osmium::Location loc(180.0, 0.0);
const osmium::geom::Coordinates c {20037508.34, 0.0};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
{
const osmium::Location loc(180.0, 0.0);
const osmium::geom::Coordinates c {20037508.34, 0.0};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
{
const osmium::Location loc(0.0, 85.0511288);
const osmium::geom::Coordinates c {0.0, 20037508.34};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
}
SECTION("project_location_mercator") {
osmium::geom::MercatorProjection projection;
{
const osmium::Location loc(0.0, 0.0);
const osmium::geom::Coordinates c {0.0, 0.0};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
{
const osmium::Location loc(180.0, 0.0);
const osmium::geom::Coordinates c {20037508.34, 0.0};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
{
const osmium::Location loc(180.0, 0.0);
const osmium::geom::Coordinates c {20037508.34, 0.0};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
{
const osmium::Location loc(0.0, 85.0511288);
const osmium::geom::Coordinates c {0.0, 20037508.34};
REQUIRE(std::abs(projection(loc).x - c.x) < 0.1);
REQUIRE(std::abs(projection(loc).y - c.y) < 0.1);
}
}
SECTION("compare_mercators") {
osmium::geom::MercatorProjection projection_merc;
osmium::geom::Projection projection_3857(3857);
REQUIRE(3857 == projection_3857.epsg());
REQUIRE("+init=epsg:3857" == projection_3857.proj_string());
{
const osmium::Location loc(4.2, 27.3);
REQUIRE(std::abs(projection_merc(loc).x - projection_3857(loc).x) < 0.1);
REQUIRE(std::abs(projection_merc(loc).y - projection_3857(loc).y) < 0.1);
}
{
const osmium::Location loc(160.789, -42.42);
REQUIRE(std::abs(projection_merc(loc).x - projection_3857(loc).x) < 0.1);
REQUIRE(std::abs(projection_merc(loc).y - projection_3857(loc).y) < 0.1);
}
{
const osmium::Location loc(-0.001, 0.001);
REQUIRE(std::abs(projection_merc(loc).x - projection_3857(loc).x) < 0.1);
REQUIRE(std::abs(projection_merc(loc).y - projection_3857(loc).y) < 0.1);
}
{
const osmium::Location loc(-85.2, -85.2);
REQUIRE(std::abs(projection_merc(loc).x - projection_3857(loc).x) < 0.1);
REQUIRE(std::abs(projection_merc(loc).y - projection_3857(loc).y) < 0.1);
}
}
}