当前位置:   article > 正文

【ArcGIS之AI写Python代码】(3)批量添加字段_arcgis批量添加字段

arcgis批量添加字段

一、前言

        我们知道在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 并返回成功信息

我们得到以下代码:

  1. import arcpy
  2. import xlrd
  3. # 定义Excel文件路径
  4. excel_path = r"path_to_excel_file.xlsx"
  5. # 定义Sheet名称
  6. sheet_name = "Sheet1"
  7. def add_fields_from_excel(shp_path, excel_path, sheet_name):
  8.     # 打开Excel文件并获取工作表
  9.     workbook = xlrd.open_workbook(excel_path)
  10.     sheet = workbook.sheet_by_name(sheet_name)
  11.     # 获取字段信息的起始行数
  12.     start_row = 1
  13.     # 循环读取Excel中的字段信息并添加到shp文件
  14.     for row in range(start_row, sheet.nrows):
  15.         field_name = sheet.cell_value(row, 2# C列存储field_name
  16.         field_type = sheet.cell_value(row, 3# D列存储field_type
  17.         field_length = int(sheet.cell_value(row, 4))  # E列存储field_length
  18.         field_scale = int(sheet.cell_value(row, 5))  # F列存储field_scale
  19.         field_alias = sheet.cell_value(row, 1# B列存储field_alias
  20.        
  21.         # 使用AddField_management函数添加新字段
  22.         arcpy.AddField_management(shp_path, field_name, field_type, field_precision=field_length, field_scale=field_scale,
  23.                                   field_alias=field_alias)
  24.     return "字段添加成功!"
  25. # 可以根据自己的实际情况修改以下参数
  26. shp_file_path = r"path_to_shapefile.shp"
  27. result = add_fields_from_excel(shp_file_path, excel_path, sheet_name)
  28. 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新建字段。执行成功后打印提示信息

我们得到以下代码:

  1. import arcpy
  2. import xlrd
  3. # 设置 Excel 文件路径和 Sheet 名称
  4. excel_file = r"C:\path\to\your\excel_file.xlsx"
  5. sheet_name = "Sheet1"
  6. # 打开 Excel 文件
  7. workbook = xlrd.open_workbook(excel_file)
  8. sheet = workbook.sheet_by_name(sheet_name)
  9. # 获取 Sheet 中有效数据的行数
  10. num_rows = sheet.nrows
  11. # 遍历每一行数据,从第二行开始
  12. for row_index in range(1, num_rows):
  13.     field_alias = sheet.cell(rowx=row_index, colx=1).value
  14.     field_name = sheet.cell(rowx=row_index, colx=2).value
  15.     field_type = sheet.cell(rowx=row_index, colx=3).value
  16.     field_length = sheet.cell(rowx=row_index, colx=4).value
  17.     field_scale = sheet.cell(rowx=row_index, colx=5).value
  18.     # 添加新字段
  19.     arcpy.AddField_management("path/to/your/shp", field_name, field_type, field_length, field_scale, field_alias)
  20. # 打印提示信息
  21. 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。

我们得到以下代码:

  1. import arcpy
  2. import xlrd
  3. # 设置输入的Shapefile路径
  4. shapefile_path = r"path_to_shapefile\shapefile.shp"
  5. # 设置输入的Excel表格路径
  6. excel_path = r"path_to_excel\excel_file.xlsx"
  7. # 设置Sheet的名称或索引,默认为第一个Sheet
  8. sheet_name = "Sheet1"
  9. # 打开Excel表格
  10. excel_book = xlrd.open_workbook(excel_path)
  11. # 获取指定的Sheet
  12. sheet = excel_book.sheet_by_name(sheet_name)
  13. # 获取Sheet的行数和列数
  14. num_rows = sheet.nrows
  15. num_cols = sheet.ncols
  16. # 遍历从第二行开始的每一行数据
  17. for row in range(1, num_rows):
  18.     # 获取字段别名、字段名、字段类型、字段长度等信息
  19.     field_alias = str(sheet.cell(row, 1).value)
  20.     field_name = str(sheet.cell(row, 2).value)
  21.     field_type = str(sheet.cell(row, 3).value)
  22.     field_length = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
  23.     field_precision = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
  24.     field_scale = sheet.cell(row, 5).value if sheet.cell(row, 5).value else None
  25.    
  26.     # 根据字段类型创建字段对象
  27.     if field_type in ["TEXT", "STRING", "GUID"]:
  28.         field = arcpy.Field(field_name, field_type, field_alias, field_length)
  29.     elif field_type in ["SHORT", "LONG", "FLOAT", "DOUBLE"]:
  30.         field = arcpy.Field(field_name, field_type, field_alias, field_precision, field_scale)
  31.     # 打开编辑会话
  32.     edit = arcpy.da.Editor(arcpy.env.workspace)
  33.     edit.startEditing(False, True)
  34.     edit.startOperation()
  35.     # 批量添加字段
  36.     arcpy.AddField_management(shapefile_path, field_name, field_type, field_precision, field_scale,field_length, field_alias)
  37.     # 保存编辑结果
  38.     edit.stopOperation()
  39.     edit.stopEditing(True)
  40. # 提示完成信息
  41. print("批量添加字段完成!")

        上边的代码也是没能覆盖所有类型,还是需要进一步修改。

四、结果

AI提供的这几个代码,给了我们很好的思路,读取Excel表的数据,遍历每一行数据,从第二行开始,这也是我们想要的,所以,综合起来,我们对代码进行了修改完善,得到我们想要的结果。

完整代码:

  1. # -*- coding: UTF-8 -*-
  2. import arcpy
  3. import xlrd
  4. # 设置输入的Shapefile路径
  5. shapefile_path = r"path_to_shapefile\shapefile.shp"
  6. # 设置输入的Excel表格路径
  7. excel_path = r"path_to_excel\excel_file.xlsx"
  8. # 设置Sheet的名称或索引,默认为第一个Sheet
  9. sheet_name = "Sheet1"
  10. # 打开Excel表格
  11. excel_book = xlrd.open_workbook(excel_path)
  12. # 获取指定的Sheet
  13. sheet = excel_book.sheet_by_name(sheet_name)
  14. # 获取Sheet的行数和列数
  15. num_rows = sheet.nrows
  16. num_cols = sheet.ncols
  17. # 遍历从第二行开始的每一行数据
  18. for row in range(1, num_rows):
  19.     # 获取字段别名、字段名、字段类型、字段长度等信息
  20.     field_alias = unicode(sheet.cell(row, 1).value).encode('utf-8')
  21.     field_name = unicode(sheet.cell(row, 2).value).encode('utf-8')
  22.     field_type = unicode(sheet.cell(row, 3).value).encode('utf-8')
  23.     field_length = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
  24.     field_precision = sheet.cell(row, 4).value if sheet.cell(row, 4).value else None
  25.     field_scale = sheet.cell(row, 5).value if sheet.cell(row, 5).value else None   
  26.     # 根据字段类型创建字段对象
  27.     if field_type in ["TEXT", "STRING", "GUID"]:
  28.         arcpy.AddField_management(shapefile_path,field_name, field_type,"" ,"", field_length,field_alias)
  29.     elif field_type in ["SHORT", "LONG"]:
  30.         arcpy.AddField_management(shapefile_path,field_name, field_type,field_precision,"","",field_alias)
  31.     elif field_type in ["FLOAT", "DOUBLE"]:
  32.         arcpy.AddField_management(shapefile_path,field_name, field_type,field_precision,field_scale,"",field_alias)
  33. # 提示完成信息
  34. print("批量添加字段完成!")

          以上代码其实还可以进一步完善,不足之处请广大网友指出,希望能看到您更好的想法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/228124
推荐阅读
相关标签
  

闽ICP备14008679号