Live2D

使用arcpy批量删除shp数据字段和添加字段

ArcPy

1.1 ArcPy介绍

ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了 arcgisscripting 功能进而构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。

该包提供了丰富纯正的 Python 体验,具有代码自动完成功能(输入关键字和点即可获得该关键字所支持的属性和方法的弹出列表;从中选择一个属性或方法即可将其插入),并针对每个函数、模块和类提供了参考文档。

在 Python 中使用 ArcPy 的另一个主要原因是,Python 是一种通用的编程语言。Python 是一种支持动态输入的解释型语言,适用于交互式操作以及为称为脚本的一次性程序快速制作原型,同时其具有编写大型应用程序的强大功能。用 ArcPy 编写的 ArcGIS 应用程序的优势在于,可以使用由来自多个不同领域的 GIS 专业人员和程序员组成的众多 Python 小群体开发的附加模块。

推荐学习资料

1.2 ArcPy基本词汇

术语 定义
Python Python 是由 Guido van Rossum 在上世纪八十年代末构想并于 1991 年推出的一种开源编程语言。Python 得到了不断壮大的多元化用户群体的支持,具备简洁易读、语法清晰、支持动态定型等特点,并且具有大量标准库和第三方库。
ArcPy ArcPy(通常称为 ArcPy 站点包)为用户提供了使用 Python 语言操作所有地理处理工具(包括扩展模块)的接口,并提供了多种有用的函数和类,以用于处理和查询 GIS 数据。使用 Python 和 ArcPy,可以开发出大量的用于处理地理数据的实用程序。
ArcPy 模块 模块为通常包含函数和类的 Python 文件。ArcPy 由一系列模块支持,包括数据访问模块 (arcpy.da)、制图模块 (arcpy.mp)、ArcGIS Spatial Analyst extension 模块 (arcpy.sa)、ArcGIS Image Analyst extension 模块以及 ArcGIS Network Analyst extension 模块 (arcpy.na)。
ArcPy 类 类的作用类似于建筑设计蓝图。蓝图为如何创建事物提供了一个框架。类可用于创建对象,即通常所说的实例。ArcPy 类,如 SpatialReference 和 Extent 类,通常用作地理处理工具参数设置的快捷方式,否则的话,这些参数会使用更加复杂的字符串。
ArcPy 函数 函数是用于执行某项特定任务并能够纳入更大的程序的已定义功能。在 ArcPy 中,所有地理处理工具均以函数形式提供,但并非所有函数都是地理处理工具。除工具之外,ArcPy 还提供多种函数来更好地支持 Python 地理处理工作流。函数(通常称为方法)可用于列出某些数据集、检索数据集的属性、在将表添加到地理数据库之前验证表名称,或执行其他许多有用的脚本任务。
独立 Python 脚本 独立 Python 脚本是一种 .py 文件,可通过两种方式执行:通过操作系统提示符,或 Python 集成开发环境 (IDE)。
Python 脚本工具 Python 脚本工具是已添加到地理处理工具箱的 Python 脚本。添加为脚本工具后,便可以像使用其他地理处理工具一样使用此脚本工具 - 可以从工具对话框打开和执行、可以在 Python 窗口和 ModelBuilder 中使用,也可以从其他脚本和脚本工具中调用。
Python 窗口 通过 Python 窗口,用户可以快捷地在 ArcGIS 内部使用 Python,从而以交互方式运行地理处理工具和功能以及充分利用其他 Python 模块和库。此窗口还为您学习 Python 提供了一个途径。Python 窗口可用于执行单行 Python 代码,并会将由此生成的消息输出到窗口。借助此窗口,您可以对语法进行试验和处理短代码,并可以在大型脚本范围之外对您的想法进行检验。
Python 工具箱 Python 工具箱是完全使用 Python 语言创建的地理处理工具箱。Python 工具箱及其所包含工具的外观、操作和运行方式与任何以其他方式创建的工具箱和工具类似。Python 工具箱是一个具有 .pyt 扩展名的 Python 文件,用于定义工具箱以及一个或多个工具。

ArcGIS介绍及代码分析

2.1 ArcGIS介绍

ArcGIS产品线为用户提供一个可伸缩的,全面的GIS平台。ArcObjects包含了许多的可编程组件,从细粒度的对象(例如单个的几何对象)到粗粒度的对象(例如与现有ArcMap文档交互的地图对象)涉及面极广,这些对象为开发者集成了全面的GIS功能。

ArcGIS官网

2.2 主要涉及工具与方法

本程序主要使用如下工具

工具名称 方法
DeleteFileds【删除字段】 arcpy.DeleteField_management(input_data,delete_fields)
AddFileds【添加字段】 arcpy.AddField_management(input_data,field_Name,fields_Type,field_Length)方法介绍:['输入数据','字段名称','字段类型','字段长度']以上为TEXT字段输入形式。arcpy.AddField_management(input_data,field_Name,fields_Type,field_Precision,field_Scale)以上为”FLOAT“或”DOUBLE“输入形式,新的参数表示 [数据精度,小数点后位数]
DefineProjection【定义投影】 arcpy.DefineProjection_management(in_data,project)project参数为投影坐标系统

