关于c ++:boost :: geometry :: union没有结果

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;
}

当我绘制两个多边形时,我得到了:enter image description here

但是上面的代码的结果是:

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) <<"\
"
;
    }
}