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