本次Arcpy脚本工具用的是ArcGisPro2.8版本,尽量使用同一版本,其它版本可以参照。
工具介绍
本工具综合了【面要素】的拓扑检查和几何错误、多部件检查。
在ArcGis中【拓扑检查】比较麻烦,需要用到多个工具,但流程比较固定。为了节约时间和简化流程,所以写了这个工具。
在拓扑检查的基础上,还加入了【几何错误和多部件】的检查。基本上涵盖了面要素的主要错误。大大方便了对【面要素数据】的前期检查。
参数设置
参数只有2个。
1、【输入面要素】——输入要检查的面要素,过滤器里的要素类型设置成【面】。
2、【输出检查结果】——输出一个面要素,作为检查结果查看。
脚本编写
代码比较长,检查分为4个部分。
1、拓扑检查_重叠
直接调用系统工具箱的几个拓扑工具,生成重叠结果。
2、空隙
通过线面转换等几个工具,找出空洞部分。
3、多部件
直接计算【!shape.PartCount!】得出结果。
4、几何错误
直接调用系统工具箱的【检查几何】工具。
完整代码如下:
# -*- coding: utf-8 -*-
import arcpy
import os
arcpy.env.overwriteOutput = True
input_fc = arcpy.GetParameterAsText(0) # 输入检查面要素
result_fc = arcpy.GetParameterAsText(1) # 输出结果
# 获取文档位置
default_path = os.path.dirname(os.path.dirname(__file__))
top_gdb = default_path + r'\拓扑.gdb' # TOP数据库
memory = r'memory' # 内存位置
# 面要素质检
def PolygonCheck():
arcpy.AddMessage('——————————拓扑检查——————————')
# 创建一个空GDB文件
is_exist = os.path.exists(top_gdb) # 判断TOP数据库是否存在
if not is_exist:
arcpy.CreateFileGDB_management(default_path, '拓扑') # 创建TOP数据库
# 设置正确的坐标系
cod = arcpy.Describe(input_fc).spatialReference
# 新建要素数集
db = arcpy.CreateFeatureDataset_management(top_gdb, 'TOP', cod)
# 复制要素
fc = arcpy.Copy_management(input_fc, str(db) + r'\检查要素')
# 新建拓扑
top = arcpy.CreateTopology_management(db, 'Topology')
# 向拓扑中添加要素
arcpy.AddFeatureClassToTopology_management(top, fc)
# 添加拓扑规则【重叠】
arcpy.AddRuleToTopology_management(top, "Must Not Overlap (Area)", fc)
# 验证
arcpy.ValidateTopology_management(top)
# 输出TOP错误
arcpy.ExportTopologyErrors_management(top, top_gdb, 'Topology')
# 检查空隙
cave = top_gdb + r'\cave'
Cave(input_fc, cave)
arcpy.AddField_management(cave, '错误说明', 'TEXT')
arcpy.CalculateField_management(cave, '错误说明', "'存在空隙'")
# 合并错误
arcpy.Append_management([top_gdb + r'\Topology_poly'], cave, "NO_TEST")
# 重叠错误说明赋值
with arcpy.da.UpdateCursor(cave, ['错误说明']) as cursor:
for row in cursor:
if row[0] is None:
row[0] = r'存在重叠'
cursor.updateRow(row)
# 检查多部件
arcpy.AddMessage('——————————添加部件数量——————————')
field = r'部件数量'
arcpy.AddField_management(input_fc, field, "LONG")
arcpy.CalculateField_management(input_fc, field, "!shape.PartCount!")
is_mul = False
with arcpy.da.UpdateCursor(input_fc, ['部件数量']) as cursor:
for row in cursor:
if row[0] > 1:
is_mul = True
break
cursor.updateRow(row)
# 如果有多部件,加个字段标记一下
if is_mul:
arcpy.AddField_management(cave, '存在多部件', 'TEXT')
# 删除中间字段
arcpy.DeleteField_management(input_fc, ['部件数量'])
arcpy.DeleteField_management(cave, ['ORIG_FID'])
# 检查几何
geo_er = arcpy.CheckGeometry_management([input_fc], top_gdb + r'\Geo', "ESRI")
# 获取表行数
count = int(str(arcpy.GetCount_management(geo_er)))
# 如果有几何错误,标记一下
if count > 0:
arcpy.AddField_management(cave, '存在几何错误', 'TEXT')
# 输出结果
arcpy.Copy_management(cave, result_fc)
# 删除中间数据库
arcpy.Delete_management(top_gdb)
# 处理带空洞要素
def Cave(input_fc, output_fc):
arcpy.AddMessage('——————————处理带空洞要素——————————')
# 融合要素
fc = arcpy.Dissolve_management(input_fc, memory + r'\fc')
# 面转线
fc_line = arcpy.PolygonToLine_management(fc, memory + r'\fc_line')
# 要素转面
fc_polygon = arcpy.FeatureToPolygon_management(fc_line, memory + r'\fc_polygon')
# 融合
fc_polygon2 = arcpy.Dissolve_management(fc_polygon, memory + r'\fc_polygon2')
# 擦除,获取空洞
cave = arcpy.Erase_analysis(fc_polygon2, fc, memory + r'\cave')
# 单部件转多部件
fc_polygon_single = arcpy.MultipartToSinglepart_management(fc_polygon2, top_gdb + r'\fc_polygon_single')
cave_single = arcpy.MultipartToSinglepart_management(cave, top_gdb + r'\cave_single')
arcpy.AddMessage('——————————输出空洞——————————')
arcpy.Copy_management(cave_single, output_fc)
# 删除中间要素
arcpy.Delete_management(fc_polygon_single)
arcpy.Delete_management(cave_single)
if __name__ == '__main__':
PolygonCheck()
结果展示
检查结果如下,【重叠和空隙】要素会生成面要素,在字段【错误说明】里有描述说明。如果有【多部件和几何错误】,会添加字段说明:
PS:本工具不会更改原数据,要修改错误需要自行修改。多部件可以用【多部件转单部件】工具处理,几何错误可以用【修复几何】工具处理。
工具下载
最后,贴上工具下载地址:
工具下载:面要素质检https://pan.baidu.com/s/1XakrBfAGd24avXxRO2SdUw?pwd=j28l