1 #include "catch.hpp" 2 3 #include <osmium/geom/mercator_projection.hpp> 4 5 TEST_CASE("Mercator projection") { 6 const osmium::geom::MercatorProjection projection; 7 REQUIRE(3857 == projection.epsg()); 8 REQUIRE("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs" == projection.proj_string()); 9 } 10 11 TEST_CASE("Low level mercator functions") { 12 const osmium::geom::Coordinates c1{17.839, -3.249}; 13 const osmium::geom::Coordinates r1 = osmium::geom::mercator_to_lonlat(osmium::geom::lonlat_to_mercator(c1)); 14 REQUIRE(r1.x == Approx(c1.x).epsilon(0.000001)); 15 REQUIRE(r1.y == Approx(c1.y).epsilon(0.000001)); 16 17 const osmium::geom::Coordinates c2{-89.2, 15.915}; 18 const osmium::geom::Coordinates r2 = osmium::geom::mercator_to_lonlat(osmium::geom::lonlat_to_mercator(c2)); 19 REQUIRE(r2.x == Approx(c2.x).epsilon(0.000001)); 20 REQUIRE(r2.y == Approx(c2.y).epsilon(0.000001)); 21 22 const osmium::geom::Coordinates c3{180.0, 85.0}; 23 const osmium::geom::Coordinates r3 = osmium::geom::mercator_to_lonlat(osmium::geom::lonlat_to_mercator(c3)); 24 REQUIRE(r3.x == Approx(c3.x).epsilon(0.000001)); 25 REQUIRE(r3.y == Approx(c3.y).epsilon(0.000001)); 26 } 27 28 TEST_CASE("Mercator bounds") { 29 const osmium::Location mmax{180.0, osmium::geom::MERCATOR_MAX_LAT}; 30 const osmium::geom::Coordinates c = osmium::geom::lonlat_to_mercator(mmax); 31 REQUIRE(c.x == Approx(c.y).epsilon(0.001)); 32 REQUIRE(osmium::geom::detail::y_to_lat(osmium::geom::detail::lon_to_x(180.0)) == Approx(osmium::geom::MERCATOR_MAX_LAT).epsilon(0.0000001)); 33 } 34 35