计算字段 (数据管理)

摘要

为要素类、要素图层或栅格计算字段的值。

使用情况

    警告:

    此工具会修改输入数据。 有关详细信息以及避免数据被意外更改的策略,请参阅修改或更新输入数据的工具

  • 要了解有关 Python 表达式的详细信息,请参阅计算 Python 字段示例

    要了解有关 Arcade 表达式的详细信息,请参阅 ArcGIS Arcade 指南

    要了解有关 SQL 表达式的详细信息,请参阅计算字段值

    要了解有关 VBScript 表达式的详细信息,请参阅计算字段 VBScript 示例

  • 使用所选要素集(如从创建要素图层按属性选择图层工具内的查询中创建的要素集)时,此工具将只更新所选的记录。

  • 每次操作仅能对一个字段应用计算。 要应用多个计算,请使用计算字段工具。

  • 现有字段值将被覆盖。 要保留原始值,请创建输入表的副本作为备份,或者使用地理处理窗格中的启用撤消选项。

  • 对于 Python 计算,必须在字段名称两边添加惊叹号(例如,!fieldname!)。

    对于 Arcade 计算,字段名称必须以 $feature. 为前缀(例如,$feature.fieldname)。

  • 对于与不同字段类型之间的时间值传输相关的计算,请考虑使用转换时间字段工具作为替代方案。

  • 计算文本或字符字段的字符串时,在对话框中,字符串必须使用双引号(例如"字符串"),而在脚本中,还必须对使用双引号的字符串两边添加单引号(例如,'"string"')。

  • 要计算数值字段,可在表达式参数中输入数值;值的两旁无引号。

  • 旧版本:

    ArcGIS AllSource 2.0 起不再支持 arcgis.rand()。应使用利用 Python random 模块的类似函数。要成功使用 random 模块,请将其作为导入添加到代码块参数中。

  • 您可以使用代码块参数来创建复杂表达式。 可在对话框中直接输入代码块,或在脚本中将代码块作为字符串输入。 表达式与代码块会相互连接。 代码块必须返回与表达式的关联;代码块的结果必须传入到表达式中。

    Python 表达式支持代码块参数。

  • 您可以在代码块参数中使用 Python math 模块及格式。 您还可以导入附加模块。 math 模块可提供数论函数与表达函数、幂函数与对数函数、三角函数、角度转换函数、双曲函数以及数学常数。 要了解更多有关 math 模块的内容,请参阅 Python 帮助。

  • 要在 Python 中计算几何信息,请使用 Geometry 对象属性。 例如,使用 !shape.pointCount! 表达式计算要素中的折点数。

    注:

    计算几何属性工具支持相似的计算。

    要在 Python 中计算面积和长度,请使用包含方法和单位类型的 getAreagetLength 方法。

    • 要以平方千米为单位计算面的测地线面积,请使用以下表达式:
      !shape.getArea('GEODESIC', 'SQUAREKILOMETERS')!
    • 要以码为单位计算折线(或面)的平面长度,请使用以下表达式:
      !shape.getArea('PLANAR', 'YARDS')

    有关详细信息,请参阅 PolygonPolyline 对象。

    了解有关地理处理工具以及线性和面积单位的详细信息

  • ArcGIS 应用程序使用 UTF-16-LE 编码读写 .cal 文件。 只要文件使用 UTF-16-LE 编码编写,其他应用程序(如 Notepad)可用于创建或修改 .cal 文件。 使用任何其他编码的文件无法加载到代码块中。

  • 使用连接数据时,您仅可以更新源表中的字段。 您无法更新连接表中的字段。 要在连接表上执行计算,请直接在该表上执行计算。

  • 如果 Python 表达式尝试串联含有空值或者除数为零值的字符串字段,则会为该字段值返回空值。

  • SQL 表达式可用于加快要素服务和企业级地理数据库的计算速度。 使用该表达式可以将单次请求设置为服务器或数据库,而不必一次执行一个要素或一行的计算,从而提高计算速度。

    仅要素服务和企业级地理数据库支持 SQL 表达式。 对于其他格式,请使用 PythonArcade 表达式。

    SQL 选项用于表达式类型参数具有以下限制:

    • 该选项仅支持 Db2OraclePostgreSQLSAP HANASQL Server 企业级地理数据库。
    • 不支持在连接表上计算字段值。
    • 不支持版本化和存档的企业级地理数据库数据。
    • 不支持撤消地理处理操作

    有关 SQL 表达式的帮助,请参阅数据库供应商文档。

  • 工具对话框中的表达式参数具有一个插值下拉列表,可以从字段列表中的选定字段或选定字段的属性域中添加字段值或属性域值。 使用属性域值可确保仅向字段插入属性域的有效值。

