1 #include "catch.hpp" 2 3 #include <osmium/geom/factory.hpp> 4 #include <osmium/geom/mercator_projection.hpp> 5 #include <osmium/geom/projection.hpp> 6 7 TEST_CASE("Indentity Projection") { 8 osmium::geom::IdentityProjection projection; 9 REQUIRE(4326 == projection.epsg()); 10 REQUIRE("+proj=longlat +datum=WGS84 +no_defs" == projection.proj_string()); 11 } 12 13 TEST_CASE("Projection 4326") { 14 osmium::geom::Projection projection{4326}; 15 REQUIRE(4326 == projection.epsg()); 16 REQUIRE("+init=epsg:4326" == projection.proj_string()); 17 18 const osmium::Location loc{1.0, 2.0}; 19 const osmium::geom::Coordinates c{1.0, 2.0}; 20 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 21 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 22 } 23 24 TEST_CASE("Projection 4326 from init string") { 25 osmium::geom::Projection projection{"+init=epsg:4326"}; 26 REQUIRE(-1 == projection.epsg()); 27 REQUIRE("+init=epsg:4326" == projection.proj_string()); 28 29 const osmium::Location loc{1.0, 2.0}; 30 const osmium::geom::Coordinates c{1.0, 2.0}; 31 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 32 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 33 } 34 35 TEST_CASE("Creating projection from unknown init string") { 36 REQUIRE_THROWS_AS(osmium::geom::Projection{"abc"}, osmium::projection_error); 37 } 38 39 TEST_CASE("Creating projection from unknown EPSG code") { 40 REQUIRE_THROWS_AS(osmium::geom::Projection{9999999}, osmium::projection_error); 41 } 42 43 TEST_CASE("Projection 3857") { 44 osmium::geom::Projection projection{3857}; 45 REQUIRE(3857 == projection.epsg()); 46 REQUIRE("+init=epsg:3857" == projection.proj_string()); 47 48 SECTION("Zero coordinates") { 49 const osmium::Location loc{0.0, 0.0}; 50 const osmium::geom::Coordinates c{0.0, 0.0}; 51 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 52 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 53 } 54 55 SECTION("Max longitude") { 56 const osmium::Location loc{180.0, 0.0}; 57 const osmium::geom::Coordinates c{20037508.34, 0.0}; 58 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 59 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 60 } 61 62 SECTION("Min longitude") { 63 const osmium::Location loc{-180.0, 0.0}; 64 const osmium::geom::Coordinates c{-20037508.34, 0.0}; 65 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 66 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 67 } 68 69 SECTION("Max latitude") { 70 const osmium::Location loc{0.0, 85.0511288}; 71 const osmium::geom::Coordinates c{0.0, 20037508.34}; 72 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 73 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 74 } 75 } 76 77 TEST_CASE("MercatorProjection: Zero coordinates") { 78 osmium::geom::MercatorProjection projection; 79 const osmium::Location loc{0.0, 0.0}; 80 const osmium::geom::Coordinates c{0.0, 0.0}; 81 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 82 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 83 } 84 85 TEST_CASE("MercatorProjection: Max longitude") { 86 osmium::geom::MercatorProjection projection; 87 const osmium::Location loc{180.0, 0.0}; 88 const osmium::geom::Coordinates c{20037508.34, 0.0}; 89 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 90 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 91 } 92 93 TEST_CASE("MercatorProjection: Min longitude") { 94 osmium::geom::MercatorProjection projection; 95 const osmium::Location loc{-180.0, 0.0}; 96 const osmium::geom::Coordinates c{-20037508.34, 0.0}; 97 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 98 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 99 } 100 101 TEST_CASE("MercatorProjection: Max latitude") { 102 osmium::geom::MercatorProjection projection; 103 const osmium::Location loc{0.0, 85.0511288}; 104 const osmium::geom::Coordinates c{0.0, 20037508.34}; 105 REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001)); 106 REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001)); 107 } 108 109