确定两个特定几何形状之间的差异时,NetTopology“发现非节点交集”异常

问题描述

在 C# 中使用 NetTopology 时,我在确定两个特定几何形状之间的差异时遇到“发现非节点交集”异常。

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

在某些时候,我们有一个 Multipolygon,我们想从中切出另一个几何图形 (polygon):

image

我们使用此代码尝试切断“红色”多边形:

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 中问了这个问题,因为我们接近发布日期,我希望有人可以提供一些额外的见解(解决方法的想法),因为这看起来像是库中的错误,因为多边形本身似乎有效。

关于多边形 can be found here 的数据 - 我们使用“RDNew”数据来执行 Difference 操作,但我还添加了这些多边形的 wgs84 版本,以便能够在类似工具中查看它们geojson.io.

解决方法

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

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

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

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

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

的原始帖子中所述

也可以同时使用两个叠加生成器(在原帖中也提到过),但我从未尝试过,因为我们将在整个应用程序中使用“NextGen”版本。