你还在埋头鼠标左键添加字段,然后机械的输入字段名称、字段类型、字段别名等吗?那你就太low!下面给大家介绍下如何基于ArcGIS利用Python自动批量添加字段,记住这里是自动批量噢。
首先你需要有一张特定的电子表,在电子表里,你要录入好你需要的字段名称、类型、长度等。如何制作电子表,这里就不说了,请看下表:
其次,在敲代码前,你需要简单的了解下ArcGIS中常见的字段类型。ArcGIS字段类型大致可以归纳为4类:文本、数值、日期、布尔...而我们日常工作中用到最多的就是文本和数值,文本类型(字符串类型)比较简单,录入字段名、字段类型、字符串长度即可,数值类型需要录入字段名、字段类型、精度、小数位数,数值类型中的short、int、long、float、double不是本文的阐述重点,他们只是在长度上存在差异。
最后,就是敲代码了。代码其实没有我们想的那么复杂,英语不好,能学好代码吗,答案是肯定的,B站大学里的很多讲师,也都是讲蹩脚英语的,有的还是用拼音。代码中常用的英语单词一般不会超过200,而各类编程语言的关键字更是少的可怜,大概就在三五十个。代码实现其实很简单:
使用文件读取方法open(),逐行遍历电子表格,通过3个if语句,对3种字段类型进行参数设置,实现字段的批量创建。下面附详细代码
# -*- coding: utf-8 -*-
import arcpy
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
def add_fields(in_xlx, in_table):
# 按字段结构表创建字段
"""
AddField_management (in_table_要素类, field_name_字段名, field_type_字段类型, {field_precision}_精度,
{field_scale}_小数位数, {field_length}_字符串长度, {field_alias}_别名, {field_is_nullable}_是否允许空值,
{field_is_required}_是否必填, {field_domain}_属性域)
in_table, field_name=rows[i][0], field_type=rows[i][1], field_precision=eval(rows[i][2]),
field_scale=eval(rows[i][3]),field_length=eval(rows[i][4]), field_alias=rows[i][5],
field_is_nullable=rows[i][6], field_is_required=rows[i][7], field_domainrows[i][8]
"""
# 打开字段结构表
with open(in_xlx, "r") as f:
lines = f.readlines()[3:]
rows = [lines[i].strip("\n").split(",") for i in range(len(lines))] # 以表中每一行作为列表元素,追加到列表rows
for i in range(len(rows)):
# 文本类型字段创建
if rows[i][1].lower() == "text":
arcpy.AddField_management(in_table, field_name=rows[i][0], field_type=rows[i][1],
field_length=eval(rows[i][4]), field_alias=rows[i][5])
# 数字类型字段创建
elif rows[i][1].lower() in ["short", "long", "float", "double"]:
arcpy.AddField_management(in_table, field_name=rows[i][0], field_type=rows[i][1],
field_precision=eval(rows[i][2]), field_scale=eval(rows[i][3]),
field_alias=rows[i][5])
# 时间类型字段创建
elif rows[i][1].lower() == "date":
arcpy.AddField_management(in_table, field_name=rows[i][0], field_type=rows[i][1], field_alias=rows[i][5])
if __name__ == "__main__":
in_xlx = r"D:\ArcPy\field_struct.csv"
in_table = r"C:\Users\Lenovo\Desktop\test\标准库.gdb\数据集\本期林地变更小班面"
add_fields(in_xlx, in_table)
print "程序运行结束"