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

一、前言

        我们知道在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("批量添加字段完成!")

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

你可能感兴趣的:(arcgis,python,开发语言)