参数

标注说明数据类型
输入表

包含将通过新的计算进行更新的字段的表。

Mosaic Layer; Raster Layer; Table View
字段名称(现有或新建)

将通过新的计算进行更新的字段。

如果输入表中不存在具有指定名称的字段,则会添加该字段。

Field
表达式

用于创建填充所选行的值的简单计算表达式。

SQL Expression
表达式类型
(可选)

指定要使用的表达式类型。

如果输入是要素服务,则默认表达式类型为 SQL。 对于任意类型的输入,默认表达式类型均为 Python

要了解有关 Python 表达式的详细信息,请参阅计算 Python 字段示例

要了解有关 Arcade 表达式的详细信息,请参阅 ArcGIS Arcade 指南

要了解有关 SQL 表达式的详细信息,请参阅计算字段值

SQL 表达式可用于加快要素服务和企业级地理数据库的计算速度。 使用该表达式可以将单次请求发送到服务器或数据库,而不必一次执行一个要素或一行的计算,从而显著提高计算速度。

仅要素服务和企业级地理数据库支持 SQL 表达式。 对于其他格式,请使用 PythonArcade 表达式。

要了解有关 VBScript 表达式的详细信息,请参阅计算字段 VBScript 示例

  • Python将使用 Python 表达式类型。
  • Arcade将使用 Arcade 表达式类型。
  • SQL将使用 SQL 表达式类型。
  • VBScript将使用 VBScript 表达式类型。
String
代码块
(可选)

将用于复杂 Python 或 VBScript 表达式的代码块。

String
字段类型
(可选)

指定新字段的字段类型。 仅当输入表中不存在字段名称时才使用此参数。

如果字段的类型为文本,则该字段的长度为 512,除非输入为 shapefile 或 dBASE 文件,在这种情况下,长度将为 254。要调整长度,请使用修改字段工具。

  • 短整型(16 位整型)字段类型将为短整型。 短整形字段支持介于 -32,768 和 32,767 之间的整数。
  • 长整型(32 位整数)字段类型将为长整型。 长整型字段支持介于 2,147,483,648 和 2,147,483,647 之间的整数。
  • 大整数(64 位整数)此字段类型将为大整数。 大整数字段支持 -(253) 和 253 之间的整数。
  • 浮点型(32 位浮点型)字段类型将为浮点型。 浮点型字段支持介于 -3.4E38 和 1.2E38 之间的小数。
  • 双精度型(64 位浮点型)字段类型将为双精度型。 双精度字段支持介于 -2.2E308 和 1.8E308 之间的小数。
  • 文本字段类型将为文本型。 文本字段支持字符串。
  • 日期字段类型将为日期型。 日期字段支持日期和时间值。
  • 日期(高精度)日期字段类型将为高精度。 高精度日期字段支持毫秒时间的日期和时间值。
  • 仅日期此字段类型将仅为日期。 仅日期字段支持不带时间值的日期值。
  • 仅时间此字段类型将仅为时间。 仅时间字段支持不带日期值的时间值。
  • 时间戳偏移此字段类型将为时间戳偏移。 时间戳偏移字段支持日期、时间和相对于 UTC 值的偏移。
  • BLOB(二进制数据)此字段类型将为 BLOB。 BLOB 字段支持将数据存储为长度较长的一系列二进制数。 您需要一个自定义的加载器、查看器或第三方应用程序将这些项加载到 BLOB 字段中或者查看 BLOB 字段的内容。
  • GUID(全局唯一标识符)此字段类型将为 GUID。 GUID 字段可存储注册表样式的字符串,该字符串包含用大括号括起来的 36 个字符。
  • 栅格此字段类型将为栅格。 栅格字段格可在地理数据库中存储栅格数据或者将该数据与地理数据库一同存储。 可以存储 ArcGIS 软件支持的所有栅格数据集格式,但建议您仅使用小影像。
