ArcGisPro脚本工具【2】——面要素的一键拓扑和几何错误、多部件检查

本次Arcpy脚本工具用的是ArcGisPro2.8版本,尽量使用同一版本,其它版本可以参照。

b4b36b05caa54581aaa7425b68f3cc18.png

工具介绍

本工具综合了【面要素】的拓扑检查和几何错误、多部件检查。

在ArcGis中【拓扑检查】比较麻烦,需要用到多个工具,但流程比较固定。为了节约时间和简化流程,所以写了这个工具。

在拓扑检查的基础上,还加入了【几何错误和多部件】的检查。基本上涵盖了面要素的主要错误。大大方便了对【面要素数据】的前期检查。

7959919c1e7c437bbb527fbb95fe0085.png

参数设置

参数只有2个。

1、【输入面要素】——输入要检查的面要素,过滤器里的要素类型设置成【面】。

2、【输出检查结果】——输出一个面要素,作为检查结果查看。

8922126ed8a44a91b2c9e86210e7f4a4.png

bcdff495cbe141bbbe1d1b25e6277a9d.png

脚本编写

代码比较长,检查分为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()

809b7ef64ee44d0389a16013fe6598c6.png

结果展示

检查结果如下,【重叠和空隙】要素会生成面要素,在字段【错误说明】里有描述说明。如果有【多部件和几何错误】,会添加字段说明:

a42b26e21c144eccbe62578e2c6990d6.png

PS:本工具不会更改原数据,要修改错误需要自行修改。多部件可以用【多部件转单部件】工具处理,几何错误可以用【修复几何】工具处理。

eebc11fde98343baa56e6efe72910e8b.png

 工具下载

最后,贴上工具下载地址:

工具下载:面要素质检https://pan.baidu.com/s/1XakrBfAGd24avXxRO2SdUw?pwd=j28l

 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

规划GIS会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值