1 // Boost.Geometry (aka GGL, Generic Geometry Library)
4 // Copyright (c) 2014-2017, Oracle and/or its affiliates.
6 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
8 // Licensed under the Boost Software License version 1.0.
9 // http://www.boost.org/users/license.html
11 #ifndef BOOST_TEST_MODULE
12 #define BOOST_TEST_MODULE test_is_simple_geo
15 #include "test_is_simple.hpp"
18 inline bg::srs::spheroid
<double> sph(double a
, double rf
)
20 double b
= a
- a
/ rf
;
21 return bg::srs::spheroid
<double>(a
, b
);
24 typedef bg::model::point
<double, 2, bg::cs::geographic
<bg::degree
> > point_type
;
25 typedef bg::model::segment
<point_type
> segment_type
;
26 typedef bg::model::linestring
<point_type
> linestring_type
;
27 typedef bg::model::multi_linestring
<linestring_type
> multi_linestring_type
;
28 // ccw open and closed polygons
29 typedef bg::model::polygon
<point_type
,false,false> open_ccw_polygon_type
;
30 typedef bg::model::polygon
<point_type
,false,true> closed_ccw_polygon_type
;
32 typedef bg::model::multi_point
<point_type
> multi_point_type
;
33 typedef bg::model::multi_polygon
<open_ccw_polygon_type
> multi_polygon_type
;
35 typedef bg::model::box
<point_type
> box_type
;
38 BOOST_AUTO_TEST_CASE( test_is_simple_geo_multipoint
)
40 typedef multi_point_type G
;
42 bg::strategy::intersection::geographic_segments
<> s
;
44 test_simple_s(from_wkt
<G
>("MULTIPOINT(0 90, 0 90)"), s
, false);
45 test_simple_s(from_wkt
<G
>("MULTIPOINT(0 90, 1 90)"), s
, false);
46 test_simple_s(from_wkt
<G
>("MULTIPOINT(0 -90, 0 -90)"), s
, false);
47 test_simple_s(from_wkt
<G
>("MULTIPOINT(0 -90, 1 -90)"), s
, false);
48 test_simple_s(from_wkt
<G
>("MULTIPOINT(0 80, 1 80)"), s
, true);
51 BOOST_AUTO_TEST_CASE( test_is_simple_geo_linestring
)
53 typedef linestring_type G
;
55 bg::srs::spheroid
<double> sph_wgs84
;
56 bg::srs::spheroid
<double> sph_4053(6371228, 6371228);
57 bg::srs::spheroid
<double> sph_near_4053(6371228, 6371227);
59 bg::strategy::intersection::geographic_segments
<> s(sph_wgs84
);
60 bg::strategy::intersection::geographic_segments
<> s_4053(sph_4053
);
61 bg::strategy::intersection::geographic_segments
<> s_near_4053(sph_near_4053
);
63 // Two cases which in Cartesian would be a spike, but in Geographic
64 // they go over the equator (first segment) and then over the pole
66 test_simple_s(from_wkt
<G
>("LINESTRING(0 0, -90 0, 90 0)"), s
, true);
67 test_simple_s(from_wkt
<G
>("LINESTRING(0 0, 90 0, -90 0)"), s
, true);
69 // Two similar cases, but these do not go over the pole back, but
70 // over the equator, and therefore make a spike
71 test_simple_s(from_wkt
<G
>("LINESTRING(0 0, -80 0, 80 0)"), s
, false);
72 test_simple_s(from_wkt
<G
>("LINESTRING(0 0, 80 0, -80 0)"), s
, false);
74 // Going over the equator in a normal way, eastwards and westwards
75 test_simple_s(from_wkt
<G
>("LINESTRING(-90 0, 0 0, 90 0)"), s
, true);
76 test_simple_s(from_wkt
<G
>("LINESTRING(90 0, 0 0, -90 0)"), s
, true);
78 test_simple_s(from_wkt
<G
>("LINESTRING(0 90, -90 0, 90 0)"), s
, false);
79 test_simple_s(from_wkt
<G
>("LINESTRING(0 90, -90 50, 90 0)"), s
, false);
80 test_simple_s(from_wkt
<G
>("LINESTRING(0 90, -90 -50, 90 0)"), s
, true);
82 // invalid linestrings
83 test_simple_s(from_wkt
<G
>("LINESTRING(0 90, 0 90)"), s
, false, false);
84 test_simple_s(from_wkt
<G
>("LINESTRING(0 -90, 0 -90)"), s
, false, false);
85 test_simple_s(from_wkt
<G
>("LINESTRING(0 90, 1 90)"), s
, false, false);
86 test_simple_s(from_wkt
<G
>("LINESTRING(0 -90, 1 -90)"), s
, false, false);
89 //test_simple_s(from_wkt<G>("LINESTRING(0 90, 0 80, 1 80, 0 90)"), s, false);
90 //test_simple_s(from_wkt<G>("LINESTRING(0 -90, 0 -80, 1 -80, 0 -90)"), s, false);
91 //test_simple_s(from_wkt<G>("LINESTRING(0 90, 0 80, 1 80, 1 90)"), s, false);
92 //test_simple_s(from_wkt<G>("LINESTRING(0 -90, 0 -80, 1 -80, 1 -90)"), s, false);
94 test_simple_s(from_wkt
<G
>("LINESTRING(35 0, 110 36, 159 0, 82 30)"), s
, false);
95 test_simple_s(from_wkt
<G
>("LINESTRING(135 0, -150 36, -101 0, -178 30)"), s
, false);
96 test_simple_s(from_wkt
<G
>("LINESTRING(45 0, 120 36, 169 0, 92 30)"), s
, false);
97 test_simple_s(from_wkt
<G
>("LINESTRING(179 0, -179 1, -179 0, 179 1)"), s
, false);
99 test_simple_s(from_wkt
<G
>("LINESTRING(-121 -19,37 8,-19 -15,-104 -58)"), s
, false);
100 test_simple_s(from_wkt
<G
>("LINESTRING(-121 -19,37 8,-19 -15,-104 -58)"), s_4053
, false);
101 test_simple_s(from_wkt
<G
>("LINESTRING(-121 -19,37 8,-19 -15,-104 -58)"), s_near_4053
, false);
103 // The segments are very close to each other, in WGS84 they cross,
104 // in spherical or nearly spherical they don't cross
105 test_simple_s(from_wkt
<G
>("LINESTRING(106 22,21 39,40 -12,-91 68)"), s
, false);
106 test_simple_s(from_wkt
<G
>("LINESTRING(106 22,21 39,40 -12,-91 68)"), s_4053
, true);
107 test_simple_s(from_wkt
<G
>("LINESTRING(106 22,21 39,40 -12,-91 68)"), s_near_4053
, true);
110 BOOST_AUTO_TEST_CASE( test_is_simple_geo_multilinestring
)
112 typedef multi_linestring_type G
;
114 bg::strategy::intersection::geographic_segments
<> s_wgs84
; // EPSG 4326
115 bg::strategy::intersection::geographic_segments
<> s_bessel((sph(6377397.155,299.1528128))); // EPSG 4804, 4813, 4820
118 //test_simple_s(from_wkt<G>("MULTILINESTRING((0 90, 0 80),(1 90, 1 80))"), s_wgs84, false);
119 //test_simple_s(from_wkt<G>("MULTILINESTRING((0 -90, 0 -80),(1 -90, 1 -80))"), s_wgs84, false);
121 test_simple_s(from_wkt
<G
>("MULTILINESTRING((35 0, 110 36),(159 0, 82 30))"), s_wgs84
, false);
122 test_simple_s(from_wkt
<G
>("MULTILINESTRING((135 0, -150 36),(-101 0, -178 30))"), s_wgs84
, false);
123 test_simple_s(from_wkt
<G
>("MULTILINESTRING((45 0, 120 36),(169 0, 92 30))"), s_wgs84
, false);
124 test_simple_s(from_wkt
<G
>("MULTILINESTRING((179 0, -179 1),(-179 0, 179 1))"), s_wgs84
, false);
126 test_simple_s(from_wkt
<G
>("MULTILINESTRING((35 2,110 36),(72 51,67 28,16 53,159 3,82 30))"), s_wgs84
, false);
127 test_simple_s(from_wkt
<G
>("MULTILINESTRING((35 2,110 36),(72 51,67 28,16 53,159 3,82 30))"), s_bessel
, false);