面要素的自相交检查与处理

本文探讨了面要素自相交的问题,包括其产生的原因和常见类型,并重点介绍了如何使用FME(Feature Manipulation Engine)2012和2013版本进行处理。通过GeometryOGCValidator和SelfIntersector转换器(2012版)或GeometryValidator转换器(2013版)来过滤和修复自相交错误,确保数据的有效性和一致性。

原文发布时间:2013-01-04

作者:怕冷的企鹅

自相交,在几何图形有效性验证中的一个错误类型,面要素的自相交在原始数据中是最常见的,这种错误有些可以人工发现,但有些就需要借助程序来发现。自相交若不处理,则会导致要素无法转换成指定格式(尤其是Esri的格式),或者无法完成写入库等操作。

发生自相交的根本原因情况比较多,有些是因为作图人员不小心误操作,采集要素节点的时候反复添加引起的错误;还有就是因为一些检查或处理的软件再对数据进行处理的时候设置的数据精度不同,也可能会导致自相交。

常见的自相交总结了以下几种情况,有些需要看图人员放大到一定比例尺才能看到:

1:明显的自相交面要素



2:不明显的自相交面要素



3:不明显的自相交面要素 



4:不明显的自相交面要素


总结了自相交的原因,就可以考虑相应的解决办法,处理方式各有不同,看你想要什么样的结果了?

若是处理完成后自相交的要素要求坐标没有任何变化的话,可以有两个方式:一个是打散成两个对象;另外就是更改原来的几何类型为aggregate. 一般建议采用后者,因为这样要素数量不会发生变化,而且也保证了图面与原始数据的一致性。以下就介绍了利用FME解决面自相交问题的方法。

FME Workbench2012或之前的版本

在2012版本的fme中,首先,要用转换器GeometryOGCValidator过滤出自相交的要素;然后利用SelfIntersector转换器将面自相交的要素进行处理,输出内容再通过GeometryFilter转换器将自相交处理结果中的有效要素(即面要素)过滤出来。整个过程中需要注意的是GeometryOGCValidator的参数设置,该转换器的默认参数是:Simple,我们需要检查的是几何图形的有效性,所以我们需要改成:Valid。



利用以上的流程进行处理后,结果如下:  



FME Workbench2013版本

在2013版本的fme中,原有的GeometryOGCValidator转换器和SelfIntersevtor转换器已经不存在,其功能被新增转换器GeometryValidator包含,即新增转换器GeometryValidator即可以跟踪几何图形自身的拓扑错误,也可以对某些错误进行自动纠正。若进行自动纠正参数设置如下: 


这里需要强调的是:通过此转换器处理后,有些情况需要再次进行处理,典型的情况就是第一种情况:经过处理后需要用户将这类要素过滤出来进行单独的处理,因为在2013的beta版本(小版本号13197)中,处理的结果虽然和上面利用旧版本处理的结果图面上一致,但是却不是一个带洞的多边形。所以需要用户进行聚合面的打散,然后将打散的面生动带洞的多边形。如下图:





