c# - 确定两个特定几何形状之间的差异时,NetTopology 'found non-noded intersection' 异常
问题描述
在 C# 中使用 NetTopology 在确定两个特定几何形状之间的差异时,我得到一个“找到的非节点交集”异常。
这些几何图形是使用几个例程(如CascadedPolygonUnion.Union
、Intersection
和)的结果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 等工具中查看它们。
解决方案
感谢图书馆的一位维护者,我得到了答案。
基本上,我需要升级到 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”版本。
推荐阅读
- mysql - Laravel 过滤器模型关系
- java - FINE 日志记录 org.postgresql.jdbc.PgConnection setAutoCommit = false
- security - 将 Power BI Desktop 连接到 Azure SQL 的最安全方式
- c# - C#:如何从 Sharepoint Teamsite 站点下载和上传文件
- java - 许多错误尝试从空对象引用上的“android.os.Handler android.view.View$AttachInfo.mHandler”字段读取
- gradle - 如何将应用的 gradle 脚本的执行推迟/延迟到构建脚本的最后一个
- arduino - 通过 ESP8266 上的 UDP 广播消息
- haskell - 在 Haskell 中的函数之间共享变量的惯用方式?
- spring-boot - 在 Spring 安全中使用证书进行相互身份验证
- node.js - 在一个 GIT 存储库中,是否可以使用 nodejs 将文件添加/提交/推送到另一个 GIT 存储库