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
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1.文本文件操作 1.1 excel转点 1.2 表格转点 1.3 点集转 1.4 线封闭 1.5 征地部标准坐标导出 1.6 征地部标准坐标导入 2.mxd操作 2.1 数据打包 2.1.1 mxd批量打包 2.1.2 mxd文档发邮件 2.1.3 数据发邮件 2.2 mxd检查 2.3 mxd批量裁剪 2.4 mxd文档相对路径和无效数据检查 2.5 mxd中查找替换 2.6 PDF合并 2.7 按当前MXD批量符号化 2.8 把多个MXD批量导出一个PDF 2.9 批量mxd导出图片 2.10 批量mxd压缩 2.11 转到XY 3.编号工具 3.1 按图形自动编号 3.2 更新BSM 3.3 整库更新BSM 3.4 字符串前补零 4.剪切和合并 4.1 按属性裁剪 4.2 矢量数据批量裁剪 4.3 矢量数据批量裁剪按别名 4.4 矢量数据批量合库 4.5 影像合并 4.6 影像批量裁剪 5.其他 5.1 度分秒转度 5.2 度转度分秒 5.3 飞行网络路线制作 5.4 获得工具箱的工具数 5.5 移除tbx 6.数据处理 6.1 按长度分割线 6.2 分区域消除 6.3 距离角度生成点 6.4 两个图层按重叠度赋属性 6.5 两个图层按重叠度赋属性old 6.6 批量定义坐标系 6.7 批量修复几何(修复前一定备份数据) 6.8 批量压缩数据库 6.9 融合时字段连接 6.10 线分割保留属性 6.11 要素旋转 6.12 要素移动 6.13 一次性消除指定积以下的地块 7.数据检查和信息获得 7.1 属性赋值 7.1.1 比例分析 7.1.2 加权平均 7.1.3 取积最大的 7.2 四至和范围获得 7.2.1 地块四至点获得 7.2.2 地块四至点坐标获得 7.2.3 获得绝对四至(根据四至点坐标) 7.2.4 获得数据的XY范围 7.2.5 获得数据的经纬度范围 7.2.6 获得相对四至(适合大比例小地块) 7.2.7 四邻信息获得 7.3 道路河流依次经过的地方 7.4 获得内角并判断是否凸多边形 7.5 获得线两个折点方向 7.6 计算点到线的距离 7.7 锐角检查 7.8 添加经纬度坐标 7.9 椭球积计算 8.数据转换 8.1 SHP转数据库 8.2 批量数据库转数据库 8.3 栅格彩色转黑白 9.拓扑错误处理 9.1 点不在线上处理 9.2 检查部件要素 9.3 缝隙处理 9.4 线边界不重合 9.5 重叠处理 9.6 删除完全重复的点线 9.7 删除线上重复点 9.8 删除线直线上的点 9.9 伪节点处理 9.10 线部分或完全重叠处理 10.业务相关 10.1 查询节点距离小于指定距离的点 10.2 村级行政区生成行政界线 10.3 代码名称互填 10.4 地类符号生成 10.5 上级行政区和下级行政区图形不一致处理 10.6 生成上级行政区 10.7 修改左上角点为第一个点 10.8 修改左上角点为第一个点根据点层 10.9 宗地获得界址点顺序号 11.制图 11.1 公里网或方里网制作 11.2 经纬网制作 11.3 矩形接幅表 11.4 梯形接幅表 11.5 制作色带 使用方法: 1.打开ArcMap,找到Catalog的窗口 2.Catalog窗口中,找到超级工具的存放文件夹
好的,我了解了你的问题。你想要编写一个 ArcGIS Python 脚本,能够根据要素类(shp)的一个字段内容,将这个要素类拆分成多个要素类,对吗? 那么,你可以按照以下步骤来编写这个脚本: 1. 首先,导入必要的 Python 模块和 ArcGIS 模块,包括 arcpy 和 os 模块。 ``` import arcpy import os ``` 2. 定义输入要素类的路径和字段名称。 ``` in_fc = r"path/to/input/feature/class.shp" split_field = "field_name" ``` 3. 使用 arcpy.da.SearchCursor 函数遍历要素类中的每个要素,并根据指定字段的值创建一个字典,其中键为字段值,值为要素类中包含该字段值的所有要素的列表。 ``` split_dict = {} with arcpy.da.SearchCursor(in_fc, [split_field]) as cursor: for row in cursor: if row[0] not in split_dict: split_dict[row[0]] = [] split_dict[row[0]].append(row) ``` 4. 遍历字典中的每个键值对,使用 arcpy.CopyFeatures_management 函数将包含每个键值对所对应字段值的所有要素复制到一个新的要素类中。 ``` out_folder = r"path/to/output/folder" for value, rows in split_dict.items(): out_name = "split_" + str(value) + ".shp" out_path = os.path.join(out_folder, out_name) arcpy.CopyFeatures_management(rows, out_path) ``` 5. 完整的代码如下所示: ``` import arcpy import os in_fc = r"path/to/input/feature/class.shp" split_field = "field_name" out_folder = r"path/to/output/folder" split_dict = {} with arcpy.da.SearchCursor(in_fc, [split_field]) as cursor: for row in cursor: if row[0] not in split_dict: split_dict[row[0]] = [] split_dict[row[0]].append(row) for value, rows in split_dict.items(): out_name = "split_" + str(value) + ".shp" out_path = os.path.join(out_folder, out_name) arcpy.CopyFeatures_management(rows, out_path) ``` 这个脚本将会根据输入要素类的指定字段值,将要素类拆分成多个要素类,并将这些要素类保存到指定的输出文件夹中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

规划GIS会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值