]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/test/algorithms/set_operations/union/union_aa_geo.cpp
4 // Copyright (c) 2017, Oracle and/or its affiliates.
5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
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)
14 #include "test_union.hpp"
16 #include <boost/geometry/geometries/point_xy.hpp>
19 struct exterior_points_counter
21 exterior_points_counter() : count(0) {}
23 template <typename Polygon
>
24 void operator()(Polygon
const& poly
)
26 count
+= boost::size(bg::exterior_ring(poly
));
32 struct interiors_counter
33 : exterior_points_counter
35 template <typename Polygon
>
36 void operator()(Polygon
const& poly
)
38 count
+= boost::size(bg::interior_rings(poly
));
42 void test_geographic_one(std::string
const& wkt1
, std::string
const& wkt2
,
43 std::size_t count
, std::size_t exterior_points_count
, std::size_t interiors_count
,
46 typedef bg::model::point
<double, 2, bg::cs::geographic
<bg::degree
> > point
;
47 typedef bg::model::polygon
<point
> polygon
;
48 typedef bg::model::multi_polygon
<polygon
> multipolygon
;
50 bg::srs::spheroid
<double> sph(6378137.0000000000, 6356752.3142451793);
52 bg::strategy::intersection::geographic_segments
<> is(sph
);
53 bg::strategy::area::geographic
<point
> as(sph
);
57 boost::geometry::read_wkt(wkt1
, p1
);
58 boost::geometry::read_wkt(wkt2
, p2
);
62 enum test_mode
{ expect_valid
, expect_empty
, expect_exception
};
64 #if defined(BOOST_GEOMETRY_UNION_THROW_INVALID_OUTPUT_EXCEPTION)
65 test_mode mode
= expected_area
>= 0 ? expect_valid
: expect_exception
;
66 #elif defined(BOOST_GEOMETRY_UNION_RETURN_INVALID)
67 test_mode mode
= expect_valid
;
70 test_mode mode
= expected_area
>= 0 ? expect_valid
: expect_empty
;
73 if (mode
== expect_exception
)
75 BOOST_CHECK_THROW(boost::geometry::union_(p1
, p2
, result
, is
),
76 bg::invalid_output_exception
);
81 boost::geometry::union_(p1
, p2
, result
, is
);
83 double result_area
= bg::area(result
, as
);
85 std::size_t result_count
= boost::size(result
);
86 std::size_t result_exterior_points
= std::for_each(boost::begin(result
),
88 exterior_points_counter()).count
;
89 std::size_t result_interiors
= std::for_each(boost::begin(result
),
91 interiors_counter()).count
;
92 if (mode
== expect_valid
)
94 BOOST_CHECK_EQUAL(result_count
, count
);
95 BOOST_CHECK_EQUAL(result_exterior_points
, exterior_points_count
);
96 BOOST_CHECK_EQUAL(result_interiors
, interiors_count
);
97 BOOST_CHECK_CLOSE(result_area
, expected_area
, 0.001);
101 BOOST_CHECK_EQUAL(result_count
, 0);
102 BOOST_CHECK_EQUAL(result_area
, 0);
108 void test_geographic()
110 // input ok and the result is ok
111 test_geographic_one("POLYGON((16 15,-132 10,-56 89,67 5,16 15))",
112 "POLYGON((101 49,12 40,-164 10,117 0,101 49))",
113 1, 9, 0, 144265751613509.06);
115 // input ok but the result is too big
116 test_geographic_one("POLYGON((16 -15,-132 -22,-56 89,67 -29,16 -15))",
117 "POLYGON((101 49,12 40,-164 -21,117 -61,101 49))",
118 1, 9, 0, -163427005620080.0);
120 // the second polygon is reversed i.e. it covers more than half of the globe
121 // so the result is also too big
122 test_geographic_one("POLYGON((16 -15,-132 -22,-56 89,67 -29,16 -15))",
123 "POLYGON((101 49,117 -61,-164 -21,12 40,101 49))",
124 1, 7, 0, -125258931656228.08);
128 int test_main(int, char* [])