1

我有多边形:

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 说它是有效的。
但是当我试图用 NTE 阅读它时,它说它是无效的。这是简单的代码:

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 t = initialGeometry.IsValid;

我试图“玩”PrecisionModels 但没有结果。有什么建议吗?

4

2 回答 2

2

您需要IsValidOp明确使用并设置SelfTouchingRingFormingHoleValid = true

var ivo = new NetTopologySuite.Operation.Valid.IsValidOp(initialGeometry);
ivo.SelfTouchingRingFormingHoleValid = true;
bool t = ivo.IsValid;

您的多边形只有一个环定义壳和孔,而不是单独的。要使其在 NTS 中有效,多边形的 WKT 将是

POLYGON ((0 0, 0 2, 2 2, 2 0, 1 0.1, 0 0), (1 0.1, 1.5 0.5, 1 1, 1 0.1), 
         (1 1, 1.5 1, 1.5 1.5, 1 1), (1 1, 0.5 1.5, 0.5 1, 1 1))
于 2021-11-16T07:23:46.503 回答
0

您是否按照https://github.com/NetTopologySuite/NetTopologySuite/wiki/GettingStarted尝试过“Buffer0”黑客攻击。今天晚上我遇到了类似的问题,并在我为我的案例解决它时发现了这个问题。

注意:有时您会遇到无效的几何图形(Geometry.IsValid == false)。这些将在进一步处理它们时引起问题。在大多数情况下,您将能够使用 Buffer0 技巧解决此问题:

geom = geom.Buffer(0);

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 NetTopologySuite.IO.WKTReader();
var initialGeometry = wktReader2.Read(wkt);
var t = initialGeometry.IsValid;
_logger.LogInformation(t.ToString());        // False

var t2 = initialGeometry.Buffer(0).IsValid;
_logger.LogInformation(t2.ToString());       // True
于 2021-11-19T08:05:27.127 回答