String
强制域
(可选)

指定是否强制执行字段属性域规则。

  • 选中 - 将强制执行字段属性域规则。 如果无法更新字段,则字段值将保持不变,并且工具消息中将包含警告消息。
  • 未选中 - 不强制执行字段属性域规则。 这是默认设置
Boolean

派生输出

标注说明数据类型
更新的输入表

已更新的表。

Table View; Raster Layer; Mosaic Layer

arcpy.management.CalculateField(in_table, field, expression, {expression_type}, {code_block}, {field_type}, {enforce_domains})
名称说明数据类型
in_table

包含将通过新的计算进行更新的字段的表。

Mosaic Layer; Raster Layer; Table View
field

将通过新的计算进行更新的字段。

如果输入表中不存在具有指定名称的字段,则会添加该字段。

Field
expression

用于创建填充所选行的值的简单计算表达式。

SQL Expression
expression_type
(可选)

指定要使用的表达式类型。

  • PYTHON3将使用 Python 表达式类型。
  • ARCADE将使用 Arcade 表达式类型。
  • SQL将使用 SQL 表达式类型。
  • VB将使用 VBScript 表达式类型。

如果输入是要素服务,则默认表达式类型为 SQL。 对于任意类型的输入,默认表达式类型均为 PYTHON3

要了解有关 Python 表达式的详细信息,请参阅计算 Python 字段示例

要了解有关 Arcade 表达式的详细信息,请参阅 ArcGIS Arcade 指南

要了解有关 SQL 表达式的详细信息,请参阅计算字段值

SQL 表达式可用于加快要素服务和企业级地理数据库的计算速度。 使用该表达式可以将单次请求发送到服务器或数据库,而不必一次执行一个要素或一行的计算,从而显著提高计算速度。

仅要素服务和企业级地理数据库支持 SQL 表达式。 对于其他格式,请使用 PythonArcade 表达式。

要了解有关 VBScript 表达式的详细信息,请参阅计算字段 VBScript 示例

String
code_block
(可选)

将用于复杂 Python 或 VBScript 表达式的代码块。

String
field_type
(可选)

指定新字段的字段类型。 仅当输入表中不存在字段名称时才使用此参数。

如果字段的类型为文本,则该字段的长度为 512,除非输入为 shapefile 或 dBASE 文件,在这种情况下,长度将为 254。要调整长度,请使用修改字段工具。

  • SHORT字段类型将为短整型。 短整形字段支持介于 -32,768 和 32,767 之间的整数。
  • LONG字段类型将为长整型。 长整型字段支持介于 2,147,483,648 和 2,147,483,647 之间的整数。
  • BIGINTEGER此字段类型将为大整数。 大整数字段支持 -(253) 和 253 之间的整数。
  • FLOAT字段类型将为浮点型。 浮点型字段支持介于 -3.4E38 和 1.2E38 之间的小数。
  • DOUBLE字段类型将为双精度型。 双精度字段支持介于 -2.2E308 和 1.8E308 之间的小数。
  • TEXT字段类型将为文本型。 文本字段支持字符串。
  • DATE字段类型将为日期型。 日期字段支持日期和时间值。
  • DATEHIGHPRECISION日期字段类型将为高精度。 高精度日期字段支持毫秒时间的日期和时间值。
  • DATEONLY此字段类型将仅为日期。 仅日期字段支持不带时间值的日期值。
  • TIMEONLY此字段类型将仅为时间。 仅时间字段支持不带日期值的时间值。
  • TIMESTAMPOFFSET此字段类型将为时间戳偏移。 时间戳偏移字段支持日期、时间和相对于 UTC 值的偏移。
  • BLOB此字段类型将为 BLOB。 BLOB 字段支持将数据存储为长度较长的一系列二进制数。 您需要一个自定义的加载器、查看器或第三方应用程序将这些项加载到 BLOB 字段中或者查看 BLOB 字段的内容。
  • GUID此字段类型将为 GUID。 GUID 字段可存储注册表样式的字符串,该字符串包含用大括号括起来的 36 个字符。
  • RASTER此字段类型将为栅格。 栅格字段格可在地理数据库中存储栅格数据或者将该数据与地理数据库一同存储。 可以存储 ArcGIS 软件支持的所有栅格数据集格式,但建议您仅使用小影像。
