Arcgis+Python实现矢量图层批量字段添加
ArcGIS+Python实现矢量图层批量字段添加
本方法解决按规定标准批量添加相应字段
一、代码实现设想
只要通过添加原文件以及该文件对应的属性结构表,就可以自动新建数据库标准字段。
二、问题分析
以行政区为例,行政区属性结构描述表:
序号 |
字段名称 |
字段代码 |
字段类型 |
字段长度 |
小数位数 |
值域 |
约束条件 |
备注 |
1 |
标识码 |
BSM |
Int |
10 |
|
>0 |
M |
|
2 |
要素代码 |
YSDM |
Char |
10 |
|
见表1 |
M |
|
3 |
行政区代码 |
XZQDM |
Char |
12 |
|
见GB/T 2260 |
M |
见本表注1 |
4 |
行政区名称 |
XZQMC |
Char |
100 |
|
非空 |
M |
|
5 |
行政区面积 |
XZQMJ |
Float |
15 |
2 |
>0 |
C |
见本表注2 |
该图层要添加5个字段,主要设置参数有字段代码、字段类型、字段长度,如果是浮点型,那么还会有一个小数位数。
接下来就是分析arcgis的AddField函数及其参数(工具帮助查看)
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, field_type)及七个对应默认参数,我们用到的主要是五个参数(in_table, field_name, field_type,field_precision, field_scale),各个参数对应的详细介绍参考Arcgis工具帮助:
观察调整我们需要的字段及属性,如int改为LONG,char改为TEXT,float改为FLOAT,调整后如下表:
(注:此表最好不要有空值,用NULL替代空缺)
三、代码实现
reload(sys)
sys.setdefaultencoding("utf-8")
import xlrd
import xlwt
import arcpy
# 设置参数(pthon脚本导入arcgis中的两个参数)
xlspath = arcpy.GetParameterAsText(1) #标准化后属性结构表excel格式路径
data = xlrd.open_workbook(xlspath)
table = data.sheets()[0]
for i in range(1,table.nrows):
row_content = [] # 初始化一个列表,用于后面存储读取的excel值
for j in range(table.ncols): # 遍历excel每行中的各个值
ctype = table.cell(i, j).ctype # 定义每个值类型用于下面判断
cell = table.cell_value(i, j) # 定义每个值用于下面判断
if ctype == 1:
row_content.append(cell) # 如果值类型为字符型,将值加入让面的列表
if ctype ==2 and cell%1 == 0:
cell = int(cell) # 如果值类型为浮点型,且除以1余数为0,转为整数
row_content.append(cell) # 加入列表
# 将参数赋值给AddField工具所需的必要参数
field_name = str(row_content[1]) # 字段名:该行的第二个(列表索引从0开始)
field_type = str(row_content[2]) # 字段类型:该行第三个
fieldalias = str(row_content[5])
if field_type == 'FLOAT': # 如果字段类型为FLOAT,执行下面代码,其他elif同理
fieldprecision = row_content[3] # 字段长度,该行第4个
fieldscale = row_content[4] # 小数位数,该行第五个
arcpy.AddField_management(in_table, field_name, field_type, field_precision = fieldprecision, field_scale = fieldscale, field_alias = fieldalias)
elif field_type == 'TEXT':
fieldlength = row_content[3]
arcpy.AddField_management(in_table, field_name, field_type, field_length = fieldlength, field_alias = fieldalias)
elif field_type == 'LONG':
fieldprecision = row_content[3]
arcpy.AddField_management(in_table, field_name, field_type, field_precision = fieldprecision, field_alias = fieldalias)
四:脚本工具展示
在arcgis中导入代码并配置好脚本参数后,工具效果如下:
工具运行,目标文件字段如下所示:
只要if判断的所有条件包含所有建库字段标准,那么所有文件添加字段仅要点几下即可完成,大大提升了工作效率。
说明:该脚本针对arcgis10版本,运用Python的arcpy模块进行批量添加字段。
注:文中一些方法细节,如读取excel文件模块安装及读取excel方法、python脚本导入arcgis并设置参数等,没作出详细介绍,网络上有很多方法,比如:http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html关于python读取excel的介绍,以及http://www.cnblogs.com/liweis/p/4252596.html关于arcgis添加python脚本方法,作者参考以上文章完善该过程。读者如有兴趣,亦可联系QQ:961478034一起交流,希望更多相同爱好者共同进步。