File: geometry_strategy_test.cpp

package info (click to toggle)
mapnik 3.0.12%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 17,084 kB
  • ctags: 18,454
  • sloc: cpp: 142,516; python: 1,416; sh: 769; makefile: 170; xml: 140; lisp: 13
file content (188 lines) | stat: -rw-r--r-- 7,471 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188

#include "catch.hpp"
#include "geometry_equal.hpp"

#include <mapnik/geometry.hpp>
#include <mapnik/projection.hpp>
#include <mapnik/proj_transform.hpp>
#include <mapnik/view_transform.hpp>
#include <mapnik/geometry_transform.hpp>
#include <mapnik/geometry_strategy.hpp>
#include <mapnik/proj_strategy.hpp>
#include <mapnik/view_strategy.hpp>

TEST_CASE("geometry strategy tests") {

SECTION("proj and view strategy") {
    using namespace mapnik::geometry;
    mapnik::box2d<double> e(-20037508.342789,-20037508.342789,20037508.342789,20037508.342789);
    mapnik::view_transform vt(256, 256, e);
    mapnik::view_strategy vs(vt);
    mapnik::unview_strategy uvs(vt);
    mapnik::projection source("+init=epsg:4326");
    mapnik::projection dest("+init=epsg:3857");
    mapnik::proj_transform proj_trans(source, dest);
    mapnik::proj_transform proj_trans_rev(dest, source);
    mapnik::proj_strategy ps(proj_trans);
    mapnik::proj_strategy ps_rev(proj_trans_rev);
    {
        // Test first that proj strategy works properly
        point<double> p1(-97.553098,35.523105);
        point<double> r1(-1.08596e+07, 4.2352e+06);
        point<double> p3 = transform<double>(p1, ps);
        assert_g_equal(r1, p3);
    }
    {
        // Test next that view_strategy works
        point<double> p1(-1.08596e+07, 4.2352e+06);
        point<double> r1(58.6287 , 100.945);
        point<double> p3 = transform<double>(p1, vs);
        assert_g_equal(r1, p3);

    }
    {
        // Test next that view_strategy works as single process in strategy group
        point<double> p1(-1.08596e+07, 4.2352e+06);
        point<double> r1(58.6287 , 100.945);
        using sg_type = strategy_group<mapnik::view_strategy>;
        sg_type sg(vs);
        point<double> p3 = transform<double>(p1, sg);
        assert_g_equal(r1, p3);

    }
    {
        // Test that both work grouped together in strategy group
        using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy >;
        sg_type sg(ps, vs);
        point<double> p1(-97.553098,35.523105);
        point<double> r1(58.6287 , 100.945);
        point<double> p3 = transform<double>(p1, sg);
        assert_g_equal(r1, p3);
    }
    {
        // Test that both work grouped together passing in geometry
        using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy >;
        sg_type sg(ps, vs);
        geometry<double> p1(point<double>(-97.553098,35.523105));
        point<double> r1(58.6287 , 100.945);
        geometry<double> p2 = transform<double>(p1, sg);
        REQUIRE(p2.is<point<double> >());
        point<double> p3 = mapnik::util::get<point<double> >(p2);
        assert_g_equal(r1, p3);
    }
    {
        // Test that it works pulling back int
        using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy >;
        sg_type sg(ps, vs);
        geometry<double> p1(point<double>(-97.553098,35.523105));
        point<std::int64_t> r1(58 , 100);
        geometry<std::int64_t> p2 = transform<std::int64_t>(p1, sg);
        REQUIRE(p2.is<point<std::int64_t> >());
        point<std::int64_t> p3 = mapnik::util::get<point<std::int64_t> >(p2);
        assert_g_equal(r1, p3);
    }
    {
        // Test with scaling as well. This would be like projection from 4326 to a vector tile.
        mapnik::geometry::scale_rounding_strategy ss(16);
        using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy, mapnik::geometry::scale_rounding_strategy >;
        sg_type sg(ps, vs, ss);
        geometry<double> p1(point<double>(-97.553098,35.523105));
        point<std::int64_t> r1(938 , 1615);
        geometry<std::int64_t> p2 = transform<std::int64_t>(p1, sg);
        REQUIRE(p2.is<point<std::int64_t> >());
        point<std::int64_t> p3 = mapnik::util::get<point<std::int64_t> >(p2);
        assert_g_equal(r1, p3);
    }
    {
        // Test the entire process in reverse! This would be like converting a vector tile coordinate to 4326.
        mapnik::geometry::scale_strategy ss(1.0/16.0);
        using sg_type = strategy_group_first<mapnik::geometry::scale_strategy, mapnik::unview_strategy, mapnik::proj_strategy >;
        sg_type sg(ss, uvs, ps_rev);
        geometry<std::int64_t> p1(point<std::int64_t>(938 , 1615));
        point<double> r1(-97.5586 , 35.5322);
        geometry<double> p2 = transform<double>(p1, sg);
        REQUIRE(p2.is<point<double> >());
        point<double> p3 = mapnik::util::get<point<double> >(p2);
        assert_g_equal(r1, p3);
    }
    {
        // Test with scaling + offset as well. This would be like projection from 4326 to a vector tile.
        mapnik::geometry::scale_rounding_strategy ss(16, 20);
        using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy, mapnik::geometry::scale_rounding_strategy >;
        sg_type sg(ps, vs, ss);
        geometry<double> p1(point<double>(-97.553098,35.523105));
        point<std::int64_t> r1(958 , 1635);
        geometry<std::int64_t> p2 = transform<std::int64_t>(p1, sg);
        REQUIRE(p2.is<point<std::int64_t> >());
        point<std::int64_t> p3 = mapnik::util::get<point<std::int64_t> >(p2);
        assert_g_equal(r1, p3);
    }
    {
        // Test the entire scaling plus offset in reverse process in reverse! This would be like converting a vector tile coordinate to 4326.
        mapnik::geometry::scale_strategy ss(1.0/16.0, -20.0/16.0);
        using sg_type = strategy_group_first<mapnik::geometry::scale_strategy, mapnik::unview_strategy, mapnik::proj_strategy >;
        sg_type sg(ss, uvs, ps_rev);
        geometry<std::int64_t> p1(point<std::int64_t>(958 , 1635));
        point<double> r1(-97.5586 , 35.5322);
        geometry<double> p2 = transform<double>(p1, sg);
        REQUIRE(p2.is<point<double> >());
        point<double> p3 = mapnik::util::get<point<double> >(p2);
        assert_g_equal(r1, p3);
    }

} // END SECTION

SECTION("scaling strategies - double to double") {
    using namespace mapnik::geometry;

    {
        scale_strategy ss(10.0);
        point<double> p(-90.3, 35.5);
        point<double> r(-903.0, 355.0);
        point<double> o = transform<double>(p, ss);
        assert_g_equal(r, o);
    }
    {
        scale_strategy ss(0.5, -2.0);
        point<double> p(-90.3, 35.5);
        point<double> r(-47.15, 15.75);
        point<double> o = transform<double>(p, ss);
        assert_g_equal(r, o);
    }
    {
        scale_rounding_strategy ss(0.5, -2.0);
        point<double> p(-90.3, 35.5);
        point<double> r(-47.0, 16.0);
        point<double> o = transform<double>(p, ss);
        assert_g_equal(r, o);
    }

} // END SECTION

SECTION("scaling strategies - double to int64") {
    using namespace mapnik::geometry;

    {
        scale_strategy ss(10.0);
        point<double> p(-90.31, 35.58);
        point<std::int64_t> r(-903, 355);
        point<std::int64_t> o = transform<std::int64_t>(p, ss);
        assert_g_equal(r, o);
    }
    {
        scale_strategy ss(0.5, -2.0);
        point<double> p(-90.3, 35.5);
        point<std::int64_t> r(-47, 15);
        point<std::int64_t> o = transform<std::int64_t>(p, ss);
        assert_g_equal(r, o);
    }
    {
        scale_rounding_strategy ss(0.5, -2.0);
        point<double> p(-90.3, 35.5);
        point<std::int64_t> r(-47, 16);
        point<std::int64_t> o = transform<std::int64_t>(p, ss);
        assert_g_equal(r, o);
    }
} // END SECTION

} // END TEST CASE