boost::geometry::union no result
我正在尝试使用boost :: geometry :: union_合并一些多边形,但某些条目的输出向量为空。
这是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <iostream> #include <vector> #include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/polygon.hpp> #include <boost/geometry/io/wkt/wkt.hpp> #include <boost/foreach.hpp> int main() { typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon; polygon green, blue; boost::geometry::read_wkt( "POLYGON((440820.110024126 4047009.80267429, 440806.545727707 4046942.39533656, 440797.171880196 4046895.8425726, 440804.202135392 4046888.73092639, 440813.573458131 4046935.27114371, 440827.140279322 4047002.69102807))", green); boost::geometry::read_wkt( "POLYGON((440855.857887967 4046932.1248641, 440813.740724389 4046942.21109839, 440806.376538684 4046935.44583646, 440848.493702262 4046925.35960217))", blue); if(boost::geometry::area(green) < 0) boost::geometry::reverse(green); if(boost::geometry::area(blue) < 0 ) boost::geometry::reverse(blue); std::vector<polygon> output; boost::geometry::union_(green, blue, output); std::cout <<" output size is :" << output.size() << std::endl; int i = 0; std::cout <<"green || blue:" << std::endl; BOOST_FOREACH(polygon const& p, output) { std::cout << i++ <<":" << boost::geometry::area(p) << std::endl; } system("pause"); return 0; } |
当我绘制两个多边形时,我得到了:
但是上面的代码的结果是:
1 2 3 | output size is : 0 green || blue: Press any key to continue . . . |
这是此功能中的错误还是我的代码有错误?
为了提高效率,Boost Geomwetry算法假定输入为"规范化"或"规范化"。
因此,您必须确保输入的多边形为:
1 2 3 4 5 6 7 8 9 10 11 12 13 | correct(green); correct(blue); boost::geometry::union_(green, blue, output); int i = 0; for(polygon const& p: output) { std::cout << i++ <<":" << boost::geometry::area(p) <<"\ "; std::cout <<"Shape:" << dsv(p) <<"\ "; } |
印刷品:
0: 1289.08
Shape: (((440813, 4.04693e+06), (440804, 4.04689e+06), (440797, 4.0469e+06), (440807, 4.04694e+06), (440820, 4.04701e+06), (440827, 4.047e+06), (440815, 4.04694e+06), (440856, 4.04693e+06), (440848, 4.04693e+06), (440813, 4.04693e+06)))
在Coliru上实时观看
完整的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <iostream> #include <vector> #include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/polygon.hpp> #include <boost/geometry/io/wkt/wkt.hpp> #include <boost/foreach.hpp> int main() { typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon; using boost::geometry::correct; using boost::geometry::dsv; polygon green, blue; boost::geometry::read_wkt( "POLYGON((440820.110024126 4047009.80267429, 440806.545727707 4046942.39533656, 440797.171880196 4046895.8425726, 440804.202135392 4046888.73092639, 440813.573458131 4046935.27114371, 440827.140279322 4047002.69102807))", green); boost::geometry::read_wkt( "POLYGON((440855.857887967 4046932.1248641, 440813.740724389 4046942.21109839, 440806.376538684 4046935.44583646, 440848.493702262 4046925.35960217))", blue); correct(green); correct(blue); std::vector<polygon> output; boost::geometry::union_(green, blue, output); int i = 0; BOOST_FOREACH(polygon const& p, output) { std::cout << i++ <<":" << boost::geometry::area(p) <<"\ "; std::cout <<"Shape:" << dsv(p) <<"\ "; } } |