#include #include #include #define private public #include "lib/geo/ob_geo_bin.h" #include "lib/geo/ob_geo_tree.h" #include "lib/geo/ob_geo_tree_traits.h" #include "lib/geo/ob_geo_bin_traits.h" #include "lib/json_type/ob_json_common.h" #include "lib/random/ob_random.h" #undef private #include #include #include #include namespace bg = boost::geometry; namespace oceanbase { namespace common { class TestGeoTree : public ::testing::Test { public: TestGeoTree() {} ~TestGeoTree() {} virtual void SetUp() {} virtual void TearDown() {} static void SetUpTestCase() {} static void TearDownTestCase() {} private: // disallow copy DISALLOW_COPY_AND_ASSIGN(TestGeoTree); }; TEST_F(TestGeoTree, iters) { ObArenaAllocator allocator(ObModIds::TEST); ModulePageAllocator page_allocator_(allocator, common::ObModIds::OB_MODULE_PAGE_ALLOCATOR); ObGeomVector gv(page_allocator_); const ObGeomVector &c_gv = gv; gv.push_back(0); gv.push_back(1); gv.push_back(2); gv.push_back(3); gv.push_back(4); gv.push_back(5); gv.push_back(6); gv.push_back(7); gv.push_back(8); gv.push_back(9); ASSERT_EQ(gv.size(), 10); ObGeomVector::iterator iter = gv.begin(); ObGeomVector::const_iterator c_iter = c_gv.begin(); ObGeomVector::iterator begin = gv.begin(); ObGeomVector::const_iterator c_begin = c_gv.begin(); ObGeomVector::iterator end = gv.end(); ObGeomVector::const_iterator c_end = c_gv.end(); ObGeomVector::iterator tmp_iter; ObGeomVector::const_iterator tmp_c_iter; // test ++, -- ASSERT_EQ(iter, begin); ASSERT_EQ(c_iter, c_begin); ASSERT_NE(iter, end); ASSERT_NE(c_iter, c_end); int i = 0; for (; i < 10; i++) { ASSERT_EQ(*iter, i); ASSERT_EQ(*c_iter, i); iter++; c_iter++; } ASSERT_EQ(iter, end); ASSERT_EQ(c_iter, c_end); iter = begin; c_iter = c_begin; for (i = 0; i < 10; i++) { ASSERT_EQ(*iter, i); ASSERT_EQ(*c_iter, i); iter++; c_iter++; } ASSERT_EQ(iter, end); ASSERT_EQ(c_iter, c_end); ASSERT_EQ(i, 10); i--; iter--; c_iter--; for (; i > 0; i--) { ASSERT_EQ(*iter, i); ASSERT_EQ(*c_iter, i); iter--; c_iter--; } ASSERT_EQ(iter, begin); ASSERT_EQ(c_iter, c_begin); tmp_iter = iter + 3; tmp_c_iter = c_iter + 3; ASSERT_EQ(*tmp_iter, 3); ASSERT_EQ(*tmp_c_iter, 3); tmp_iter = 4 + iter; tmp_c_iter = 4 + c_iter; ASSERT_EQ(*tmp_iter, 4); ASSERT_EQ(*tmp_c_iter, 4); tmp_iter = end - 3; tmp_c_iter = c_end - 3; ASSERT_EQ(*tmp_iter, *tmp_c_iter); ASSERT_EQ(*tmp_iter, 7); ASSERT_EQ(*tmp_c_iter, 7); tmp_iter += 2; tmp_c_iter += 2; ASSERT_EQ(*tmp_iter, *tmp_c_iter); ASSERT_EQ(*tmp_iter, 9); ASSERT_EQ(*tmp_c_iter, 9); tmp_iter -= 2; tmp_c_iter -= 2; ASSERT_EQ(*tmp_iter, *tmp_c_iter); ASSERT_EQ(*tmp_iter, 7); ASSERT_EQ(*tmp_c_iter, 7); tmp_iter = ++iter; tmp_c_iter = ++c_iter; ASSERT_EQ(*tmp_iter, *tmp_c_iter); ASSERT_EQ(*tmp_iter, 1); ASSERT_EQ(*tmp_c_iter, 1); tmp_iter = iter++; tmp_c_iter = c_iter++; ASSERT_EQ(*tmp_iter, *tmp_c_iter); ASSERT_EQ(*tmp_iter, 1); ASSERT_EQ(*tmp_c_iter, 1); ASSERT_EQ(*iter, *c_iter); ASSERT_EQ(*iter, 2); ASSERT_EQ(*c_iter, 2); ASSERT_EQ(c_end - c_begin, end - begin); ASSERT_TRUE(c_end != c_begin); ASSERT_TRUE(end != begin); ASSERT_FALSE((c_end < c_begin)); ASSERT_FALSE(end < begin); ASSERT_TRUE(begin < end); ASSERT_TRUE(c_begin < c_end); } TEST_F(TestGeoTree, ObGeomVector) { ObArenaAllocator allocator(ObModIds::TEST); ModulePageAllocator page_allocator_(allocator, common::ObModIds::OB_MODULE_PAGE_ALLOCATOR); ObGeomVector gv(page_allocator_); ASSERT_TRUE(gv.empty()); gv.push_back(0); gv.push_back(1); gv.push_back(2); gv.push_back(3); gv.push_back(4); gv.push_back(5); gv.push_back(6); gv.push_back(7); gv.push_back(8); gv.push_back(9); const ObGeomVector &c_gv = gv; ASSERT_EQ(c_gv.front(), 0); ASSERT_EQ(c_gv.back(), 9); for (int i = 0; i < 10; i++) { ASSERT_EQ(c_gv[i], i); } ASSERT_FALSE(gv.empty()); ASSERT_EQ(gv.size(), 10); gv.pop_front(); ASSERT_EQ(gv.front(), 1); gv.pop_front(); ASSERT_EQ(gv.front(), 2); ASSERT_EQ(gv.back(), 9); gv.resize(3); ASSERT_EQ(gv.size(), 3); ASSERT_EQ(gv.front(), 2); ASSERT_EQ(gv[1], 3); ASSERT_EQ(gv.back(), 4); gv.resize(10); ASSERT_EQ(gv.size(), 10); gv.clear(); ASSERT_TRUE(gv.empty()); } TEST_F(TestGeoTree, point) { ObArenaAllocator allocator(ObModIds::TEST); ObCartesianPoint p(1.12, 2.32, 0, &allocator); ASSERT_EQ(1.12, p.get<0>()); ASSERT_EQ(2.32, p.get<1>()); ASSERT_EQ(ObGeoCRS::Cartesian, p.crs()); p.set<0>(3.321); p.set<1>(4.444); ASSERT_EQ(3.321, p.get<0>()); ASSERT_EQ(4.444, p.get<1>()); p.x(-3.123); p.y(-4.567); ASSERT_EQ(-3.123, p.get<0>()); ASSERT_EQ(-4.567, p.get<1>()); p.x(1.7976931348623157e308); p.y(-1.7976931348623157e308); EXPECT_EQ(1.7976931348623157e308, p.x()); EXPECT_EQ(-1.7976931348623157e308, p.y()); ASSERT_FALSE(p.is_empty()); ObCartesianPoint p1(0, &allocator); ASSERT_TRUE(std::isnan(p1.x())); ASSERT_TRUE(std::isnan(p1.y())); ASSERT_TRUE(p1.is_empty()); } TEST_F(TestGeoTree, linestring) { ObArenaAllocator allocator(ObModIds::TEST); ObLineString *l = NULL; ASSERT_EQ(OB_SUCCESS, ObLineString::create_linestring(ObGeoCRS::Cartesian, 0, allocator, l)); ObCartesianLineString *line = static_cast(l); ASSERT_EQ(ObGeoType::LINESTRING, line->type()); ASSERT_EQ(1, line->dimension()); uint32_t num = 10000; common::ObVector xv; common::ObVector yv; for (int i = 0; i < num; i++) { double x = static_cast(rand())/static_cast(rand()); double y = static_cast(rand())/static_cast(rand()); ASSERT_EQ(OB_SUCCESS, line->push_back(ObWkbGeomInnerPoint(x, y))); xv.push_back(x); yv.push_back(y); } ASSERT_EQ(10000, line->size()); ObCartesianLineString::iterator iter = line->begin(); for (int i = 0; iter != line->end(); ++iter, i++) { ASSERT_EQ(xv[i], iter->get<0>()); ASSERT_EQ(yv[i], iter->get<1>()); } line->clear(); ASSERT_EQ(0, line->size()); ASSERT_TRUE(line->is_empty()); for (int i = 0; i < 4; i++) { ASSERT_EQ(OB_SUCCESS, line->push_back(ObWkbGeomInnerPoint(i, i+1))); } for (int i = 0; i < 4; i++) { ASSERT_EQ(i, (*line)[i].get<0>()); ASSERT_EQ(i+1, (*line)[i].get<1>()); } ASSERT_EQ(0, line->front().get<0>()); ASSERT_EQ(1, line->front().get<1>()); ASSERT_EQ(3, line->back().get<0>()); ASSERT_EQ(4, line->back().get<1>()); line->pop_front(); ASSERT_EQ(1, line->front().get<0>()); ASSERT_EQ(2, line->front().get<1>()); } TEST_F(TestGeoTree, linesarring) { ObArenaAllocator allocator(ObModIds::TEST); ObLinearring *r = NULL; ASSERT_EQ(OB_SUCCESS, ObLinearring::create_linearring(ObGeoCRS::Cartesian, 0, allocator, r)); ASSERT_EQ(ObGeoType::LINESTRING, r->type()); ASSERT_EQ(1, r->dimension()); ObCartesianLinearring *ring = static_cast(r); ASSERT_EQ(0, ring->size()); ASSERT_TRUE(ring->is_empty()); ObWkbGeomInnerPoint p1(0.0, 0.0); ASSERT_EQ(OB_SUCCESS, ring->push_back(p1)); ObWkbGeomInnerPoint p2(0, 10); ASSERT_EQ(OB_SUCCESS, ring->push_back(p2)); ObWkbGeomInnerPoint p3(10, 10); ASSERT_EQ(OB_SUCCESS, ring->push_back(p3)); ObWkbGeomInnerPoint p4(10, 0.0); ASSERT_EQ(OB_SUCCESS, ring->push_back(p4)); ObCartesianLinearring::iterator iter = ring->begin(); for (int i = 0; iter != ring->end(); ++iter, i++) { std::cout << "(" << iter->get<0>() << ", " << iter->get<1>() << ")" << std::endl; } ASSERT_EQ(0, (*ring)[1].get<0>()); ASSERT_EQ(10, (*ring)[1].get<1>()); ASSERT_EQ(10, (*ring)[2].get<0>()); ASSERT_EQ(10, (*ring)[2].get<1>()); ASSERT_EQ(0, ring->front().get<0>()); ASSERT_EQ(0, ring->front().get<1>()); ASSERT_EQ(10, ring->back().get<0>()); ASSERT_EQ(0, ring->back().get<1>()); ring->pop_front(); ASSERT_EQ(3, ring->size()); ASSERT_EQ(0, ring->front().get<0>()); ASSERT_EQ(10, ring->front().get<1>()); } TEST_F(TestGeoTree, Polygon) { ObPolygon *poly = NULL; ObArenaAllocator allocator(ObModIds::TEST); ASSERT_EQ(OB_SUCCESS, ObPolygon::create_polygon(ObGeoCRS::Cartesian, 0, allocator, poly)); ASSERT_EQ(ObGeoType::POLYGON, poly->type()); ASSERT_EQ(ObGeoCRS::Cartesian, poly->crs()); ASSERT_EQ(0U, poly->size()); ASSERT_TRUE(poly->empty()); ASSERT_TRUE(poly->is_empty()); ASSERT_EQ(ObGeoType::POLYGON, poly->type()); ASSERT_EQ(ObGeoCRS::Cartesian, poly->crs()); ASSERT_EQ(0U, poly->size()); ASSERT_TRUE(poly->empty()); ASSERT_TRUE(poly->is_empty()); ObCartesianLinearring outer_ring(0, allocator); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); outer_ring.push_back(ObWkbGeomInnerPoint(10.0, 0.0)); outer_ring.push_back(ObWkbGeomInnerPoint(10.0, 10.0)); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 10.0)); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); poly->push_back(outer_ring); ASSERT_FALSE(poly->empty()); ASSERT_FALSE(poly->is_empty()); ObCartesianLinearring inner_ring(0, allocator); inner_ring.push_back(ObWkbGeomInnerPoint(2.0, 2.0)); inner_ring.push_back(ObWkbGeomInnerPoint(2.0, 8.0)); inner_ring.push_back(ObWkbGeomInnerPoint(8.0, 8.0)); inner_ring.push_back(ObWkbGeomInnerPoint(8.0, 2.0)); inner_ring.push_back(ObWkbGeomInnerPoint(2.0, 2.0)); poly->push_back(inner_ring); ObCartesianPolygon *polygon = static_cast(poly); ASSERT_EQ(2U, polygon->size()); ASSERT_FALSE(polygon->empty()); ASSERT_EQ(1U, polygon->inner_ring_size()); ASSERT_FALSE(polygon->inner_ring(0).empty()); ASSERT_EQ(10, polygon->exterior_ring()[1].get<0>()); ASSERT_EQ(0, polygon->exterior_ring()[1].get<1>()); ASSERT_EQ(10, polygon->exterior_ring()[2].get<0>()); ASSERT_EQ(10, polygon->exterior_ring()[2].get<1>()); ASSERT_EQ(2, polygon->inner_ring(0)[1].get<0>()); ASSERT_EQ(8, polygon->inner_ring(0)[1].get<1>()); ASSERT_EQ(8, polygon->inner_ring(0)[2].get<0>()); ASSERT_EQ(8, polygon->inner_ring(0)[2].get<1>()); } TEST_F(TestGeoTree, Geometrycollection) { ObArenaAllocator allocator(ObModIds::TEST); ObGeometrycollection* gc = NULL; ASSERT_EQ(OB_SUCCESS, ObGeometrycollection::create_collection(ObGeoCRS::Cartesian, 0, allocator, gc)); ASSERT_EQ(ObGeoType::GEOMETRYCOLLECTION, gc->type()); ASSERT_EQ(ObGeoCRS::Cartesian, gc->crs()); ASSERT_TRUE(gc->empty()); ASSERT_TRUE(gc->is_empty()); ObCartesianGeometrycollection *cartesianGc = static_cast(gc); cartesianGc->push_back(ObCartesianGeometrycollection(0, allocator)); ASSERT_FALSE(cartesianGc->empty()); ASSERT_TRUE(cartesianGc->is_empty()); cartesianGc->push_back(ObCartesianPoint(0.0, 0.0, 0, &allocator)); cartesianGc->push_back(ObCartesianPoint(10.0, 0.0, 0, &allocator)); cartesianGc->push_back(ObCartesianPoint(10.0, 10.0, 0, &allocator)); cartesianGc->push_back(ObCartesianPoint(0.0, 10.0, 0, &allocator)); cartesianGc->push_back(ObCartesianPoint(0.0, 0.0, 0, &allocator)); ObCartesianLineString ls(0, allocator); ls.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ls.push_back(ObWkbGeomInnerPoint(10.0, 0.0)); ls.push_back(ObWkbGeomInnerPoint(10.0, 10.0)); ls.push_back(ObWkbGeomInnerPoint(0.0, 10.0)); ls.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); cartesianGc->push_back(ls); ObCartesianLinearring outer_ring(0, allocator); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); outer_ring.push_back(ObWkbGeomInnerPoint(10.0, 0.0)); outer_ring.push_back(ObWkbGeomInnerPoint(10.0, 10.0)); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 10.0)); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ObCartesianPolygon py(0, allocator); py.push_back(outer_ring); cartesianGc->push_back(py); ObCartesianMultipoint mpt(0, allocator); mpt.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); cartesianGc->push_back(mpt); ObCartesianLineString ls2(0, allocator); ls2.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ls2.push_back(ObWkbGeomInnerPoint(1.0, 1.0)); ObCartesianMultilinestring mls; mls.push_back(ls2); cartesianGc->push_back(mls); ObCartesianMultipolygon mpy(0, allocator); cartesianGc->push_back(mpy); ObCartesianGeometrycollection inner_gc(0, allocator); cartesianGc->push_back(inner_gc); ASSERT_EQ(12U, cartesianGc->size()); ASSERT_FALSE(cartesianGc->empty()); ASSERT_EQ(ObGeoType::GEOMETRYCOLLECTION, cartesianGc->front().type()); cartesianGc->pop_front(); cartesianGc->pop_front(); ASSERT_EQ(10U, cartesianGc->size()); ASSERT_EQ(ObGeoType::POINT, cartesianGc->front().type()); } TEST_F(TestGeoTree, Multipoint) { ObArenaAllocator allocator(ObModIds::TEST); ObMultipoint *mpt_ptr = NULL; ASSERT_EQ(OB_SUCCESS, ObMultipoint::create_multipoint(ObGeoCRS::Cartesian, 0, allocator, mpt_ptr)); ASSERT_EQ(ObGeoType::MULTIPOINT, mpt_ptr->type()); ASSERT_EQ(ObGeoCRS::Cartesian, mpt_ptr->crs()); ASSERT_TRUE(mpt_ptr->empty()); ASSERT_TRUE(mpt_ptr->is_empty()); ObCartesianMultipoint *cartMtp = static_cast(mpt_ptr); cartMtp->push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ASSERT_EQ(1U, cartMtp->size()); ASSERT_FALSE(cartMtp->empty()); ASSERT_FALSE(cartMtp->is_empty()); cartMtp->push_back(ObWkbGeomInnerPoint(10.0, 10.0)); ASSERT_EQ(2U, cartMtp->size()); ASSERT_EQ(0.0, cartMtp->front().get<0>()); ASSERT_EQ(0.0, cartMtp->front().get<1>()); cartMtp->pop_front(); ASSERT_EQ(1U, cartMtp->size()); ASSERT_EQ(10.0, cartMtp->front().get<0>()); ASSERT_EQ(10.0, cartMtp->front().get<1>()); } TEST_F(TestGeoTree, Multilinestring) { ObArenaAllocator allocator(ObModIds::TEST); ObMultilinestring *mls_ptr = NULL; ASSERT_EQ(OB_SUCCESS, ObMultilinestring::create_multilinestring(ObGeoCRS::Cartesian, 0, allocator, mls_ptr)); ASSERT_EQ(ObGeoType::MULTILINESTRING, mls_ptr->type()); ASSERT_EQ(ObGeoCRS::Cartesian, mls_ptr->crs()); ASSERT_TRUE(mls_ptr->empty()); ASSERT_TRUE(mls_ptr->is_empty()); ObCartesianMultilinestring *cartMls = static_cast(mls_ptr); ObCartesianLineString ls(0, allocator); ls.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ls.push_back(ObWkbGeomInnerPoint(10.0, 0.0)); ls.push_back(ObWkbGeomInnerPoint(10.0, 10.0)); ls.push_back(ObWkbGeomInnerPoint(0.0, 10.0)); ls.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); cartMls->push_back(ls); ASSERT_EQ(1U, cartMls->size()); ObCartesianMultilinestring *mls = cartMls; const ObCartesianMultilinestring *cmls = cartMls; ObCartesianMultilinestring::iterator iter = mls->begin(); ObCartesianMultilinestring::const_iterator citer = cmls->begin(); auto x = boost::begin(*mls); auto y = boost::begin(*cmls); ObCartesianLineString lsa(0, allocator); ASSERT_FALSE(cartMls->empty()); ASSERT_FALSE(cartMls->is_empty()); ObCartesianLineString ls2(0, allocator); ls2.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ls2.push_back(ObWkbGeomInnerPoint(20.0, 20.0)); cartMls->push_back(ls2); ASSERT_EQ(2U, cartMls->size()); ASSERT_EQ(5U, cartMls->front().size()); ASSERT_EQ(10, cartMls->front()[2].get<0>()); ASSERT_EQ(10, cartMls->front()[2].get<1>()); cartMls->pop_front(); ASSERT_EQ(1U, cartMls->size()); ASSERT_EQ(2U, cartMls->front().size()); } TEST_F(TestGeoTree, Multipolygon) { ObArenaAllocator allocator(ObModIds::TEST); ObMultipolygon *mpy_ptr = NULL; ASSERT_EQ(OB_SUCCESS, ObMultipolygon::create_multipolygon(ObGeoCRS::Cartesian, 0, allocator, mpy_ptr)); ObCartesianMultipolygon *cartMpy = static_cast(mpy_ptr); ASSERT_EQ(ObGeoType::MULTIPOLYGON, cartMpy->type()); ASSERT_EQ(ObGeoCRS::Cartesian, cartMpy->crs()); ASSERT_TRUE(cartMpy->empty()); ASSERT_TRUE(cartMpy->is_empty()); ObCartesianLinearring outer_ring(0, allocator); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); outer_ring.push_back(ObWkbGeomInnerPoint(10.0, 0.0)); outer_ring.push_back(ObWkbGeomInnerPoint(10.0, 10.0)); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 10.0)); outer_ring.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ObCartesianLinearring inner_ring(0, allocator); inner_ring.push_back(ObWkbGeomInnerPoint(2.0, 2.0)); inner_ring.push_back(ObWkbGeomInnerPoint(2.0, 8.0)); inner_ring.push_back(ObWkbGeomInnerPoint(8.0, 8.0)); inner_ring.push_back(ObWkbGeomInnerPoint(8.0, 2.0)); inner_ring.push_back(ObWkbGeomInnerPoint(2.0, 2.0)); ObCartesianPolygon py(0, allocator); py.push_back(outer_ring); py.push_back(inner_ring); cartMpy->push_back(py); ASSERT_EQ(1U, cartMpy->size()); ASSERT_FALSE(cartMpy->empty()); ASSERT_FALSE(cartMpy->is_empty()); cartMpy->push_back(ObCartesianPolygon(0, allocator)); ASSERT_EQ(2U, cartMpy->size()); ASSERT_EQ(2U, cartMpy->front().size()); cartMpy->pop_front(); ASSERT_EQ(1U, cartMpy->size()); ASSERT_EQ(0U, cartMpy->front().size()); } TEST_F(TestGeoTree, intersection_op) { ObArenaAllocator allocator(ObModIds::TEST); ObCartesianLineString ls1(0, allocator); ls1.push_back(ObWkbGeomInnerPoint(1.0, 1.0)); ls1.push_back(ObWkbGeomInnerPoint(3.0, 3.0)); ObCartesianLineString ls2(0, allocator); ls2.push_back(ObWkbGeomInnerPoint(1.0, 3.0)); ls2.push_back(ObWkbGeomInnerPoint(3.0, 1.0)); ObCartesianMultilinestring ml(0, allocator); bool d = bg::intersection(ls1, ls2, ml); for (int i = 0; i < ml.size(); i++) { for (int j = 0; j < ml[i].size(); j++) { ASSERT_EQ(2U, ml[i][j].get<0>()); ASSERT_EQ(2U, ml[i][j].get<1>()); } } ObCartesianLinearring outer_ring1(0, allocator); outer_ring1.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); outer_ring1.push_back(ObWkbGeomInnerPoint(10.0, 0.0)); outer_ring1.push_back(ObWkbGeomInnerPoint(10.0, 10.0)); outer_ring1.push_back(ObWkbGeomInnerPoint(0.0, 10.0)); outer_ring1.push_back(ObWkbGeomInnerPoint(0.0, 0.0)); ObCartesianPolygon py1(0, allocator); py1.push_back(outer_ring1); ObCartesianLinearring outer_ring2(0, allocator); outer_ring2.push_back(ObWkbGeomInnerPoint(5.0, 0.0)); outer_ring2.push_back(ObWkbGeomInnerPoint(15.0, 0.0)); outer_ring2.push_back(ObWkbGeomInnerPoint(15.0, 10.0)); outer_ring2.push_back(ObWkbGeomInnerPoint(5.0, 10.0)); outer_ring2.push_back(ObWkbGeomInnerPoint(5.0, 0.0)); ObCartesianPolygon py2(0, allocator); py2.push_back(outer_ring2); ObCartesianMultipolygon mpy(0, allocator); bool d1 = bg::intersection(py1, py2, mpy); ASSERT_EQ(1U, mpy.size()); ASSERT_EQ(1U, mpy[0].size()); int i = 0; BOOST_FOREACH(ObCartesianPolygon const& p, mpy) { std::cout << i++ << ": " << boost::geometry::area(p) << std::endl; } } } // namespace common } // namespace oceanbase int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }