我们知道在ARCGIS中常用的添加字段方式有一下几种:
1、使用属性表工具:打开ArcMap,选择要添加字段的图层,右键点击图层,选择属性表,在弹出的对话框中找到表选项,点击添加字段按钮,输入要添加的字段名称、数据类型等信息,点击确定按钮即可。
2、使用添加字段工具:打开ArcMap,在ArcToolbox中选择Data Management Tools -> Fields -> Add Field 工具,输入要添加字段的图层、输入要添加的字段名称、数据类型等信息,点击确定按钮即可。
3、使用Python脚本添加字段:使用ARCGIS的Pytho库,可以通过AddField_management本来添加字段。
在我们实际工作中,经常需要建库,会涉及大量的字段,因此,我们就希望能批量的添加字段。当然ARCGIS也提供了批量添加字段的功能,通过在ArcToolbox中选择Data Management Tools -> Fields -> Add Field 工具 ->右键批处理来添加字段,但是也是需要大量的输入,非常不方便。那么,我们能不能根据设定好的Excel模板,来批量添加字段呢?答案是:当然!
我们经常会看到一些数据库标准,规定的一些图层的字段如下:
字段Excel模板
序号 |
字段名称 |
字段代码 |
字段类型 |
字段长度 |
小数位数 |
值域 |
约束条件 |
备注 |
---|---|---|---|---|---|---|---|---|
1 |
标识码 |
BSM |
LONG |
10 |
|
>0 |
M |
|
2 |
要素代码 |
YSDM |
TEXT |
20 |
|
|
M |
|
3 |
地类编码 |
DLBM |
TEXT |
4 |
|
|
M |
|
4 |
地类名称 |
DLMC |
TEXT |
30 |
|
|
M |
|
5 |
图斑面积 |
TBMJ |
DOUBLE |
16 |
4 |
|
M |
|
6 |
图斑地类面积 |
TBDLMJ |
FLOAT |
16 |
2 |
|
M |
|
7 |
编号 |
TBBH |
SHORT |
4 |
|
|
M |
|
8 |
备注 |
BZ |
STRING |
50 |
|
|
M |
|
我们希望能根据以上模板,批量对图层新建字段。
我们把我们的想法告诉AI软件,让他帮我们写一段代码。但是往往信息专递与理解是有一些偏差的,AI提供的代码是很好的思路,这也是我们最想要的,将代码综合起来就可以得到我们想要的结果。
(1)列如,当我们输入:
用Python写一个完整的ARCGIS脚本代码,读取Excel中Sheet1的内容,对shp用AddField_management新建字段。Excel中从第二行开始,C列存储field_name,D列存储field_type,E列存储field_length ,F列存储field_scale,B列存储field_alias 并返回成功信息。
我们得到以下代码:
import arcpy
import xlrd
# 定义Excel文件路径
excel_path = r"path_to_excel_file.xlsx"
# 定义Sheet名称
sheet_name = "Sheet1"
def add_fields_from_excel(shp_path, excel_path, sheet_name):
# 打开Excel文件并获取工作表
workbook = xlrd.open_workbook(excel_path)
sheet = workbook.sheet_by_name(sheet_name)
# 获取字段信息的起始行数
start_row = 1
# 循环读取Excel中的字段信息并添加到shp文件
for row in range(start_row, sheet.nrows):
field_name = sheet.cell_value(row, 2) # C列存储field_name
field_type = sheet.cell_value(row, 3) # D列存储field_type
field_length = int(sheet.cell_value(row, 4)) # E列存储field_length
field_scale = int(sheet.cell_value(row, 5)) # F列存储field_scale
field_alias = sheet.cell_value(row, 1) # B列存储field_alias
# 使用AddField_management函数添加新字段
arcpy.AddField_management(shp_path, field_name, field_type, field_precision=field_length, field_scale=field_scale,
field_alias=field_alias)
return "字段添加成功!"
# 可以根据自己的实际情况修改以下参数
shp_file_path = r"path_to_shapefile.shp"
result = add_fields_from_excel(shp_file_path, excel_path, sheet_name)
print(result)
代码基本思路还算清晰,雏形已经出来了。
(2)列如,当我们输入:
Excel表格的Sheet1中,第一行为标题行,第二行开始,依次有field_alias在B列,field_name在C列,field_type在D列,field_length在E列,field_scale在F列, 用Python写一个完整的ARCGIS脚本代码,读取Excel中Sheet1的内容,对shp用AddField_management新建字段。执行成功后打印提示信息。
我们得到以下代码:
import arcpy
import xlrd
# 设置 Excel 文件路径和 Sheet 名称
excel_file = r"C:\path\to\your\excel_file.xlsx"
sheet_name = "Sheet1"
# 打开 Excel 文件
workbook = xlrd.open_workbook(excel_file)
sheet = workbook.sheet_by_name(sheet_name)
# 获取 Sheet 中有效数据的行数
num_rows = sheet.nrows
# 遍历每一行数据,从第二行开始
for row_index in range(1, num_rows):
field_alias = sheet.cell(rowx=row_index, colx=1).value
field_name = sheet.cell(rowx=row_index, colx=2).value
field_type = sheet.cell(rowx=row_index, colx=3).value
field_length = sheet.cell(rowx=row_index, colx=4).value
field_scale = sheet.cell(rowx=row_index, colx=5).value
# 添加新字段
arcpy.AddField_management("path/to/your/shp", field_name, field_type, field_length, field_scale, field_alias)
# 打印提示信息
print("新字段已成功添加到 shp 文件!")
跟前边的一样,思路也比较清晰,这段代码当遇到DOUBLE就出问题了。
(3)列如,当我们输入:
用Python写一个完整的arcgis脚本代码,对shapeflie通过读取Excel表格的sheet1来批量新增字段,添加字段完成后提示完成信息。其中,Excel表第一行为标题行,从第二行开始:B列代表field_alias;C列代表field_name;D列代表field_type;当D列为TEXT、STRING、GUID时E列代表field_length,当D列为SHORT、LONG、FLOAT、DOUBLE时E列代表field_precision;当D列为FLOAT、DOUBLE时F列代表field_scale。
我们得到以下代码:
import arcpy
import xlrd
# 设置输入的Shapefile路径
shapefile_path = r"path_to_shapefile\shapefile.shp"
# 设置输入的Excel表格路径
excel_path = r"path_to_excel\excel_file.xlsx"
# 设置Sheet的名称或索引,默认为第一个Sheet
sheet_name = "Sheet1"
# 打开Excel表格
excel_book = xlrd.open_workbook(excel_path)
# 获取指定的Sheet
sheet = excel_book.sheet_by_name(sheet_name)
# 获取Sheet的行数和列数
num_rows = sheet.nrows
num_cols = sheet.ncols
# 遍历从第二行开始的每一行数据
for row in range(1, num_rows):
# 获取字段别名、字段名、字段类型、字段长度等信息
field_alias = str(sheet.cell(row, 1).value)
field_name = str(sheet.cell(row, 2).value)
field_type = str(sheet.cell(row, 3).value)
field_length = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
field_precision = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
field_scale = sheet.cell(row, 5).value if sheet.cell(row, 5).value else None
# 根据字段类型创建字段对象
if field_type in ["TEXT", "STRING", "GUID"]:
field = arcpy.Field(field_name, field_type, field_alias, field_length)
elif field_type in ["SHORT", "LONG", "FLOAT", "DOUBLE"]:
field = arcpy.Field(field_name, field_type, field_alias, field_precision, field_scale)
# 打开编辑会话
edit = arcpy.da.Editor(arcpy.env.workspace)
edit.startEditing(False, True)
edit.startOperation()
# 批量添加字段
arcpy.AddField_management(shapefile_path, field_name, field_type, field_precision, field_scale,field_length, field_alias)
# 保存编辑结果
edit.stopOperation()
edit.stopEditing(True)
# 提示完成信息
print("批量添加字段完成!")
上边的代码也是没能覆盖所有类型,还是需要进一步修改。
四、结果
AI提供的这几个代码,给了我们很好的思路,读取Excel表的数据,遍历每一行数据,从第二行开始,这也是我们想要的,所以,综合起来,我们对代码进行了修改完善,得到我们想要的结果。
完整代码:
# -*- coding: UTF-8 -*-
import arcpy
import xlrd
# 设置输入的Shapefile路径
shapefile_path = r"path_to_shapefile\shapefile.shp"
# 设置输入的Excel表格路径
excel_path = r"path_to_excel\excel_file.xlsx"
# 设置Sheet的名称或索引,默认为第一个Sheet
sheet_name = "Sheet1"
# 打开Excel表格
excel_book = xlrd.open_workbook(excel_path)
# 获取指定的Sheet
sheet = excel_book.sheet_by_name(sheet_name)
# 获取Sheet的行数和列数
num_rows = sheet.nrows
num_cols = sheet.ncols
# 遍历从第二行开始的每一行数据
for row in range(1, num_rows):
# 获取字段别名、字段名、字段类型、字段长度等信息
field_alias = unicode(sheet.cell(row, 1).value).encode('utf-8')
field_name = unicode(sheet.cell(row, 2).value).encode('utf-8')
field_type = unicode(sheet.cell(row, 3).value).encode('utf-8')
field_length = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
field_precision = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
field_scale = sheet.cell(row, 5).value if sheet.cell(row, 5).value else None
# 根据字段类型创建字段对象
if field_type in ["TEXT", "STRING", "GUID"]:
arcpy.AddField_management(shapefile_path,field_name, field_type,"" ,"", field_length,field_alias)
elif field_type in ["SHORT", "LONG"]:
arcpy.AddField_management(shapefile_path,field_name, field_type,field_precision,"","",field_alias)
elif field_type in ["FLOAT", "DOUBLE"]:
arcpy.AddField_management(shapefile_path,field_name, field_type,field_precision,field_scale,"",field_alias)
# 提示完成信息
print("批量添加字段完成!")
以上代码其实还可以进一步完善,不足之处请广大网友指出,希望能看到您更好的想法。