id summary reporter owner description type status milestone component version severity resolution keywords cc 11725 union_ fails to create holes jan.kleemann@… Barend Gehrels "When uniting 2 polygons union_ does not create holes when it can also express the resulting polygon as a single ring, even if that ring has self-tangencies, which makes the polygon invalid. The following code {{{ typedef double FloatType; typedef model::d2::point_xy Point; typedef model::polygon Polygon; typedef model::multi_polygon MultiPolygon; typedef model::ring Ring; typedef model::box Box; typedef model::linestring LineString; int main(int argc, char *argv[]) { using namespace std; Polygon p1, p2; boost::geometry::read_wkt(""POLYGON((0 0, 0 1, 3 1, 3 0, 0 0))"", p1); boost::geometry::read_wkt(""POLYGON((0 1, 0 3, 3 3, 3 1, 2 2, 1 2 , 1 1, 0 1))"", p2); boost::geometry::correct(p1); boost::geometry::correct(p2); MultiPolygon p3; boost::geometry::union_(p1, p2, p3); boost::geometry::correct(p3); cout << ""p1: "" << boost::geometry::wkt(p1) << endl; cout << ""p2: "" << boost::geometry::wkt(p2) << endl; cout << ""p3: "" << boost::geometry::wkt(p3) << endl; cout << ""is_simple(p1): "" << boost::geometry::is_simple(p1) << endl; cout << ""is_simple(p2): "" << boost::geometry::is_simple(p2) << endl; cout << ""is_simple(p3): "" << boost::geometry::is_simple(p3) << endl; cout << ""is_valid(p1): "" << boost::geometry::is_valid(p1) << endl; cout << ""is_valid(p2): "" << boost::geometry::is_valid(p2) << endl; cout << ""is_valid(p3): "" << boost::geometry::is_valid(p3) << endl; return 0; } }}} has the output {{{ p1: POLYGON((0 0,0 1,3 1,3 0,0 0)) p2: POLYGON((0 1,0 3,3 3,3 1,2 2,1 2,1 1,0 1)) p3: MULTIPOLYGON(((0 1,0 3,3 3,3 1,2 2,1 2,1 1,3 1,3 0,0 0,0 1))) is_simple(p1): 1 is_simple(p2): 1 is_simple(p3): 1 is_valid(p1): 1 is_valid(p2): 1 is_valid(p3): 0 }}} but p3 should be {{{ MULTIPOLYGON(((0 1,0 3,3 3,3 0,0 0,0 1),(3 1,2 2,1 2,1 1,3 1))) }}} " Bugs closed Boost 1.61.0 geometry Boost 1.59.0 Problem fixed