NetTopologySuite判定多边形无效但SQL Server 2017判定有效如何解决
你提供的多边形WKT如下:
polygon((0 0, 1 0.1, 1 1, 0.5 1, 0.5 1.5, 1 1, 1.5 1.5, 1.5 1, 1 1, 1.5 0.5, 1 0.1, 2 0, 2 2,0 2, 0 0))
对应的几何图形:
有效性判定差异原因
- SQL Server 2017的几何类型采用自定义有效性规则,允许多边形环自交、节点重复等不符合OGC标准的结构,因此会判定该多边形有效。
- NetTopologySuite(NTS)默认严格遵循OGC简单要素访问规范,要求多边形外环不能自相交、节点不能异常重合,该多边形的环多次穿过
(1,1)点存在自交,因此会被判定为无效。
可行解决方法
方法1:使用GeometryFixer工具修复(优先推荐)
NTS内置的GeometryFixer类专门用于处理无效几何,会在尽可能保留原有几何面积、边界特征的前提下,将无效几何转换为符合OGC标准的有效几何,自交多边形通常会被修复为MultiPolygon或调整拓扑后的合法Polygon。
代码示例:
var wkt = @"polygon((0 0, 1 0.1, 1 1, 0.5 1, 0.5 1.5, 1 1, 1.5 1.5, 1.5 1, 1 1, 1.5 0.5, 1 0.1, 2 0, 2 2,0 2, 0 0))"; var wktReader2 = new WKTReader(); var initialGeometry = wktReader2.Read(wkt); // 执行几何修复 var fixedGeometry = NetTopologySuite.Geometries.Utilities.GeometryFixer.Fix(initialGeometry); var isValid = fixedGeometry.IsValid; // 修复后返回true
方法2:使用Buffer(0)技巧修复
简单场景下可以通过调用Buffer(0)的方式修复自交几何,该方法通过缓冲区计算自动合并自交区域,返回有效几何:
var fixedGeometry = initialGeometry.Buffer(0);
注意:该方法依赖缓冲区计算,极端精度场景下可能出现微小的边界偏差,优先选择方法1。
方法3:适配SQL Server逻辑的特殊处理
如果需要完全对齐SQL Server的有效性判定逻辑,可以在读取WKT后跳过NTS默认的有效性检查,仅在需要执行空间计算前再执行修复操作即可。
内容的提问来源于stack exchange,提问作者Kliver Max
相关产品推荐
相关产品推荐