### ArcGIS中检查和修复要素自相交的方法及工具 在ArcGIS中,可以通过特定的工具来检查和修复要素自相交问题。以下是详细的方法和工具说明: #### 1. 检查几何错误 为了检测要素中的自相交问题,可以使用 **"Check Geometry"** 工具。此工具能够识别要素中存在的几何错误,并将结果以表格形式输出[^2]。 - 具体路径为:`Toolboxes` → `System Toolboxes` → `Data Management Tools.tbx` → `Features` → `Check Geometry`。 - 输出的表中会列出所有包含几何错误的要素及其错误类型。 #### 2. 修复几何错误 一旦通过 **"Check Geometry"** 工具发现了自相交问题,可以使用 **"Repair Geometry"** 工具进行修复[^3]。 - 具体路径为:`Toolboxes` → `System Toolboxes` → `Data Management Tools.tbx` → `Features` → `Repair Geometry`。 - 此工具能够自动修复由自相交引起的几何问题,从而确保要素的拓扑完整性[^1]。 #### 3. 注意事项 尽管 **"Repair Geometry"** 工具在大多数情况下能够有效修复几何错误,但在某些复杂场景下,可能仍会出现无法完全修复的情况。例如,当要素存在严重的拓扑问题时,修复后可能会在其他GIS软件(如 GeoTools、JTS 或 PostGIS)中继续报错[^1]。此时,建议手动编辑要素或进一步分析其结构。 #### 示例代码 以下是一个简单的 Python 脚本示例,展示如何批量运行 **"Check Geometry"** 和 **"Repair Geometry"** 工具: ```python import arcpy # 输入要素类 input_feature_class = r"C:\path\to\your\feature_class.shp" # 检查几何 arcpy.CheckGeometry_management(input_feature_class, r"C:\path\to\output\geometry_errors.dbf") # 修复几何 arcpy.RepairGeometry_management(input_feature_class) ```
<think>在ArcEngine中,修复单个要素自相交问题,通常可以通过以下步骤实现: 1. 获取要素的几何对象(如IPolygon)。 2. 检查几何对象是否简单(即是否自相交),可以使用ITopologicalOperator.IsSimple属性进行检查。 3. 如果几何对象不是简单的(即存在自相交),则可以使用ITopologicalOperator.Simplify方法尝试修复。 但是,Simplify方法可能会改变几何形状,特别是对于复杂的自相交情况,可能无法完全修复。因此,我们可能需要先对几何进行边界化(Boundary),然后重新构建多边形,或者使用其他方法。 另一种方法是使用IGeometryServer2.SimplifyPolygon方法(需要GeometryServer环境),但这种方法通常用于服务端,且在桌开发中可能不直接可用。 这里我们采用ITopologicalOperator.Simplify方法。如果简化后仍然自相交,可能需要更复杂的处理,比如将多边形拆分为多个部分(如果简化后变成多部分几何),或者使用其他算法。 注意:Simplify方法会修改原始几何,并使其拓扑一致(即简单)。 步骤: 1. 获取要素的几何。 2. 将几何赋给一个拓扑操作对象(ITopologicalOperator)。 3. 调用Simplify方法。 4. 将简化后的几何设置回要素。 5. 更新要素。 但是,Simplify方法要求几何是高等级的(即已经进行了必要的几何操作准备),通常我们可以在编辑会话中进行操作。 下是一个示例代码,用于修复单个要素自相交: 注意:此代码需要在编辑会话中进行,因为我们要修改要素。 我们将编写一个函数,传入一个要素(IFeature),然后尝试修复它的自相交。 如果简化后几何变成空或者无效,我们可能需要处理异常情况。 代码示例: </think> 在ArcEngine中修复单个要素自相交问题,可以通过以下步骤实现。核心是使用`ITopologicalOperator`接口的`Simplify`方法,该方法会自动修复几何问题包括自相交: ### 解决方案代码 ```csharp using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; public void FixSelfIntersectingPolygon(IFeature feature) { // 步骤1: 获取要素的几何对象 IGeometry geometry = feature.ShapeCopy; // 步骤2: 检查是否为要素 if (geometry.GeometryType != esriGeometryType.esriGeometryPolygon) { throw new ArgumentException("要素必须是类型"); } // 步骤3: 转换为ITopologicalOperator接口 ITopologicalOperator topoOp = (ITopologicalOperator)geometry; try { // 步骤4: 修复自相交 - Simplify会自动处理 topoOp.Simplify(); // 步骤5: 更新要素几何 feature.Shape = geometry; feature.Store(); // 保存修改 } catch (Exception ex) { // 处理拓扑错误(如无法修复的复杂自相交) throw new InvalidOperationException("修复自相交失败: " + ex.Message); } } ``` ### 关键代码解释 1. **`ITopologicalOperator`接口** - ArcEngine的核心拓扑接口,提供`Simplify()`方法自动修复几何问题。 - 执行时会删除自相交、重复点等无效几何部分。 2. **`Simplify()`方法的作用** - 自动检测并修复自相交(Self-intersection) - 确保几何符合OGC简单几何规范 - 可能改变原始几何形状(如分割为多个环) 3. **编辑会话要求** 修改要素前必须启动编辑会话: ```csharp IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)feature.Class.FeatureDataset.Workspace; workspaceEdit.StartEditing(true); // 使用无版本编辑 workspaceEdit.StartEditOperation(); // 调用FixSelfIntersectingPolygon(feature) workspaceEdit.StopEditOperation(); workspaceEdit.StopEditing(true); // 提交修改 ``` ### 处理复杂自相交的进阶方法 当`Simplify()`无法修复时,可尝试边界重建: ```csharp // 替代Simplify()的进阶方案 if (!topoOp.IsSimple) { IPolygon newPolygon = new PolygonClass(); IGeometryCollection geomColl = (IGeometryCollection)newPolygon; // 获取原始边界 IPolyline boundary = topoOp.Boundary; // 用边界重建(可能丢失岛洞) IGeometryCollection boundaryParts = (IGeometryCollection)boundary; for (int i = 0; i < boundaryParts.GeometryCount; i++) { IRing ring = new RingClass(); ring.AddPointCollection((IPointCollection)boundaryParts.get_Geometry(i)); geomColl.AddGeometry(ring, ref Type.Missing, ref Type.Missing); } // 更新要素 feature.Shape = (IGeometry)newPolygon; } ``` ### 注意事项 1. **几何合法性检查** 修复后建议用`ITopologicalOperator.IsSimple`验证: ```csharp if (!((ITopologicalOperator)feature.Shape).IsSimple) { // 触发人工检查流程 } ``` 2. **性能影响** - 复杂要素(>10,000节点)可能需数秒 - 建议在后台线程执行避免UI冻结 3. **数据备份** 操作前务必备份数据,`Simplify()`可能不可逆地改变几何 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值