NetTopology 'found non-noded intersection' 确定两个特定几何图形之间的差异时出现异常

NetTopology 'found non-noded intersection' Exception when determining the difference between two specific geometries

在 C# 中使用 NetTopology,我在确定两个特定几何图形之间的差异时遇到 'found non-noded intersection' 异常。

这些几何图形是使用 CascadedPolygonUnion.UnionIntersectionDifference 等多个例程的结果。

在某些时候,我们有一个MultiPolygon,我们想从中切出另一个几何体(Polygon):

我们使用此代码尝试切断 'red' 多边形:

Geometry difference = multiPolygon.Difference(geometryToRemove);

但随后我们收到 NetTopologySuite.Geometries.TopologyException 消息:

found non-noded intersection between LINESTRING (240173.28029999882 493556.2806000002, 240173.28177031482 493556.28131837514) and LINESTRING (240173.28176154062 493556.2813140882, 240173.28176153247 493556.2813140842) [ (240173.28176153894, 493556.2813140874) ]

我也在 NetTopologySuite Discussuion forum 中问了这个问题,因为我们接近发布日期,我希望有人能提供一些额外的见解(关于解决方法的想法),因为这看起来像是 de 中的错误库,因为多边形本身似乎有效。

有关多边形的数据 can be found here - 我们使用 'RDNew' 数据执行 Difference 操作,但我还添加了这些多边形的 WGS84 版本以便能够查看他们在 geojson.io.

等工具中

感谢图书馆的一位维护者,我得到了答案。

基本上,我需要升级到 2.2 版(我一开始已经这样做了,看看这是否能解决问题)。

但其次,我需要配置应用程序以使用 - 在 2.2 版中引入 - 'NextGen' 覆盖生成器,默认情况下未打开。

要使用 'Next Gen' 覆盖生成器,请在应用程序的某个启动点添加以下代码:

var curInstance = NetTopologySuite.NtsGeometryServices.Instance;
NetTopologySuite.NtsGeometryServices.Instance = new NetTopologySuite.NtsGeometryServices(
    curInstance.DefaultCoordinateSequenceFactory,
    curInstance.DefaultPrecisionModel,
    curInstance.DefaultSRID,
    GeometryOverlay.NG, // RH: use 'Next Gen' overlay generator
    curInstance.CoordinateEqualityComparer);

我使用 NtsGeometryServices 的当前实例来获取和重用其他可配置部分的当前默认实例。 但是你可以自由地创建所需部分的新实例(就像在 https://github.com/NetTopologySuite/NetTopologySuite/discussions/530#discussioncomment-888410 的原始 post 中提到的那样)

也有可能将两个叠加生成器并排使用(在原始 post 中也提到过),但我从未尝试过,因为我们将使用 'NextGen' 版本整个应用程序。