1. 矿体边界线自相交的识别与修复

问题定位:单条边界线中的自相交环

矿体边界线在数字化或格式转换后,常出现同一条线自身交叉的情况,形成“8”字形或小环。这类自相交会让后续构面失败或产生面积异常。识别时先看线的节点序列:若某段线在非端点处与自身相交,交点处会形成两个方向相反的穿越,环内面积在构面时可能被重复计算或抵消。

以一条示例边界线为例,其节点序列为:P0(0,0) → P1(40,0) → P2(40,30) → P3(10,30) → P4(10,10) → P5(30,10) → P6(30,20) → P7(20,20) → P8(20,-10) → P9(0,-10) → 回到 P0。其中 P4→P5→P6→P7 段与 P8→P9 段发生交叉,形成自相交环。拓扑检查工具会在交点处报告“自相交(Self-Intersection)”错误,并给出交点坐标。

自相交边界线 → 打断节点 → 重构简单闭合环 修复前:自相交环 交点 X 构面失败 / 面积异常 打断 修复后:简单闭合环 打断点 面积偏差 ≤ 容差

修复操作:节点打断与线段重构

修复的核心是在交点处把一条线打断为两条,再按正确拓扑顺序重新连接,消除自相交。以下以 Python + Shapely 为例,给出可运行的修复流程。示例数据即上文节点序列,容差设为 0.5(与坐标单位一致)。

from shapely.geometry import LineString, Polygon
from shapely.ops import polygonize, unary_union

# 原始自相交边界线(示例数据)
coords = [(0,0),(40,0),(40,30),(10,30),(10,10),(30,10),
          (30,20),(20,20),(20,-10),(0,-10),(0,0)]
line = LineString(coords)

# 1) 检查自相交
print("is_simple:", line.is_simple)          # False
print("is_ring:", line.is_ring)              # True(首尾闭合但自相交)

# 2) 用 polygonize 从线中提取所有闭合环
rings = list(polygonize(unary_union(line)))
print("环数量:", len(rings))                 # 2(外环 + 自相交小环)

# 3) 取面积最大的环作为矿体边界,丢弃自相交小环
rings_sorted = sorted(rings, key=lambda p: p.area, reverse=True)
fixed = rings_sorted[0]
print("修复后面积:", fixed.area)
print("修复后是否简单:", fixed.exterior.is_simple)  # True

# 4) 面积偏差校验
orig_area = Polygon(coords).area  # 注意:自相交多边形面积不可靠,仅作参考
print("原始参考面积:", orig_area)
print("偏差:", abs(fixed.area - orig_area))

运行后 is_simple 为 False,说明存在自相交;polygonize 会返回两个环,面积最大的环即正确的外边界,小环为自相交产生的伪环,应剔除。修复后 exterior.is_simple 为 True,面积偏差应小于设定容差(本例建议容差取原始面积的 1%)。

若 polygonize 返回的环数量大于 2,说明存在多个自相交点,应逐个检查交点并确认哪些小环属于伪环。可用 line.intersection(line) 定位所有自交点坐标。

验证与判断依据

检查项修复前修复后通过条件
is_simpleFalseTrue必须为 True
环数量21仅保留外环
面积偏差—≤ 1%在容差内
闭合性首尾重合首尾重合is_ring 为 True

面积偏差的判断需注意:自相交多边形的面积本身不可靠,因此“原始面积”应取修复前外轮廓的近似面积或人工确认的参考面积。若偏差超限,说明打断点选择或环取舍有误,应回到交点定位步骤重新核对。