几何错误常存在于shapefile以及存储在个人地理数据库或文件地理数据库的要素类,而当数据不满足ArcGIS的规范时,就会遇到各种无响应和奔溃。

几何错误通常有:(查看原帮助文档)

1、短线段-有些线段短于与几何关联的控件参考的系统单位所允许的长度。

2、空几何 - 该要素不具有几何或则SHAPE字段为空

3、不正确的环走向-面的拓扑结构比较简单,但是面的环可能没有正确地定向(外环-顺时针,内环-逆时针)。

4、不正确的线段走向-各条线段的定向不一致。线段i的“末”点应该与线段i+1的“始”点相接。

5、自相交-面无法与自身相交

6、非闭合环-环中最后一条线段的“末”点必须与第一条线段的“始”点相接。

7、空的部分-几何具有多个部分,其中一个部分为空(没有几何)。

8、重复折点-几何的两个或多个折点坐标相同

9、不匹配的属性-某线段端点的Z坐标或M坐标与下一条线段中与之重合的端点的Z坐标或M坐标不匹配。

10、不连续部分-几何的某部分由断开的或不连续的部分组成。

11、空的Z值-几何的一个或多个折点Z值为空(例如,NaN)

对与点要素,只会存在空几何问题。

检查几何错误:

上述提到的几何错误都能使用ArcGIS自带的工具查找出来。位于“Data Management Tools ——要素——检查几何”。检查后要素的几何错误会以表的形式输出。那么几何错误检查出来了,下面就是如何修复几何。

修复几何错误:

执行ArcGIS工具“修复几何”就可以。

位于“Data Management Tools ——要素——修复几何”。

执行Python脚本

# -*-coding:utf-8-*-

import arcpy

from arcpy import env

import time

# 实现功能:修复几何

try:

source_path = "F:/GIS测试数据/测试.gdb"

in_features = "NXF"

start_time = time.time()

env.workspace = source_path

arcpy.RepairGeometry_management(in_features, "DELETE_NULL")

arcpy.AddMessage("RepairGeometry Time:{0}s".format(time.time() - start_time))

except Exception, e:

print e.message

AE实现,主要使用ITopologicalOperator2、IPolygon4、IPolyline5和IPolyline6接口

在执行修复几何之前要先查看 ITopologicalOperator::IsKnownSimple的值,如果为true则不进行修复。

1、ITopologicalOperator.Simplify方法:

描述

简化永久改变输入几何,使其定义在几何类型方面“拓扑合法:

①对于Points,Simplify什么都不做。点对其坐标值没有约束。

②对于Multipoints,Simplify将所有X,Y,Z和M坐标捕捉到相关空间参考的网格,然后删除相同的点。当两个点具有相同的X和Y坐标(捕捉后),并且当它知道的属性与另一个点知道的属性相同时,一个点与另一个点相同。例如,如果两个点都是Z识别的,则Z坐标值必须相同。

③对于折线,Simplify有两种变体:平面和非平面。默认情况下,不支持M的折线以平面方式简化:所有重叠的线段都缩小为单个线段,并且线段在交叉点处分割。为连接的段序列创建输出路径。尽可能保留输入段方向,但如有必要,将重新定向路径内部的段。M-aware的折线使用非平面简化:1、保留重叠和自交叉,但删除零长度段;2、

调整线段的走向,使线段i的“末”点应该与线段i+1的“始”点相接;3、当线段不连接时创建新的paths;4、当两个paths有共同线段时融合。

④对于多边形,Simplify用于多边形的内部和外部,然后修改多边形结构以与规定一致。处理内部和外部的默认方法是:1、删除所有悬挂的段序列;2、识别最大的合法环,将它们添加到多边形的输出形式,然后将其从当前形势中删除;3、重复。如果此方法最终为您的应用程序删除了太多段,请考虑使用IPolygon4 :: SimplifyEx并将XOR参数设置为TRUE。在简化结束时,没有环会重叠,不会发生自相交(除了在某些情况下),并且通常,任意点总是可以明确地分类为多边形的外部,边界或内部。

在简化折线和多边形时,会使用几何关联空间参考的XY容差。

2、IPolygon.SimplifyPreserveFromTo 方法:

简化多边形并保留每个环的始末节点。

SimplifyPreserveFromTo简化多边形的方式与ITopologicalOperator的Simplify方法一样,但是不会将环重定位。

3、IPolyline.SimplifyNetwork方法:

删除零长度段(2维中为零),合并有共享端点的部件,重新定位线段的方向。

执行Polyline的部分简化,以确保有效网络的必要一致性,但不是真正的拓扑简单性。SimplifyNetwork对基础折线执行以下更改:

1)删除空和零长度段。

2)删除空的部分。

3)使段方向相互一致。确保连接段的以下FromPoints和前面的ToPoints相等。

4)为具有不同属性的不连续段或段创建新零件。

5)合并两个部分共享端点的部件。

6)对于共享端点的部分中的一对段,使得一个段具有NaN属性而另一个段具有非NaN属性,将1的非NaN属性分配给另一个的相应NaN。

