首页 > 解决方案 > 确定两个特定几何形状之间的差异时,NetTopology 'found non-noded intersection' 异常

问题描述

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

这些几何图形是使用几个例程(如CascadedPolygonUnion.UnionIntersection和)的结果Difference

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

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

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

可以在此处找到有关多边形的数据- 我们使用“RDNew”数据来执行Difference操作,但我还添加了这些多边形的 WGS84 版本,以便能够在 geojson.io 等工具中查看它们。

标签: c#geometrygeospatialnettopologysuite

解决方案


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

基本上,我需要升级到 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”版本。


推荐阅读