String
enforce_domains
(可选)

指定是否强制执行字段属性域规则。

  • ENFORCE_DOMAINS将强制执行字段属性域规则。
  • NO_ENFORCE_DOMAINS不强制执行字段属性域规则。 这是默认设置。
Boolean

派生输出

名称说明数据类型
out_table

已更新的表。

Table View; Raster Layer; Mosaic Layer

代码示例

CalculateField 示例 1(Python 窗口)

以下 Python 窗口脚本演示了如何在即时模式下使用 CalculateField 函数。

import arcpy
arcpy.env.workspace = "C:/data"
arcpy.management.AddField("vegtable.dbf", "VEG_TYP2", "TEXT", "", "", "20")
arcpy.management.CalculateField("vegtable.dbf", "VEG_TYP2", 
                                '!VEG_TYPE!.split(" ")[-1]', "PYTHON3")
CalculateField 示例 2(独立脚本)

使用 CalculateField 函数将质心值分配给新字段。

# Name: CalculateField_centroids.py

# Import system modules
import arcpy

# Set environment settings
arcpy.env.workspace = "C:/data/airport.gdb"
 
# Set local variables
inFeatures = "parcels"
fieldName1 = "xCentroid"
fieldName2 = "yCentroid"
fieldPrecision = 18
fieldScale = 11
 
# Add fields
arcpy.management.AddField(inFeatures, fieldName1, "DOUBLE", 
                          fieldPrecision, fieldScale)
arcpy.management.AddField(inFeatures, fieldName2, "DOUBLE", 
                          fieldPrecision, fieldScale)
 
# Calculate centroid
arcpy.management.CalculateField(inFeatures, fieldName1, 
                                "!SHAPE.CENTROID.X!",
                                "PYTHON3")
arcpy.management.CalculateField(inFeatures, fieldName2, 
                                "!SHAPE.CENTROID.Y!",
                                "PYTHON3")
CalculateField 示例 3(独立脚本)

使用具有代码块的 CalculateField 函数计算基于范围的值。

# Name: CalculateField_ranges.py

# Import system modules
import arcpy
 
# Set environment settings
arcpy.env.workspace = "C:/data/airport.gdb"
 
# Set local variables
inTable = "parcels"
fieldName = "areaclass"
expression = "getClass(float(!SHAPE.area!))"

codeblock = """
def getClass(area):
    if area <= 1000:
        return 1
    if area > 1000 and area <= 10000:
        return 2
    else:
        return 3"""
 
# Run AddField
arcpy.management.AddField(inTable, fieldName, "SHORT")
 
# Run CalculateField 
arcpy.management.CalculateField(inTable, fieldName, expression, "PYTHON3", 
                                codeblock)
CalculateField 示例 4(独立脚本)

使用 CalculateField 函数将随机值分配给新字段。

# Name: CalculateField_Random.py

# Import system modules
import arcpy
import random
 
# Set environment settings
arcpy.env.workspace = "C:/data/airport.gdb"
  
# Set local variables
inFeatures = "parcels"
fieldName = "RndValue"
expression = "random.randint(0, 10)"
code_block = "import random"
 
# Run AddField
arcpy.management.AddField(inFeatures, fieldName, "LONG")
 
# Run CalculateField 
arcpy.management.CalculateField(inFeatures, fieldName, expression, "PYTHON3", 
                                code_block)
CalculateField 示例 5(Python 窗口)

以下 Python 窗口脚本示例演示了如何在立即模式下将 CalculateField 函数与 Arcade 配合使用。

import arcpy
arcpy.env.workspace = "C:/data/fgdb.gdb"
arcpy.management.CalculateField("data", "new_value", "$feature.value1 + $feature.value2", "ARCADE")
CalculateField 示例 6(Python 窗口)

以下 Python 窗口脚本示例演示了如何在立即模式下将 CalculateField 函数与 SQL 配合使用。

import arcpy
feature_service = "<a feature service url>"
arcpy.management.CalculateField("data", "NEW_VALUE", "SAMPLE * (BASELINE - 40)", "SQL")

环境

特殊情况

传送字段属性域描述

启用此环境后,任何具有关联属性域的字段都将使用属性域描述,而非字段的值。 没有属性域的字段的值将不受影响。

相关主题