描述
为要素类、要素图层或栅格计算字段的值。
使用方法
要了解有关 Python 表达式的详细信息,请参阅计算字段 Python 示例。
要了解有关 Arcade 表达式的详细信息,请参阅 ArcGIS Arcade 指南。
要了解有关 SQL 表达式的详细信息,请参阅计算字段值。
每次操作仅能对一个字段应用计算。要应用多个计算,请使用计算字段工具。
现有字段值将被覆盖。如果想要保留原始字段值,请创建输入表副本。
对于 Python 计算,必须在字段名称两边添加惊叹号 (!fieldname!)。
对于 Arcade 计算,字段名称必须以 $feature. 为前缀(例如,$feature.fieldname)。
计算文本或字符字段的字符串时,在对话框中,字符串必须使用双引号("字符串"),而在脚本中,还必须对使用双引号的字符串两边添加单引号('"字符串"')。
要计算数值字段,可在表达式参数中输入数值;值的两旁无需加引号。
代码块参数可用于创建复杂表达式。您可以在对话框中直接输入代码块,或在脚本中将代码块作为连续字符串输入。表达式与代码块会相互连接。代码块必须关联回表达式;代码块的结果应传入表达式中。
只有 Python 表达式支持代码块参数。
可在代码块参数中使用 Python math 模块及格式。您可以导入附加模块。math 模块可提供数论函数与表达函数、幂函数与对数函数、三角函数、角度转换函数、双曲函数以及数学常数。要了解更多有关 math 模块的内容,请参阅 Python 帮助。
可使用 type、extent、centroid、firstPoint、lastPoint、area、length、 isMultipart 和 partCount 等 Geometry 对象中的属性来创建 Python 表达式(例如 !shape.area!)。
Python 表达式可以将几何的 area 与 length 属性与面积或线性单位结合使用,从而将值转换为不同的测量单位(如 !shape.length@kilometers!)。如果数据存储在地理坐标系中且具有线性单位(例如英里),则使用测地线算法计算长度。在地理数据中使用面积单位会产生不正确的结果,这是因为沿地球面的十进制度数并不一致。
- 面积测量单位关键字:
- ACRES | ARES | HECTARES | SQUARECENTIMETERS | SQUAREDECIMETERS | SQUAREINCHES | SQUAREFEET | SQUAREKILOMETERS | SQUAREMETERS | SQUAREMILES | SQUAREMILLIMETERS | SQUAREYARDS | SQUAREMAPUNITS | UNKNOWN
- 线性测量单位关键字:
- CENTIMETERS | DECIMALDEGREES | DECIMETERS | FEET | INCHES | KILOMETERS | METERS | MILES | MILLIMETERS | NAUTICALMILES | POINTS | UNKNOWN | YARDS
- 面积测量单位关键字:
通过结合使用 geodesicArea 或 geodesicLength 属性与面积或线性测量单位,Python 表达式可用于计算要素的测地线面积或长度(如 !shape.geodesicArea@hectares! 或 !shape.geodesicLength@miles!)。
ArcGIS 应用程序使用 UTF-16-LE 编码读写 .cal 文件。只要输出使用 UTF-16-LE 编码编写,其他应用程序(如记事本)可用于创建或修改 .cal 文件。使用任何其他编码将导致文件无法加载到代码段中。
计算连接数据时,您无法直接计算连接列。然而,您可以直接计算源表的列。要计算连接数据,必须先将连接表或连接图层添加至地图。然后可以分别对此数据执行计算。这些更改将反映在连接列中。
如果 Python 表达式尝试串联含有空值或者除数为零的字符串字段,则会为该字段值返回空值。
SQL 表达式可用于加快要素服务和企业级地理数据库的计算速度。使用该表达式可以将单次请求设置为服务器或数据库,而不必一次执行一个要素或一行的计算,从而显著提高计算速度。
仅要素服务和企业级地理数据库支持 SQL 表达式。对于其他格式,请使用 Python 或 Arcade 表达式。
使用表达式类型参数的 SQL 选项对企业级地理数据库设置以下限制:
- 该选项仅支持 Db2、Oracle、PostgreSQL、SAP HANA 和 SQL Server。
- 不支持在连接表上计算字段值。
- 版本ed data is not supported.
- 不支持撤消地理处理操作功能。
有关 SQL 表达式的帮助,请参阅数据库供应商文档。
旧版本:
自 ArcGIS Pro 2.0 起不再支持 arcgis.rand()。应使用利用 Python random 模块的类似函数。要成功使用 random 模块,请将其作为导入添加到代码块参数中。
语法
arcpy.management.CalculateField(in_table, field, expression, {expression_type}, {code_block}, {field_type})
参数 | 说明 | 数据类型 |
in_table | 包含将通过新的计算进行更新的字段的表。 | Mosaic Layer; Raster Layer; Table View |
field | 将通过新的计算进行更新的字段。 如果输入表中不存在具有指定名称的字段,则会添加该字段。 | Field |
expression | 创建值以填充所选行的简单计算表达式。 | SQL Expression |
expression_type (可选) | 指定要使用的表达式类型。
要了解有关 Python 表达式的详细信息,请参阅计算字段示例。 要了解有关 Arcade 表达式的详细信息,请参阅 ArcGIS Arcade 指南。 要了解有关 SQL 表达式的详细信息,请参阅计算字段值。 SQL 表达式可用于加快要素服务和企业级地理数据库的计算速度。使用该表达式可以将单次请求设置为服务器或数据库,而不必一次执行一个要素或一行的计算,从而显著提高计算速度。 仅要素服务和企业级地理数据库支持 SQL 表达式。对于其他格式,请使用 Python 或 Arcade 表达式。 | String |
code_block (可选) | 将为复杂表达式输入的代码块。 | String |
field_type (可选) | 指定新字段的字段类型。仅当输入表中不存在字段名称时才使用此参数。 如果字段类型是文本,则新字段的长度为 512。对于 shapefile 和 dBASE 文件,该字段的长度为 254。可以使用更改字段工具调整新字段的长度。
| String |
派生输出
名称 | 说明 | 数据类型 |
out_table | 已更新的表。 | 表视图;栅格图层;镶嵌图层 |
代码示例
以下 Python 窗口脚本演示了如何在即时模式下使用 CalculateField 函数。
import arcpy
arcpy.env.workspace = "C:/data"
arcpy.AddField_management("vegtable.dbf", "VEG_TYP2", "TEXT", "", "", "20")
arcpy.CalculateField_management("vegtable.dbf", "VEG_TYP2",
'!VEG_TYPE!.split(" ")[-1]', "PYTHON3")
使用 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.AddField_management(inFeatures, fieldName1, "DOUBLE",
fieldPrecision, fieldScale)
arcpy.AddField_management(inFeatures, fieldName2, "DOUBLE",
fieldPrecision, fieldScale)
# Calculate centroid
arcpy.CalculateField_management(inFeatures, fieldName1,
"!SHAPE.CENTROID.X!",
"PYTHON3")
arcpy.CalculateField_management(inFeatures, fieldName2,
"!SHAPE.CENTROID.Y!",
"PYTHON3")
使用具有代码块的 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"""
# Execute AddField
arcpy.AddField_management(inTable, fieldName, "SHORT")
# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName, expression, "PYTHON3",
codeblock)
使用 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"
# Execute AddField
arcpy.AddField_management(inFeatures, fieldName, "LONG")
# Execute CalculateField
arcpy.CalculateField_management(inFeatures, fieldName, expression, "PYTHON3",
code_block)
以下 Python 窗口脚本演示了如何在即时模式下通过 CalculateField 使用 ARCADE 函数。
import arcpy
arcpy.env.workspace = "C:/data/fgdb.gdb"
arcpy.CalculateField_management("data", "new_value", "$feature.value1 + $feature.value2", "ARCADE")
以下 Python 窗口脚本演示了如何在即时模式下通过 CalculateField 使用 SQL 函数。
import arcpy
feature_service = "<a feature service url>"
arcpy.CalculateField_management("data", "NEW_VALUE", "SAMPLE * (BASELINE - 40)", "SQL")
许可信息
- Basic: 是
- Standard: 是
- Advanced: 是