我有以下wtk:
POLYGON((0 0, 10 0, 10 11, 11 10, 0 10))
在boost::geometry中,我们可以使用
boost::geometry::dsv(polygon," "," "," ");
如何将postgis st_makevalid函数应用于boost::geometry多边形?
我想大概是:
#include "libpq/libpq-fs.h"
#include "../libpq-fe.h"
.
.
.
std::string geom = "POLYGON" + boost::geometry::dsv(multipoly," "," "," ");
res = PQexecParams(conn, "SELECT st_makevalid(geom) FROM ....
我不想连接到数据库,我只想用postgis函数st_makevalid修复多边形或多多边形。
最佳答案
我怀疑你这次行动需要邮政总局。
我也怀疑是否有办法“使它有效”。因为多边形有一个清晰的自相交:
下面是如何在Boost几何体中进行验证和校正的:
Live On Coliru
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/io/io.hpp>
#include <boost/geometry/algorithms/equals.hpp>
#include <iostream>
namespace bg = boost::geometry;
namespace bgm = boost::geometry::model;
template<typename G>
bool check(G const& g) {
std::string reason;
bool valid = bg::is_valid(g, reason);
if (valid) std::cout << "Valid (dsv): " << bg::dsv(g) << "\n";
else std::cout << "Invalid: " << reason << "\n";
return valid;
}
int main() {
using pt = bgm::d2::point_xy<double>;
using poly = bgm::polygon<pt>;
poly p;
bg::read_wkt("POLYGON((0 0, 10 0, 10 11, 11 10, 0 10))", p);
while (!check(p)) {
auto same = p;
bg::correct(p);
if (bg::equals(p, same)) {
std::cout << "Out of ideas\n";
break;
}
}
}
并注意输出:
Invalid: Geometry is defined as closed but is open
Invalid: Geometry has invalid self-intersections. A self-intersection point was found at (10, 10); method: i; operations: u/i; segment IDs {source, multi, ring, segment}: {0, -1, -1, 1}/{0, -1, -1, 3}
Out of ideas
如果你的源代码真的包含了这样的自交集,很难说出你想要什么。也许你想看看
Split Self intersecting Polygon into non self intersecting polygon
Area of self-intersecting polygon