1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3
4 // Copyright (c) 2016 Oracle and/or its affiliates.
5 // Contributed and/or modified by Vissarion Fisikopoulos, on behalf of Oracle
6
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10
11 #include <algorithms/test_length.hpp>
12 #include <algorithms/length/linestring_cases.hpp>
13
14 #include <boost/geometry/geometries/geometries.hpp>
15 #include <boost/geometry/geometries/point_xy.hpp>
16 #include <boost/geometry/geometries/adapted/std_pair_as_segment.hpp>
17
18 #include <test_geometries/all_custom_linestring.hpp>
19 #include <test_geometries/wrapped_boost_array.hpp>
20
21 template <typename P>
22 struct geo_strategies
23 {
24 // Set radius type, but for integer coordinates we want to have floating
25 // point radius type
26 typedef typename bg::promote_floating_point
27 <
28 typename bg::coordinate_type<P>::type
29 >::type rtype;
30
31 typedef bg::srs::spheroid<rtype> stype;
32 typedef bg::strategy::distance::andoyer<stype> andoyer_type;
33 typedef bg::strategy::distance::thomas<stype> thomas_type;
34 typedef bg::strategy::distance::vincenty<stype> vincenty_type;
35 };
36
37 template <typename P>
test_default()38 void test_default() //this should use andoyer strategy
39 {
40 for(std::size_t i = 0; i < 2; ++i)
41 {
42 test_geometry<bg::model::linestring<P> >(Ls_data_geo[i],
43 1116814.237 + 1116152.605);
44 }
45 // Geometries with length zero
46 test_geometry<P>("POINT(0 0)", 0);
47 test_geometry<bg::model::polygon<P> >("POLYGON((0 0,0 1,1 1,1 0,0 0))", 0);
48 }
49
50 template <typename P, typename N, typename Strategy>
test_with_strategy(N exp_length,Strategy strategy)51 void test_with_strategy(N exp_length, Strategy strategy)
52 {
53 for(std::size_t i = 0; i < 2; ++i)
54 {
55 test_geometry<bg::model::linestring<P> >(Ls_data_geo[i],
56 exp_length,
57 strategy);
58 }
59 // Geometries with length zero
60 test_geometry<P>("POINT(0 0)", 0, strategy);
61 test_geometry<bg::model::polygon<P> >("POLYGON((0 0,0 1,1 1,1 0,0 0))", 0,
62 strategy);
63 }
64
65 template <typename P>
test_andoyer()66 void test_andoyer()
67 {
68 typename geo_strategies<P>::andoyer_type andoyer;
69 test_with_strategy<P>(1116814.237 + 1116152.605, andoyer);
70 }
71
72 template <typename P>
test_thomas()73 void test_thomas()
74 {
75 typename geo_strategies<P>::thomas_type thomas;
76 test_with_strategy<P>(1116825.795 + 1116158.7417, thomas);
77 }
78
79 template <typename P>
test_vincenty()80 void test_vincenty()
81 {
82 typename geo_strategies<P>::vincenty_type vincenty;
83 test_with_strategy<P>(1116825.857 + 1116159.144, vincenty);
84 }
85
86 template <typename P>
test_all()87 void test_all()
88 {
89 test_default<P>();
90 test_andoyer<P>();
91 test_thomas<P>();
92 test_vincenty<P>();
93 }
94
95 template <typename P>
test_empty_input()96 void test_empty_input()
97 {
98 test_empty_input(bg::model::linestring<P>());
99 test_empty_input(bg::model::multi_linestring<P>());
100 }
101
test_main(int,char * [])102 int test_main(int, char* [])
103 {
104 // Works only for double(?!)
105 //test_all<bg::model::d2::point_xy<int,
106 // bg::cs::geographic<bg::degree> > >();
107 //test_all<bg::model::d2::point_xy<float,
108 // bg::cs::geographic<bg::degree> > >();
109 test_all<bg::model::d2::point_xy<double,
110 bg::cs::geographic<bg::degree> > >();
111
112 #if defined(HAVE_TTMATH)
113 test_all<bg::model::d2::point_xy<ttmath_big> >();
114 #endif
115
116 //test_empty_input<bg::model::d2::point_xy<double,
117 // bg::cs::geographic<bg::degree> > >();
118
119 return 0;
120 }
121
122