我从您的问题中发现了 some fine points of confusion,但让我们将闪光灯照射到解决方案的(路径)上:
Boost Geometry 有一个 Box 的概念,可以直接使用:
double minX = 394702.91392588202, minY = 6432746.6604581000,
maxX = 403253.65448691702, maxY = 6439166.297510559;
box b{{minX, minY}, {maxX, maxY}};
std::cout << bg::wkt(b) << "\n";
打印出来的
POLYGON((394703 6.43275e+06,394703 6.43917e+06,403254 6.43917e+06,403254 6.43
275e+06,394703 6.43275e+06))
请注意,多边形以起点为终点,以满足概念要求。另请注意,外圈处于特定方向。如果您的盒子的角点混淆了,您可以使用bg::correct 对环进行正确排序。
现在,如果您必须将其设置为多边形,您可以通过多种方式实现。显然,从 WKT 读取是最灵活的,但效率不高。
分配
我建议这样做,因为它比手动调整坐标相对有效且不易出错。如果b 仍然是上面的box:
polygon a;
bg::assign(a, b);
std::cout << bg::wkt(a) << "\n";
这与盒子的打印结果相同。
构造
polygon a{{
{minX, minY},
{minX, maxY},
{maxX, maxY},
{maxX, minY},
{minX, minY}, // closed
}};
std::cout << bg::wkt(a) << "\n";
同样,打印相同。另外,再次注意对点进行排序并关闭多边形!
分配点
使用库原语:
polygon a;
bg::assign_points(a,
std::vector{
point{minX, minY},
{minX, maxY},
{maxX, maxY},
{maxX, minY},
{minX, minY}, // closed
});
使用直接模型实现:
polygon a;
a.outer() = {
{minX, minY}, {minX, maxY}, {maxX, maxY},
{maxX, minY}, {minX, minY}, // closed
};
请注意,在后一种情况下,维护模型不变量/一致性取决于您(例如处理任何现有的内环)。
转换
当点类型不匹配时,使用bg::convert(from, to) 而不是bg::assign(to, from)。请注意,这是进行技术转换,而不是坐标系投影或类似的东西。
现场演示
结合以上信息的列表:
Live On Coliru
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <iostream>
namespace bg = boost::geometry;
namespace bgm = bg::model;
using point = bgm::d2::point_xy<double>;
using polygon = bgm::polygon<point>;
using box = bgm::box<point>;
int main()
{
double minX = 394702.91392588202, minY = 6432746.6604581000,
maxX = 403253.65448691702, maxY = 6439166.297510559;
box b{{minX, minY}, {maxX, maxY}};
std::cout << bg::wkt(b) << "\n";
polygon a;
bg::assign_points(a,
std::vector{
point{minX, minY},
{minX, maxY},
{maxX, maxY},
{maxX, minY},
{minX, minY}, // closed
});
a.outer() = {
{minX, minY}, {minX, maxY}, {maxX, maxY},
{maxX, minY}, {minX, minY}, // closed
};
bg::assign(a, b);
bg::convert(b, a);
std::cout << bg::wkt(a) << "\n";
std::string validity_reason;
bool valid = bg::is_valid(a, validity_reason);
std::cout << "Assigned points: " << validity_reason << "\n";
if (!valid)
{
bg::correct(a);
std::cout << "Corrected: " << bg::wkt(a) << "\n";
}
}
打印
POLYGON((394703 6.43275e+06,394703 6.43917e+06,403254 6.43917e+06,403254 6.43275e+06,394703 6.43275e+06))
POLYGON((394703 6.43275e+06,394703 6.43917e+06,403254 6.43917e+06,403254 6.43275e+06,394703 6.43275e+06))
Assigned points: Geometry is valid