系列文章目录
ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改
ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片
ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板
文章目录
功能说明
日常工作中,常常要对要素的属性表进行导出表格操作,一般有多余字段还需要手动删除。
本文使用arcpy代码对属性表定制字段并输出表格。
本代码目标为:
- 1 选定准备输出的要素属性表的字段,名称及类型等格式
- 2 定制输出表格
- 3 导出表格dbf
- 4 存入mdb数据库
1 准备工作
本文样例要素的属性表如下图:
红框选中的字段是准备保留的字段,其他多余的字段可以在导出表格后删除该列。
此外,还可以 先行关闭多余字段,再导出表格,则导出的表格只保留未关闭的字段列。
2 代码分段
(1) 设置工作空间和目录
设置数据的目录,要素可以是shape层,可以放在工作空间目录内,否则需要绝对路径。
// 设置工作空间
arcpy.env.workspace = "d:/mulu"
// 定义输入要素类 shape层
input_fc = "JCTB.shp" # shape图层,放在 工作空间文件夹内,否则绝对路径目录
也可以是要素集中的图层。
// 设置工作空间
arcpy.env.workspace = "d:/mulu"
// 定义输入要素类
input_fc = r"D:\test.mdb\data\JCTB"
(2) 定义导出表格
arcgis Desktop 使用的表格格式为 .dbf,定义导出表格名称,可以存在工作空间目录内,或者绝对路径其他位置。
//导出表格名称
output_table = "table.dbf"
(3) 筛选字段
定义表格中需要保留的字段名称,注意 :此处应 为 要素属性表中 存在的字段名称。
//定义要素类的字段列表,筛选需要的字段
fields = ["BSM", "JCBH", "XMC", "JCMJ", "XZB", "YZB"]
(4) 创建表格
使用 arcpy.CreateTable_management()方法创建 导出表格。
注意 :此时创建的表格是空表格,但是由于arcgis Desktop 的 特性,
“要素类”和“表”还必须至少具有一个字段,此时的 导出表格 有唯一默认字段 “Field1”,字段下无数据,此时还不能删除,待后续创建其他字段后,才能删除此多余字段。
//创建空的 输出表格
arcpy.CreateTable_management(arcpy.env.workspace, output_table)
(5) 给导出表格添加字段
根据筛选的字段,按照属性表的字段类型,定义字段到 导出表格。
注意 :定义的格式需要保持一致,否则 属性表 数据无法写入 导出表格 。
//定义字段
arcpy.AddField_management(output_table, "BSM", "LONG")
arcpy.AddField_management(output_table, "JCBH", "TEXT")
arcpy.AddField_management(output_table, "XMC", "TEXT")
arcpy.AddField_management(output_table, "JCMJ", "DOUBLE")
arcpy.AddField_management(output_table, "XZB", "DOUBLE")
arcpy.AddField_management(output_table, "YZB", "DOUBLE")
(6) 删除首个默认字段
上一步给导出表格添加了其他字段,此时可以删除 默认字段 “Field1” ,表格仍然存在至少一个字段。
//删除 默认 多余字段
arcpy.DeleteField_management(output_table, "Field1")
(7) 读取属性表字段内容,写入导出表格
通过游标 ,逐行读取要素属性表,按照筛选的字段 ,将数据写入 导出表格 对应字段列。
//读取数据 写入表格
with arcpy.da.SearchCursor(input_fc, fields) as cursor:
for row in cursor:
# 将要素字段值 信息写入输出表格中
with arcpy.da.InsertCursor(output_table, fields) as icursor:
icursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5]))
这个过程中,可以对 某个字段进行计算,赋值,将修改后的数据写入对应 列。如下:
//读取数据 计算字段 写入表格
with arcpy.da.SearchCursor(input_fc, fields) as cursor:
for row in cursor:
# 计算字段 例如 面积换算公顷
change_info = round(row[3] / 10000, 4)
# 将要素字段值 信息写入输出表格中
with arcpy.da.InsertCursor(output_table, fields) as icursor:
icursor.insertRow((row[0], row[1], row[2], change_info, row[4], row[5]))
(8) 存入mdb数据库
上一步执行之后,导出表格 “table.dbf” 工作已经完成了,格式可以另存为 .xls等格式。
偶尔,导出表格需要保存为mdb格式,如下代码实现:
//将表格导出到Access数据库中
access_database = r"D:\mulu\other.mdb"
arcpy.TableToTable_conversion(output_table, access_database, "output_table")
3 完整代码
# coding=utf-8
import arcpy
# 设置工作空间
arcpy.env.workspace = "d:/mulu"
input_fc = r"D:\test.mdb\data\JCTB" # 数据库图层 指定目录位置
output_table = "table.dbf"
# 定义要素类的字段列表,筛选需要的字段
fields = ["BSM", "JCBH", "XMC", "JCMJ", "XZB", "YZB"]
# 创建空的 输出表格
arcpy.CreateTable_management(arcpy.env.workspace, output_table)
arcpy.AddField_management(output_table, "BSM", "LONG")
arcpy.AddField_management(output_table, "JCBH", "TEXT")
arcpy.AddField_management(output_table, "XMC", "TEXT")
arcpy.AddField_management(output_table, "JCMJ", "DOUBLE", field_precision=15, field_scale=4)
arcpy.AddField_management(output_table, "XZB", "DOUBLE", field_precision=15, field_scale=3)
arcpy.AddField_management(output_table, "YZB", "DOUBLE", field_precision=15, field_scale=3)
arcpy.DeleteField_management(output_table, "Field1")
# 打开游标,遍历要素类中的每个要素
with arcpy.da.SearchCursor(input_fc, fields) as cursor:
for row in cursor:
# 计算字段 例如 面积换算公顷
change_info = round(row[3] / 10000, 4)
# 将要素字段值 信息写入输出表格中
with arcpy.da.InsertCursor(output_table, fields) as icursor:
icursor.insertRow((row[0], row[1], row[2], change_info, row[4], row[5]))
# 将表格导出到Access数据库中
access_database = r"D:\mulu\other.mdb"
arcpy.TableToTable_conversion(output_table, access_database, "output_table")
4 后记
日常工作中导出属性表的操作比较频繁,操作也比较简单,只是处理多余字段较繁琐,偶尔几次完全可以手动操作,但是经常性的重复操作就可以使用arcpy代码实现。本文简单的介绍了用arcpy导出属性表的方法,可以在过程中增加内容,实现更为复杂的字段计算赋值等。