You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用boost::within判断多边形完全包含关系结果异常求助

问题解决方案

该异常结果不是库本身的bug,是使用流程不符合Boost.Geometry的前置要求导致的:
boost::geometry::model::polygon 有严格的拓扑规范要求,包括顶点环绕方向、边界闭合性都会直接影响空间关系判定结果,不符合规范的多边形会导致库将外部区域识别为内部区域,因此出现可视化结果和接口返回值不符的问题。

修复方法

在使用read_wkt读取多边形数据后,调用boost::geometry::correct()函数对多边形做拓扑修正即可,修正后的代码如下:

#include <iostream>
#include <string>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>

int main()
{
    typedef boost::geometry::model::d2::point_xy<double> point_type;
    typedef boost::geometry::model::polygon<point_type> polygon_type;

    polygon_type poly;
    boost::geometry::read_wkt(
            "POLYGON((76.00000000 430.00000000,63.00000000 430.00000000,63.00000000 441.00000000,64.00000000 441.00000000,64.00000000 448.00000000,65.00000000 448.00000000,65.00000000 462.00000000,64.00000000 464.90909091,64.00000000 466.00000000,46.66666667 518.00000000,47.00000000 518.00000000,47.00000000 519.00000000,48.00000000 519.00000000,48.00000000 520.00000000,49.00000000 520.00000000,49.00000000 521.00000000,50.00000000 521.00000000,50.00000000 522.00000000,51.00000000 522.00000000,51.00000000 524.00000000,52.00000000 524.00000000,52.00000000 524.80000000,56.00000000 509.00000000,56.75641026 509.00000000,57.00000000 508.00000000,58.66666667 508.00000000,74.00000000 439.00000000,74.50000000 439.00000000,75.00000000 436.00000000,76.00000000 436.00000000,76.00000000 430.00000000))"
            ,poly);
    boost::geometry::correct(poly); // 新增拓扑修正代码

    polygon_type poly2;
    boost::geometry::read_wkt(
            "POLYGON((72.00000000 448.00000000,72.00000000 456.00000000,80.00000000 456.00000000,80.00000000 448.00000000,72.00000000 448.00000000))",
            poly2);
    boost::geometry::correct(poly2); // 新增拓扑修正代码

    std::cout << "within: " << (boost::geometry::within(poly2, poly) ? "yes" : "no") << std::endl;
    std::cout << "covered by: " << (boost::geometry::covered_by(poly2, poly) ? "yes" : "no") << std::endl;

    return 0;
}

correct函数会自动完成以下修正操作:

  • 调整多边形外边界顶点环绕方向为库默认要求的方向
  • 自动闭合未完全闭合的多边形边界
  • 调整多边形内部孔洞的环绕方向为外边界的反方向
    修正后两个接口都会返回no,与可视化结果一致。

内容的提问来源于stack exchange,提问作者PleaseHelpppp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:18:02