python arcpy练习之面要素重叠拓扑检查

目录
  • 需求
  • 思路
  • 代码
  • 效果图
  • 总结

需求

有多个文件地理数据库(gdb),数据库内有多个面要素类图层,每个图层不能有自重叠,也不能和其他图层重叠。所以,需要为每个文件地理数据库(gdb)进行拓扑检查。

思路

1.在输出文件夹下新建与输入文件夹下同名的gdb。

2.在gdb内新建要素类数据集。

3.在数据集内创建拓扑。

4.向拓扑中添加要素类。

5.添加拓扑规则。

6.拓扑验证。

7.导出拓扑错误。

将需要拓扑的gdb放入同一个文件夹下,用python代码串连起来利用循环遍历gdb便可以进行批量拓扑了。

代码

# -*- coding: gbk -*-
import os
import arcpy
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
arcpy.AddMessage(sys.getdefaultencoding())
arcpy.env.XYResolution = "0.0001 Meters" #设置XY分辨率
arcpy.env.XYTolerance = "0.001 Meters"   #设置XY容差
def checkTopology(in_path, out_path):
    cout = 0
    fail = 0
    warning = 0
    fail_list = []
    warning_list = []
    arcpy.env.workspace = in_path
    workspaces = arcpy.ListWorkspaces("*", "ALL")
    for workspace in workspaces:
        arcpy.AddMessage("=" * 60)
        cout += 1
        arcpy.AddMessage(" (" + str(cout) + ") " + os.path.basename(workspace))
        arcpy.AddMessage("  ")
        try:
            # 将每个gdb设为工作区
            arcpy.env.workspace = workspace
            fc_list = arcpy.ListFeatureClasses() #列出gdb内的要素类图层
            in_fc_path_list = []
            for fc in fc_list:
                in_fc_path_list.append(os.path.join(workspace,fc))
            # 在输出路径out_path下新建gdb
            gdb_name1 = os.path.basename(workspace)
            result_gdb = os.path.join(out_path, gdb_name1)
            if not arcpy.Exists(result_gdb):
                arcpy.AddMessage("    新建 " + result_gdb + " ...")
                arcpy.CreateFileGDB_management(out_path, gdb_name1)
            else:
                arcpy.AddWarning(result_gdb + " 已存在!")
                warning_list.append(result_gdb)
                warning += 1
                continue
            arcpy.AddMessage("    在 " + result_gdb + " 内新建要素数据集...")
            dataset_name = "dataset"
            dataset_path = os.path.join(result_gdb,dataset_name)
            # 引用包含要应用的空间参考的要素类或要素数据集,
            # 将in_fc_path_list[0]的坐标作为要素数据集的坐标,所以gdb内的所有要素类应该是统一坐标
            arcpy.CreateFeatureDataset_management(result_gdb, dataset_name, in_fc_path_list[0])
            #导入要素类到数据集
            arcpy.AddMessage("    向 " + dataset_path + " 导入要素类图层...")
            arcpy.FeatureClassToGeodatabase_conversion(in_fc_path_list,dataset_path)
            #在dataset数据内创建拓扑
            arcpy.AddMessage("    创建拓扑...")
            topology_name = "topology"
            topology_path = os.path.join(dataset_path, topology_name)
            arcpy.CreateTopology_management(dataset_path, topology_name)
            # 将导入dataset的要素类添加到拓扑中
            arcpy.AddMessage("    向拓扑中添加要素类...")
            dataset_fc_path_lsit = []  #数据集中的要素类绝对路径列表
            for ifc_name in fc_list:
                # 拼接数据集中的要素类绝对路径
                dataset_fc_path = os.path.join(dataset_path,ifc_name)
                dataset_fc_path_lsit.append(dataset_fc_path)
                arcpy.AddFeatureClassToTopology_management(topology_path, dataset_fc_path, "1", "1")
            arcpy.AddMessage("    添加拓扑规则...")
            for i in range(len(dataset_fc_path_lsit)):
                fc_path1 = dataset_fc_path_lsit[i]
                #规则1:不能重叠
                arcpy.AddRuleToTopology_management(topology_path, "Must Not Overlap (Area)", fc_path1, "", "", "")
                for j in range(i + 1, len(dataset_fc_path_lsit)):
                    fc_path2 = dataset_fc_path_lsit[j]
                    # 规则2:不能重叠与其他要素类重叠
                    arcpy.AddRuleToTopology_management(topology_path, "Must Not Overlap With (Area-Area)", fc_path1, "", fc_path2, "")
            arcpy.AddMessage("    拓扑验证...")
            arcpy.ValidateTopology_management(topology_path, "Full_Extent")
            arcpy.AddMessage("    导出拓扑错误...")
            arcpy.ExportTopologyErrors_management(topology_path, dataset_path, "topoError")
        except Exception as e:
            arcpy.AddError(e.message)
            arcpy.AddError("    " + os.path.basename(workspace) + " 失败!")
            fail_list.append(os.path.basename(workspace))
            fail += 1
    arcpy.AddMessage('+' * 60)
    arcpy.AddMessage(u"  成功:" + str(cout - fail - warning) + u" 个!")
    if warning > 0:
        arcpy.AddWarning(u"  警告:" + str(warning) + u" 个! 如下:")
        arcpy.AddWarning("####" + '*' * 20)
        for fff in warning_list:
            arcpy.AddWarning("  " + fff)
        arcpy.AddWarning("####" + '*' * 20)
    if fail > 0:
        arcpy.AddError(u"  失败:" + str(fail) + u" 个! 如下:")
        arcpy.AddError("####" + '*' * 20)
        for ff in fail_list:
            arcpy.AddError("  " + ff)
        arcpy.AddError("####" + '*' * 20)
    arcpy.AddMessage('+' * 60)
