赞
踩
我们知道在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("批量添加字段完成!")
以上代码其实还可以进一步完善,不足之处请广大网友指出,希望能看到您更好的想法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。