JTS中Delaunay三角剖分异常求助:区域遗漏与凸角查找失败
JTS多边形三角剖分问题解决方案
问题1:带洞多边形三角剖分遗漏区域
DelaunayTriangulationBuilder是基于原始点集做三角剖分,不会自动识别多边形的边界约束(包括洞的边界),所以会出现区域遗漏的情况。解决步骤:
- 提取多边形的所有顶点(外环+所有内环)作为sites传入构建器
- 改用
ConstrainedDelaunayTriangulator替代基础构建器,将多边形的外环边、内环边全部添加为约束边 - 剖分完成后,用原多边形对生成的三角网格做裁剪,只保留落在多边形内部的三角形
- 前置检查:确保原多边形是有效拓扑(无自交、重复顶点),可通过
Geometry#isValid()验证,无效的话先用Geometry#buffer(0)修复
问题2:复杂多边形抛出IllegalStateException(提示“Unable to find a convex corner”)
这个异常是JTS内部耳切三角剖分算法陷入死循环导致的,根源是多边形拓扑存在问题:
- 重复/重合顶点:顶点列表中有大量重复坐标,导致算法无法识别凸角
- 自交多边形:多边形边界自身交叉,破坏拓扑结构
- 极小几何特征:存在非常小的尖刺、重合边,使得算法无法找到合法凸角
解决方法:
- 先修复多边形有效性:调用
yourPolygon.buffer(0),该操作会自动修复自交、合并重合顶点 - 简化顶点:用
SimplifyOp.simplify(yourPolygon, tolerance)(tolerance设为合适精度,比如0.001)去掉冗余的近似重合顶点 - 检查顶点顺序:确保外环是逆时针,内环是顺时针(JTS标准拓扑要求),可通过
LinearRing#isCCW()验证,不符合的话调用LinearRing.reverse()调整 - 替换剖分实现:如果上述修复后仍有问题,尝试使用
PolygonTriangulator类,它对复杂多边形的兼容性更好
代码示例片段
// 修复多边形有效性 Geometry validPolygon = invalidPolygon.buffer(0); // 提取所有顶点 Coordinate[] allCoords = validPolygon.getCoordinates(); // 构建约束Delaunay三角剖分 ConstrainedDelaunayTriangulator triangulator = new ConstrainedDelaunayTriangulator(allCoords); // 添加所有约束边(外环+内环) List<LineString> constraints = new ArrayList<>(); if (validPolygon instanceof Polygon poly) { constraints.add(poly.getExteriorRing()); for (int i = 0; i < poly.getNumInteriorRing(); i++) { constraints.add(poly.getInteriorRingN(i)); } } triangulator.setConstraints(constraints); triangulator.compute(); // 获取三角网格并裁剪 Geometry triangles = triangulator.getTriangles(validPolygon.getFactory()); Geometry clippedTriangles = validPolygon.intersection(triangles);
内容的提问来源于stack exchange,提问作者Sunil Chormale
相关产品推荐
相关产品推荐