if __name__ == "__main__":
    in_path_globle = arcpy.GetParameterAsText(0)
    out_path_globe = arcpy.GetParameterAsText(1)
    checkTopology(in_path_globle,out_path_globe)

效果图

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Python/ArcPy遍历指定目录中的MDB文件方法

    如下所示: #遍历指定目录中的MDB文件,构造FeatureClass名 >>> target_folder = 'D:\T20161202' ... file_names=('BOUAN','BOULK','BOUNT','BOUPT','CTRLK','CTRPT','HYDAN','HYDLK','HYDNT','HYDPT','PIPAN','PIPLK','PIPNT','PIPPT','RESAN','RESLK','RESNT','RESPT','ROAAN','ROALK

  • C#调用python.exe使用arcpy方式

    背景 环境:ArcGis10.2.2.C#开发程序一直以来以调用Desktop的python环境(32位)来做数据处理分析.但是数据量大时,出现了内存资源不够的情况.因此决定换成使用64位python环境. 遇到问题 C#通过Process.Start()去调用64位python.exe,在Debug模式下毫无问题,但是直接运行exe就报错Process finished with exit code -1073741819 (0xC0000005).指向异常. 分析问题 后来发现是由于arcp

  • python使用arcpy.mapping模块批量出图

    出图是项目里常见的任务,有的项目甚至会要上百张图片,所以批量出土工具很有必要.arcpy.mapping就是ArcGIS里的出图模块,能快速完成一个出图工具. arcpy.mapping模块里常用的类有MapDocument.DataFrame.Layer.DataDrivenPages和TextElement. MapDocument类是地图文档(.mxd文件)对应的类.初始化参数是一个字符串,一般是.mxd文件的路径: mxd=arcpy.mapping.MapDocument(r"F:\G

  • python sorted函数的小练习及解答

    前两天学习了一下socket编程,在向某大神请教问题时被嫌弃了,有一种还没学会走就想跑的感觉.大神说我现在的水平应该去做一些像是操作文件.序列号等的小练习来加深理解.下面是他给我出的小练习: 1.datas = [['sherry',19,'female'],['flora',21,'female'],['june',15,'femal']],分别根据名字首字母和年龄进行排序输出: 2.按照给定的输出方式进行输出比较结果,对Person类进行补充: class_mates = {'sherry'

  • python sorted函数原理解析及练习

    这篇文章主要介绍了python sorted函数原理解析及练习,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前两天学习了一下socket编程,在向某大神请教问题时被嫌弃了,有一种还没学会走就想跑的感觉.大神说我现在的水平应该去做一些像是操作文件.序列号等的小练习来加深理解.下面是他给我出的小练习: 1.datas = [['sherry',19,'female'],['flora',21,'female'],['june',15,'femal

  • python装饰器练习题及答案

    这篇文章主要介绍了python装饰器练习题及答案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一:编写装饰器,为多个函数加上认证的功能(用户的账号密码) 要求登录成功一次,后续的函数都无需输入用户名和密码 FLAG=False#此时还未登录 全局变量 写这个步骤的意义在于:方便 知道已经登录成功了,就不再重复登录 def login(func):#为多个函数加上的认证功能 def inner(*args,**kwargs):#加上装饰器 gl

  • python arcpy练习之面要素重叠拓扑检查

    目录 需求 思路 代码 效果图 总结 需求 有多个文件地理数据库(gdb),数据库内有多个面要素类图层,每个图层不能有自重叠,也不能和其他图层重叠.所以,需要为每个文件地理数据库(gdb)进行拓扑检查. 思路 1.在输出文件夹下新建与输入文件夹下同名的gdb. 2.在gdb内新建要素类数据集. 3.在数据集内创建拓扑. 4.向拓扑中添加要素类. 5.添加拓扑规则. 6.拓扑验证. 7.导出拓扑错误. 将需要拓扑的gdb放入同一个文件夹下,用python代码串连起来利用循环遍历gdb便可以进行批量

  • 使用python中的in ,not in来检查元素是不是在列表中的方法

    如果在列表中返回True ,否则返回False 以上这篇使用python中的in ,not in来检查元素是不是在列表中的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框

    1.随机生成格式正确手机号码 # 随机产生格式正确的手机号码 def create_phone(self): num_start = ['134', '135', '136', '137', '138', '139', '150', '151', '152', '158', '159', '157', '182', '187', '188', '147', '130', '131', '132', '155', '156', '185', '186', '133', '153', '180',

  • Python使用描述符实现属性类型检查的案例解析

    目录 1.如何使用描述符对实例属性做类型检查? 实际案例: 解决方案: 2.代码演示 1.如何使用描述符对实例属性做类型检查? 实际案例: 在某项目中,我们实现了一些类,并希望能像静态类型语言那样(C,C++,Java)对它们的实例属性做类型检查. p = Person() p.name = 'Bob' # 名字属性必须是str p.age = 18 # 年龄必须是int p.height = 1.83 # 身高必须是float 要求:(1)可以对实例变量名指定类型 (2)赋予不正确类型时抛出异

  • python matplotlib画图时坐标轴重叠显示不全和图片保存时不完整的问题解决

    目录 问题 解决方案 保存时图片不完整的问题 补充:使用matplotlib时如何让坐标轴完整显示所有的标签刻度 总结 问题 在使用matplotlib作图的时候,有的时候会遇到画图时坐标轴重叠,显示不全和图片保存时不完整的问题.如下: 解决方案 画图时重叠或者显示不全的问题 画图时加上参数设置tight_layout=True 画完所有子图后,设置plt.tight_layout() # 加上tight_layout=True 参数设置 fig, axes = plt.subplots(nro

  • python如何对实例属性进行类型检查

    本文实例为大家分享了python对实例属性进行类型检查的具体代码,供大家参考,具体内容如下 案例: 在某项目中,我们实现了一些类,并希望能像静态语言那样对他们的实例属性进行类型检查 p = Person() p.name = 'xi_xi'         # 必须是str p.age = 18                  # 必须是int p.height = 1.75              # 必须是float 需求: 可以对实例变量名指定类型 赋予不正确类型抛出异常 #!/usr

  • python中pylint使用方法(pylint代码检查)

    一.Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等. Pylint 的一个很大的好处是它的高可配置性,高可定制性,并且可以很容易写小插件来添加功能. 如果运行两次 Pylint,它会同时显示出当前和上次的运行结果,从而可

  • Python中类型检查的详细介绍

    前言 大家都知道Python 是一门强类型.动态类型检查的语言.所谓动态类型,是指在定义变量时,我们无需指定变量的类型,Python 解释器会在运行时自动检查. 与静态类型语言(如 C 语言)相比,这不仅仅是少写了几个类型声明字符: #include <stdlib.h> #include <stdio.h> #define BUFF 100 char* greeting(char* name){ char* msg = (char *) malloc(sizeof(char) *

  • 介绍一款python类型检查工具pyright(推荐)

    近日,微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注. 微软在开源项目上的参与力度是越来越大了,不说收购 Github 这种大的战略野心,只说它家开源的 VS Code 编辑器,在猿界已割粉无数,连我 Python 圈的红人 Kenneth Reitz(多个开源项目的作者,包括 requests.requests-html.responder等)都对它赞不绝口. 如今开源的 Pyright ,口碑还不错,那我们就来看看它有啥本事,顺便

随机推荐