计算字段 (数据管理)

摘要

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

使用情况

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

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

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

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

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

  • 现有字段值将被覆盖。 如果想要保留原始字段值,请创建输入表副本。

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

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

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

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

  • 旧版本:

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

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

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

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

  • 可使用 typeextentcentroidfirstPointlastPointarealengthisMultipartpartCountGeometry 对象中的属性来创建 Python 表达式(例如 !shape.area!)。

  • Python 表达式可以将几何的 arealength 属性与面积或线性单位结合使用,从而将值转换为不同的测量单位(如 !shape.length@kilometers!)。 如果数据存储在地理坐标系中且具有线性单位(例如英里),则使用测地线算法计算长度。 在地理数据中使用面积单位会产生不正确的结果,这是因为沿地球面的十进制度数并不一致。

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

  • 通过结合使用 geodesicAreageodesicLength 属性与面积或线性测量单位,Python 表达式可用于计算要素的测地线面积或长度(如 !shape.geodesicArea@hectares!!shape.geodesicLength@miles!)。

  • ArcGIS 应用程序使用 UTF-16-LE 编码读写 .cal 文件。 只要输出使用 UTF-16-LE 编码编写,其他应用程序(如记事本)可用于创建或修改 .cal 文件。 使用任何其他编码将导致文件无法加载到代码段中。

  • 计算连接数据时,您无法直接计算连接列。 然而,您可以直接计算源表的列。 要计算连接数据,请先将连接表或连接图层添加至地图。 然后可以分别对此数据执行计算。 这些更改将反映在连接列中。

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

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

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

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

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

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

参数

标注说明数据类型
输入表

包含将使用新计算更新的字段的表。

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

将使用新计算更新的字段。

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

Field
表达式

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

SQL Expression
表达式类型
(可选)

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

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

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

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

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

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

  • Python 3将使用 Python 表达式类型。 这是默认设置。
  • Arcade将使用 Arcade 表达式类型。
  • SQL将使用 SQL 表达式类型。
String
代码块
(可选)

将为复杂表达式输入的代码块。

String
字段类型
(可选)

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

如果字段类型是文本,则新字段的长度为 512。 对于 shapefile 和 dBASE 文件,该字段的长度为 254。 可以使用更改字段工具调整新字段的长度。

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

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

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

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

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

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

String
code_block
(可选)

将为复杂表达式输入的代码块。

String
field_type
(可选)

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

如果字段类型是文本,则新字段的长度为 512。 对于 shapefile 和 dBASE 文件,该字段的长度为 254。 可以使用更改字段工具调整新字段的长度。

  • TEXT此字段类型将为文本类型。 文本字段支持字符串。
  • FLOAT此字段类型将为浮点型。 浮点型字段支持介于 -3.4E38 和 1.2E38 之间的小数。
  • DOUBLE此字段类型将为双精度型。 双精度型字段支持介于 -2.2E308 和 1.8E308 之间的小数。
  • SHORT此字段类型将为短整型。 短整型字段支持介于 -32,768 和 32,767 之间的整数。
  • LONG此字段类型将为长整型。 长整型字段支持介于 -2,147,483,648 和 2,147,483,647 之间的整数。
  • DATE此字段类型将为日期类型。 日期字段支持日期和时间值。
  • BLOB此字段类型将为 BLOB。 BLOB 字段支持存储为长度较长的一系列二进制数的数据。 您需要一个自定义的加载器、查看器或第三方应用程序将这些项加载到 BLOB 字段中或者查看 BLOB 字段的内容。
  • RASTER此字段类型将为栅格。 栅格字段格可在地理数据库中存储栅格数据或者将该数据与地理数据库一同存储。 可以存储 ArcGIS 软件支持的所有栅格数据集格式,但建议您仅使用小影像。
  • GUID此字段类型将为 GUID。 GUID 字段可存储注册表样式的字符串,该字符串包含用大括号括起来的 36 个字符。
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 窗口脚本演示了如何在即时模式下通过 ARCADE 使用 CalculateField 函数。

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

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

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

环境

特殊情况

传送字段属性域描述

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