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.Union
、Intersection
和 Difference
等多个例程的结果。
在某些时候,我们有一个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' 版本整个应用程序。
在 C# 中使用 NetTopology,我在确定两个特定几何图形之间的差异时遇到 'found non-noded intersection' 异常。
这些几何图形是使用 CascadedPolygonUnion.Union
、Intersection
和 Difference
等多个例程的结果。
在某些时候,我们有一个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' 版本整个应用程序。