4、IPolyline6.SimplifyNonPlanar方法:

删除零长度段(2维中为零),重新定位线段的方向。此方法类似于SimplifyNetwork,除了共享端点的部件不合并。

修复几何要素代码:只修复一次有时修复不完全

/// /// 修复几何错误

///

/// 几何对象

public static void SimplifyGeometry(IGeometry geometry)

{

if (geometry is ITopologicalOperator2 topoOp)

{

topoOp.IsKnownSimple_2 = false; //设为false

if (!topoOp.IsSimple)

{

switch (geometry.GeometryType)

{

case esriGeometryType.esriGeometryMultipoint:

{

topoOp.Simplify();

}

break;

case esriGeometryType.esriGeometryPolygon:

{

((IPolygon4)geometry).SimplifyPreserveFromTo();

}

break;

case esriGeometryType.esriGeometryPolyline:

{

if (geometry is IPolyline6 polyline6)

{

polyline6.SimplifyNonPlanar();

}

else

{

((IPolyline5)geometry).SimplifyNetwork();

}

}

break;

}

}

}

}

要素类转换:

/// /// 将源数据集符合条件的要素迁移至目标图层

///

/// 目标库数据集

/// 源数据集

/// 筛选条件

public static void FClassTransfer(IFeatureClass pTargetFClass, IFeatureClass pSourceFClass, ISpatialFilter spatialFilter)

{

DictionarydicTargetSource =FieldsTargetSource(pTargetFClass, pSourceFClass); //获取字段对应关系

long pCountToFlush = 1000;

long n = 0; //当前记录

判断目标图层是否有Z值

//bool bHasZValue = false;

//int iShapeFieldIndex = tarFClass.FindField(tarFClass.ShapeFieldName);

//if (tarFClass.Fields.Field[iShapeFieldIndex].GeometryDef.HasZ)

//{

// bHasZValue = true;

//}

using (ComReleaser comReleaser = new ComReleaser())

{

IFeatureCursor tcursor = pTargetFClass.Insert(true);

comReleaser.ManageLifetime(tcursor);

IFeatureBuffer pTargetFeatureBuffer = pTargetFClass.CreateFeatureBuffer();

comReleaser.ManageLifetime(pTargetFeatureBuffer);

IFeatureCursor scursor = pSourceFClass.Search(spatialFilter, true);

comReleaser.ManageLifetime(scursor);

IFeature pSourcFeature = null;

IGeometry pSoureGeometry = null;

//IZAware pZAware = null;

while ((pSourcFeature = scursor.NextFeature()) != null)

{

//判断要素是否为注记,这在加载CAD文件时很重要

//if (pSourceFClass.FeatureType == esriFeatureType.esriFTAnnotation)

//{

// ESRI.ArcGIS.Carto.IAnnotationFeature pAF = pSourcFeature as ESRI.ArcGIS.Carto.IAnnotationFeature;

// IAnnotationFeature pNAF = pTargetFeatureBuffer as IAnnotationFeature;

// if (pAF.Annotation != null)

// {

// pNAF.Annotation = pAF.Annotation;

// }

//}

//if (bHasZValue || pTarGeometry == null || pTarGeometry.IsEmpty)

// featureBuffer.Shape = pTarGeometry;

//else

//{

// pZAware = pTarGeometry as IZAware;

// pZAware.ZAware = false;

// featureBuffer.Shape = pTarGeometry;

//}

pSoureGeometry = pSourcFeature.ShapeCopy;

SimplifyGeometry(pSoureGeometry); //只修复一次有时修复不完全

SimplifyGeometry(pSoureGeometry);

pTargetFeatureBuffer.Shape = pSoureGeometry;

foreach (var it in dicTargetSource)

{

pTargetFeatureBuffer.Value[it.Key] = pSourcFeature.Value[it.Value];

}

tcursor.InsertFeature(pTargetFeatureBuffer);

n = n + 1;

if (n % pCountToFlush == 0)

{

tcursor.Flush();

Console.WriteLine($"数量{n},时间{DateTime.Now}");

}

}

tcursor.Flush();

}

}

/// /// 获取索引字典 key:targetField value:sourceField

///

/// 目标数据集

/// 源数据集

///

public static DictionaryFieldsTargetSource(IFeatureClass target, IFeatureClass source)

{

Dictionarytargetsource = new Dictionary();

var fldName = string.Empty;

for (int i = 0; i < target.Fields.FieldCount; i++)

{

IField tField = target.Fields.get_Field(i);

//目标图层的字段必须为可编辑并且不是必须字段

if (!tField.Required && tField.Editable)

{

fldName = tField.Name;

int idx = source.Fields.FindField(fldName);

if (idx > -1) //源要素类中该字段存在

targetsource.Add(i, idx);

}

}

return targetsource;

}

