不能,Boost.Geometry的intersection函数仅生成相交几何对象,需额外调用area()计算面积;常见错误包括未验证输入有效性、忽略环方向(外环逆时针、内环顺时针)及未闭合多边形。

Boost.Geometry能直接算相交面积吗?
不能。Boost.Geometry的intersection函数只生成相交区域的几何对象(如多边形),不直接返回面积值。必须额外调用area函数计算——这是新手最常漏掉的一步。
常见错误现象:intersection返回空多边形却没检查是否成功,或直接打印结果对象以为就是面积。
- 务必先用
is_valid验证输入多边形有效性,无效几何体可能导致intersection静默失败 - 输出容器类型必须匹配输入:两个
polygon相交,输出得是std::vector<polygon></polygon>(可能多个不连通区域) - 若只需面积,可跳过存储中间几何体,用临时容器+
area链式调用,避免不必要的内存分配
如何正确构造带洞的多边形?
Boost.Geometry要求外环逆时针、内环(洞)顺时针,顺序反了会导致is_valid返回false,后续所有运算可能出错或结果异常。
使用场景:GIS数据导入、CAD轮廓解析、地图围栏建模。
立即学习“C++免费学习笔记(深入)”;
- 用
bg::correct自动修正环方向,但会改变原始点序——若需保持拓扑一致性(如带属性的边界线),应手动校验并翻转 - 洞必须完全位于外环内部,否则
intersection等操作可能崩溃(尤其在Debug模式下触发断言) - 构造时优先用
bg::assign_points而非逐点push_back,避免遗漏闭合点(首尾点需重合)
为什么distance计算结果和GIS软件不一致?
默认distance用笛卡尔平面距离,而QGIS/ArcGIS默认用大地坐标系(WGS84)下的测地线距离。单位不同、模型不同,数值必然差异巨大。
性能影响:测地线距离计算比平面距离慢10倍以上,且Boost.Geometry不内置椭球模型支持。
- 若输入是经纬度,必须先投影到平面坐标系(如UTM),再用
bg::distance——推荐用PROJ库做预处理 - 不要尝试用
bg::strategy::distance::haversine:它仅适用于球面近似,且要求输入为弧度,容易因单位混淆导致结果差3个数量级 - 对小范围(
编译时报错“no matching function for call to ‘intersection’”
根本原因是模板实参推导失败,常见于混合使用不同坐标类型(如int和double)、或未包含必要头文件。
最容易被忽略的细节:Boost.Geometry高度依赖ADL(Argument-Dependent Lookup),所有几何对象必须定义在boost::geometry命名空间或其关联命名空间中。
- 确保已包含
#include <boost></boost>等具体几何类型头文件,而非只含boost/geometry.hpp - 检查点类型是否统一:若用
bg::model::d2::point_xy<double></double>定义多边形,就别混用int坐标的点 - 自定义结构体需特化
bg::traits::point_type和bg::traits::coordinate_type,否则intersection无法实例化
is_valid和bg::wkt输出调试,越少陷入结果莫名为空的困境。









