“计算字段”工具位于数据管理工具箱下的“字段”工具集中。这与您在属性表的字段快捷菜单中单击字段计算器命令所打开的工具相同。执行字段计算时,了解正在使用的数据的类型及其将应用于何种环境是非常重要的。计算表达式中所必须使用的语法因数据源和脚本语言的不同而有所差异。
下面列出了各种使用“计算字段”工具过程中的重要提示及最佳做法。
“计算字段”工具的提示及最佳做法
为要素类、要素图层或栅格计算字段的值。
可使用 VBScript 或标准 Python 格式创建表达式。表达式所使用的字符串的格式化样式应当与上下文环境(类型)相适应。
可使用几何对象(包括 type、extent、centroid、firstPoint、lastPoint、area、length、isMultipart 和 partCount)中的属性来创建 Python 表达式,例如 !shape.area!。
Python 表达式可以将几何的 area 与 length 属性与面积或线性单位结合使用,从而将值转换为不同的测量单位(如 !shape.length@kilometers!)。如果数据存储在地理坐标系中且具有线性单位(例如英里),则使用测地线算法计算长度。在地理数据中使用面积单位会产生不正确的结果,这是因为沿地球面的十进制度数并不一致。
!shape.area@acres!
- 面积测量单位关键字:
- 英亩 | 公亩 | 公顷 | 平方厘米 | 平方分米 | 平方英寸 | 平方英尺 | 平方千米 | 平方米 | 平方英里 | 平方毫米 | 平方码 | 平方地图单位 | 未知
- 线性测量单位关键字:
- 厘米 | 十进制度 | 分米 | 英尺 | 英寸 | 千米 | 米 | 英里 | 毫米 | 海里 | 磅 | 未知 | 码
使用所选要素集(如从创建要素图层或按属性选择图层内的查询中创建的要素集)时,此工具将只更新所选的记录。
每次操作仅能对一个字段应用计算。
对于 VBScript,字段名始终用 [ ] 括起来。
对于 Python 计算,必须在字段名称两边添加惊叹号(!fieldname!)。
计算文本或字符字段的字符串时,在对话框中,字符串必须使用双引号("字符串"),而在脚本中,还必须对使用双引号的字符串添加单引号('"字符串"')。
This tool can also be used to update character items. Expressions using a character string should be wrapped, using single quotes—for example, [CHARITEM] = 'NEW STRING'. However, if the character string has embedded single quotes, wrap the string using double quotes—for example, [CHARITEM] = "TYPE'A'".
要计算数值字段,可在表达式参数中输入数值;值的两旁无需加引号。
“计算字段”工具支持 arcgis.rand() 函数,但表达式类型必须是 Python。arcgis.rand() 函数是为 ArcGIS 工具而创建,不应与 Python Rand() 函数相混淆。
表达式与代码块会相互连接。代码块必须返回与表达式的关联;代码块的结果应传入到表达式中。
Python math模块及格式可供代码块参数使用。您可以导入附加模块。math模块可提供数论函数与表达函数、幂函数与对数函数、三角函数、角度转换函数、双曲函数以及数学常数。要了解更多有关math模块的内容,请参阅 Python 帮助。
Saved VB .cal files from previous versions of ArcGIS may work or require minimal modifications. If you have VBA code from past releases that use ArcObjects, you will need to modify your calculations to work.
计算连接数据时,您无法直接计算连接列。然而,您可以直接计算源表的列。要计算连接数据,必须先将连接表或连接图层添加至地图。然后可以分别对此数据执行计算。这些更改将反映在连接列中。
在 ArcGIS Engine Runtime 或 ArcGIS for Server 中运行“计算字段”时,表达式类型必须为 Python。如果工具被包含在将要发布到 ArcGIS for Server 的模型中,您就只能用 Python 作为表达式类型。
使用“计算字段”工具的代码块示例
计算字段 (CalculateField) 示例:计算质心
使用 CalculateField 将质心值分配给新字段。
# Name: CalculateField_Centroids.py
# Description: Use CalculateField to assign centroid values to new fields
# Import system modules
import arcpy
try:
# 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!",
"PYTHON_9.3")
arcpy.CalculateField_management(inFeatures, fieldName2,
"!SHAPE.CENTROID.Y!",
"PYTHON_9.3")
except Exception:
e = sys.exc_info()[1]
print(e.args[0])
计算字段 (CalculateField) 示例:计算范围
使用具有代码块的 CalculateField 计算基于范围的值。
# Name: CalculateField_Ranges.py
# Description: Use CalculateField with a codeblock to calculate values
# based on ranges
# 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, "PYTHON_9.3",
codeblock)
计算字段 (CalculateField) 示例:计算随机值
使用 CalculateField 将随机值分配给新字段。
# Name: CalculateField_Random.py
# Description: Use CalculateField to assign random values to a new field
# Import system modules
import arcpy
# Set environment settings
arcpy.env.workspace = "C:/data/airport.gdb"
# Set local variables
inFeatures = "parcels"
fieldName = "RndValue"
expression = "arcgis.rand('Integer 0 10')"
# Execute AddField
arcpy.AddField_management(inFeatures, fieldName, "LONG")
# Execute CalculateField
arcpy.CalculateField_management(inFeatures, fieldName, expression, "PYTHON_9.3")