2.3 设计思路

首先调用制图模块arcpy.mapping读取当前地图文档,然后将当前地图文档的Layers图层转化为Python List;我们要筛选不符合要求的字段,及要求建立的字段创建列表,通过循环分别调用工具即可实现批量生成标准字段的工作任务。

2.4 代码展示

#生成标准国标字段 Version1.0 CopyRight by Mr Heisenberg
import arcpy
#打开地图文档
mymxd =arcpy.mapping.MapDocument("current")
ary =arcpy.mapping.ListLayers(mymxd)
'''
坐标系统解析
地理坐标系统:CGCS2000国家质心坐标系统
椭球体参数:
长半轴a:6378137.0,扁率α:1/298.257222101
投影坐标系统:Gauss_Kruger高斯克里格3°带投影坐标
中央经线:117°
起始纬线:0°
单位:m
'''
cgcs2000_39="PROJCS['CGCS2000_3_Degree_GK_Zone_39',\
GEOGCS['GCS_China_Geodetic_Coordinate_System_2000',\
DATUM['D_China_2000',SPHEROID['CGCS2000',6378137.0,298.257222101]],\
PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],\
PROJECTION['Gauss_Kruger'],PARAMETER['False_Easting',39500000.0],\
PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',117.0],\
PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]"
#删除字段列表
delete_list=["YBZDDM","QSXZ","ZDSYQLX","PZMJ","TDJB","SBDJ","QDJG",\
"SFGY","BLC","PZYT","SJYT","QLSLQK","GMJJHYFLDM","JZZDMJ","JZZMJ","SYQSRQ",\
"SYQX","SYZZRQ","QTSM","QLXZ"]
#添加字段列表属性
fields=[["ZL","TEXT",200],["ZDMJ","FLOAT",15,4],["MJDW","TEXT",2],["DJ","TEXT",2],\
		["JG","FLOAT",15,4],["YT","TEXT",4],["ZDT","TEXT",200],["QLSDFS","TEXT",2],\
        ["RJL","TEXT",20],["JZXG","FLOAT",5,2],["ZDSZD","TEXT",200],["ZDSZN","TEXT",200],\
		["ZDSZX","TEXT",200],["ZDSZB","TEXT",200],["DAH","TEXT",254],["BZ","TEXT",254],\
		["TFH","TEXT",50],["DJH","TEXT",20],["ZT","TEXT",2],["YTMC","TEXT",254],\
		["QXDM","TEXT",6],["QLXZ","TEXT",4]] 
#给特殊字段赋值
special_fields=["ZDBZ","ZDDZ","ZDNZ","ZDXZ","SZTFH","JZRJL","SCMJ","TDZL"]
#固定字段
fixed_fields=[["QLLX","5"],["QLXZ","200"],["QLSDFS","2"],["MJDW","1"],["YT","072"],["ZT","1"],\
["YTMC","农村宅基地"],["QXDM","131124"]]
#新生成字段
New_fields=["ZDSZB","ZDSZD","ZDSZN","ZDSZX","TFH","RJL","ZDMJ","ZL"]
#生成删除集
delete_txt=""
for delete in delete_list:
	delete_txt+=delete+";"
for lyr in ary:
	in_table=lyr.dataSource
	if in_table.find(".shp")>0:
		arcpy.DeleteField_management(in_table,delete_txt)
		print("多余字段删除完成!")
		for count in fields:
			if count[1]=="TEXT":
				print("名称:{0}———— 类形:{1}———— 长度:{2}".format(count[0],count[1],count[2]))
arcpy.AddField_management(in_table,count[0],count[1],field_length=count[2])
			else:
				print("名称:{0}———— 类形:{1}———— 精度:{2}———— 小数点位数:{3}".format(count[0],count[1],count[2],count[3]))
				arcpy.AddField_management(in_table,count[0],count[1],count[2],count[3])
		print("创建字段完成!")
		for field in fixed_fields:
			field_="\""+field[1]+"\""
			arcpy.CalculateField_management(in_table,field[0],field_, "VB")
		print("赋予字段固定值完成!")
		for i in range(len(special_fields)):
			field="["+special_fields[i]+"]"
			arcpy.CalculateField_management(in_table,New_fields[i],field,"VB")
			arcpy.DeleteField_management(in_table,special_fields[i])
		print("数据交换完成!")
		arcpy.DefineProjection_management(in_table,cgcs2000_39) 
		print("定义国家2000坐标系统完成!")
	else:
		next
del mymxd
arcpy.RefreshActiveView()
print("------标准字段完成------")

欢迎大家积极评论。

posted @ 2020-09-18 10:02  编程渣渣呀  阅读(1626)  评论(0编辑  收藏  举报