“计算字段”工具位于数据管理工具箱下的“字段”工具集中。这与您在属性表的字段快捷菜单中单击字段计算器命令所打开的工具相同。执行字段计算时,了解正在使用的数据的类型及其将应用于何种环境是非常重要的。计算表达式中所必须使用的语法因数据源和脚本语言的不同而有所差异。
下面列出了各种使用“计算字段”工具过程中的重要提示及最佳做法。
“计算字段”工具的提示及最佳做法
为要素类、要素图层或栅格计算字段的值。
可使用 VBScript 或标准 Python 格式创建表达式。表达式所使用的字符串的格式化样式应当与上下文环境(类型)相适应。
可使用 type、extent、centroid、firstPoint、lastPoint、area、length、 isMultipart 和 partCount 等 Geometry 对象中的属性来创建 Python 表达式(例如 !shape.area!)。
Python 表达式可以将几何的 area 与 length 属性与面积或线性单位结合使用,从而将值转换为不同的测量单位(如 !shape.length@kilometers!)。如果数据存储在地理坐标系中且具有线性单位(例如英里),则使用测地线算法计算长度。在地理数据中使用面积单位会产生不正确的结果,这是因为沿地球面的十进制度数并不一致。
!shape.area@acres!
- 面积测量单位关键字:
- 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
使用所选要素集(如从创建要素图层或按属性选择图层内的查询中创建的要素集)时,此工具将只更新所选的记录。
每次操作仅能对一个字段应用计算。
对于 VBScript,字段名始终用 [ ] 括起来。
对于 Python 计算,必须在字段名称两边添加惊叹号 (!fieldname!)。
计算文本或字符字段的字符串时,在对话框中,字符串必须使用双引号("字符串"),而在脚本中,还必须对使用双引号的字符串添加单引号('"字符串"')。
此工具也可用于更新字符项。应对使用字符串的表达式添加单引号(例如 [CHARITEM] = 'NEW STRING')。但是,如果字符串已包含单引号,则要对该字符串添加双引号(例如 [CHARITEM] = "TYPE'A'")。
要计算数值字段,可在表达式参数中输入数值;值的两旁无需加引号。
“计算字段”工具支持 arcgis.rand() 函数,但表达式类型必须是 Python。arcgis.rand() 函数是为 ArcGIS 工具而创建,不应与 Python Rand() 函数相混淆。
表达式与代码块会相互连接。代码块必须返回与表达式的关联;代码块的结果应传入到表达式中。
Python math 模块及格式可供代码块参数使用。您可以导入附加模块。math 模块可提供数论函数与表达函数、幂函数与对数函数、三角函数、角度转换函数、双曲函数以及数学常数。要了解更多有关 math 模块的内容,请参阅 Python 帮助。
保存的 ArcGIS 先前版本的 VB .cal 文件可以直接使用或者只需做少量修改后即可使用。如果拥有使用 ArcObjects 的过去版本的 VBA 代码,则需要修改计算。
计算连接数据时,您无法直接计算连接列。然而,您可以直接计算源表的列。要计算连接数据,必须先将连接表或连接图层添加至地图。然后可以分别对此数据执行计算。这些更改将反映在连接列中。
在 ArcGIS Engine Runtime 或 ArcGIS Server 中运行“计算字段”时,表达式类型必须为 Python。如果工具包含在将要发布到 ArcGIS Server 的模型中,则只能使用 Python 作为表达式类型。
使用“计算字段”工具的代码块示例
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.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")
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"""
# Execute AddField
arcpy.AddField_management(inTable, fieldName, "SHORT")
# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName, expression, "PYTHON_9.3",
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"
# Execute AddField
arcpy.AddField_management(inFeatures, fieldName, "LONG")
# Execute CalculateField
arcpy.CalculateField_management(inFeatures, fieldName, expression, "PYTHON_9.3",
code_block)