arcgis几何修复有作用吗_ArcGIS修复几何错误相关推荐

  1. arcgis几何修复有作用吗_ArcGis拓扑的那些事儿(拓扑应用过程二)

    上一篇呢我写了拓扑完整的建立过程,这篇我讲一下拓扑面要素的修改方法(这次使用的数据就不给大家共享啦).下一篇小编会讲关于线要素拓扑的具体方法与注意事项!希望大家持续关注! 这里呢,在多说一下这个拓扑中 ...

  2. arcgis几何修复有作用吗_ARCGIS几何修复使用技巧

    ARCGIS 几何修复问题 最近处理数据, 是将一些分幅的数据进行拼接,很多要素被分成了一段一段的.于是, 采用 Arcmap 中的 merge 工具进行合并,但是,在用 merge 工具合并一些同类 ...

  3. arcgis几何修复有作用吗_修复损坏的 shapefile

    一.SHP文件 Shapefile文件(简称SHP)作为ESRI一种经典的数据格式,被很多其他软件所支持,如CAD.MapGIS等,虽然也有一些限制(如无法进行拓扑分析.字段长度为10个字符等),但其 ...

  4. pla3d打印材料密度_口腔修复体制作用3D打印金属粉末的成型工艺与性能控制要点概述...

    在传统口腔修复体的制作过程中,制作工艺繁琐,制作周期长,加工过程中依赖人力操作,金属材料在制作过程中易发生变形,难以控制尺寸精度,使患者舒适度下降.而采用3D打印技术生产的修复体可根据患者自身进行定制 ...

  5. 快捷方式修复_Mac上的屏幕截图不起作用该如何修复?

    屏幕截图是Mac提供的内置功能,很少有它不起作用.但是由于某些意外的设置或硬件问题,Mac上的屏幕截图有时无法正常工作,这里提供的是Mac上的屏幕截图不起作用该如何修复? 1.在Mac上启用屏幕快照快 ...

  6. 科普nmn对骨头修复的作用,nmn的品牌推荐,健康答案!

    科普nmn对骨头修复的作用,nmn的品牌推荐,健康答案! 科普nmn对骨头修复的作用,nmn的品牌推荐,健康答案! 科普nmn对骨头修复的作用,nmn的品牌推荐,今年3月,四川大学研究人员在<干 ...

  7. android热补丁作用,Android热修复之 - 阿里开源的热补丁

    这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...

  8. 热修复系列之一----Android 热修复原理篇及几大方案比较

    热修复说白了就是"即时无感打补丁",比如你们公司上线一个app,用户反应有重大bug,需要紧急修复.2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也 ...

  9. linux7.0修复磁盘命令,RHEL7系统修复rm -rf /boot /etc/fstab

    导读 RHEL7/Centos7系统发布这么长时间了,大家都知道这个系统的一个特点就是用systemctl代替了init系统守护进程,系统越来越模块化了.在新版的系统中许多的命令也发生了改变,grub ...

最新文章

  1. 关于如何在MyEclipse下修改项目名包名,以及类
  2. 【Android 逆向】Android 系统文件分析 ( Android 系统 root 环境准备 | 查看 Android 根目录信息 )
  3. spring整合redis缓存
  4. mysql死锁和索引的关系_奇怪的mysql死锁,当有外键索引的时候,会需要请求对关联表的锁吗?...
  5. 前沿 | 加州理工大学什么是Imitation Learning(模仿学习)
  6. 简述解释型和编译型编程语言?
  7. 树莓派升级Linux内核,树莓派编译升级内核
  8. [LUOGU] P1111 修复公路
  9. tomcat/redis/dubbo/netty
  10. 静态代理和动态代理的区别,什么场景使用?
  11. 屏幕快照之旅:Android 4.2 Jelly Bean的10个新功能
  12. WinRAR 设置默认密码
  13. NSA方程式泄漏工具包浅析
  14. 赵小楼《天道》《遥远的救世主》深度解析(4)从肖亚文引申怎么看待随缘、惜缘、攀缘这三种缘?
  15. 2月28日,鸿蒙群友见面会活动回顾
  16. FPGA实现JPEG-LS图像压缩,有损无损可配置,提供工程源码和技术支持
  17. php之连接mssql(sql server)新手教程
  18. Nginx学习心得总结第一章
  19. 【Simulink教程案例13】基于QPSK的位同步simulink建模与仿真分析
  20. 找不到Microsoft Access Driver(*.mdb)ODBC驱动程序的安装例程。请重新安装驱动

热门文章

  1. 来自优达学城毕业生和导师的学习建议
  2. Udacity优达学城优惠码 5641874B 立减320元
  3. windows环境elasticsearch设置登录用户名、密码
  4. tinymce编辑器增加多图上传、百度地图功能以及高级功能格式刷演示
  5. iPhone4s降级ios6.1.3流程总结
  6. python串口stm32_Python 实现Serial 与STM32J进行串口通讯
  7. 【C 语言实现51单片机计时器】
  8. java 后端开发技能_Java 后端开发,应该重点学习哪些知识/技能?
  9. Linux i2ctool 工具的使用方法
  10. 高数一上集合与映射思维导图,继续冲冲冲