计算字段 (数据管理)
用法
-
Python 表达式可通过几何对象中的属性(type、extent、centroid、firstPoint、lastPoint、area、length、isMultipart 和 partCount)进行创建。
!shape.area!
-
Python 表达式可以使用具有面积或线性单位的几何 area 和 length 属性将值转换为不同的测量单位(例如 !shape.length@kilometers!)。如果数据存储在地理坐标系中且具有线性单位(例如英里),则使用测地线算法计算长度。在地理数据中使用面积单位会产生不正确的结果,这是由于沿 globe 的十进制度并不一致。
- 面积测量单位关键字:
- 英亩 | 公亩 | 公顷 | 平方厘米 | 平方分米 | 平方英寸 | 平方英尺 | 平方千米 | 平方米 | 平方英里 | 平方毫米 | 平方码 | 平方地图单位 | 未知
- 线性测量单位关键字:
- 厘米 | 十进制度 | 分米 | 英尺 | 英寸 | 千米 | 米 | 英里 | 毫米 | 海里 | 磅 | 未知 | 码
- 面积测量单位关键字:
-
在工具对话框中,可将表达式直接输入到表达式参数中,或者使用“字段计算器”以交互方式构建表达式。
-
每次操作仅能对一个字段应用计算。
-
现有字段值将被覆盖。如果想要保留原始字段值,应创建输入表副本
-
对于 Python 计算,必须在字段名称两旁添加惊叹号(!字段名!)。
对于 VB 计算,字段名称必须用方括号括起([字段名])。
-
计算文本或字符字段的字符串时,在对话框中,必须对字符串添加双引号("字符串"),而在脚本中,还必须对加双引号的字符串添加单引号('"字符串"')。
-
此工具也可用于更新字符项。应对使用字符串的表达式添加单引号(例如 [CHARITEM] = ‘新字符串')。但是,如果字符串已包含单引号,则要对该字符串添加双引号,例如 [CHARITEM] = "类型'A'"。
-
要计算数值字段,可在表达式参数中输入数值;值的两旁无需加引号。
-
如果已指定 Python 表达式,则此工具支持 arcgis.rand() 函数。已为 ArcGIS 工具创建 arcgis.rand() 函数,不应将此函数与 Python Rand() 函数相混淆。arcgis.rand() 函数的可用分布的语法在随机值的分布语法中进行介绍。
-
表达式与代码块会相互连接。代码块必须返回与表达式的关联;代码块的结果应传入到表达式中。
-
代码块参数可用于创建复杂表达式。您可以在对话框中直接输入代码块,或在脚本中将代码块作为连续字符串输入。
-
Python 数学模块及格式可供代码块参数使用。您可以导入附加模块。数学模块可提供数论函数与表达函数、幂函数与对数函数、三角函数、角度转换函数、双曲函数以及数学常数。要了解更多有关数学模块的内容,请参阅 Python 的帮助。
保存的 ArcGIS 先前版本的 VB .cal 文件可以直接使用或者只需做少量修改后即可使用。如果拥有使用 ArcObjects 的过去版本的 VBA 代码,则计算需经过修改后才能用于 10.0。
-
计算连接数据时,您无法直接计算连接列。然而,您可以直接计算源表的列。要计算连接数据,必须先将连接表或连接图层添加至 ArcMap。然后可以分别对此数据执行计算。这些更改将反映在连接列中。
- 计算字段示例
语法
参数 | 说明 | 数据类型 |
in_table |
此表包含将通过新的计算进行更新的字段。 | Mosaic Layer; Raster Catalog Layer; Raster Layer; Table View |
field |
将通过新的计算进行更新的字段。 | Field |
expression |
使用简单计算表达式创建的值将用于填充所选行。 | SQL Expression |
expression_type (可选) |
指定要使用的表达式的类型。
| String |
code_block (可选) |
允许为复杂表达式输入代码块。 | String |
代码示例
以下 Python 窗口脚本演示了如何在立即模式下使用 CalculateField 函数。
import arcpy from arcpy import env env.workspace = "C:/data" arcpy.AddField_management("vegtable.dbf", "VEG_TYP2", "TEXT", "", "", "20") arcpy.CalculateField_management("vegtable.dbf", "VEG_TYP2", '!VEG_TYPE!.split(" ")[-1]', "PYTHON")
使用 CalculateField 将质心值分配给新字段。
# Name: CalculateField_Centroids.py # Description: Use CalculateField to assign centroid values to new fields # Import system modules import arcpy from arcpy import env try: # Set environment settings env.workspace = "C:/data/airport.gdb" # Set local variables inFeatures = "parcels" fieldName1 = "xCentroid" fieldName2 = "yCentroid" fieldPrecision = 18 fieldScale = 11 # Expressions are calculated using the Shape Field's geometry property expression1 = "float(!SHAPE.CENTROID!.split()[0])" expression2 = "float(!SHAPE.CENTROID!.split()[1])" # Execute AddField arcpy.AddField_management(inFeatures, fieldName1, "DOUBLE", fieldPrecision, fieldScale) arcpy.AddField_management(inFeatures, fieldName2, "DOUBLE", fieldPrecision, fieldScale) # Execute CalculateField arcpy.CalculateField_management(inFeatures, fieldName1, expression1, "PYTHON") arcpy.CalculateField_management(inFeatures, fieldName2, expression2, "PYTHON") except Exception, e: # If an error occurred, print line number and error message import traceback, sys tb = sys.exc_info()[2] print "Line %i" % tb.tb_lineno print e.message
使用具有代码块的 CalculateField 计算基于范围的值。
# Name: CalculateField_Ranges.py # Description: Use CalculateField with a codeblock to calculate values # based on ranges # Import system modules import arcpy from arcpy import env # Set environment settings 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", codeblock)
使用 CalculateField 将随机值分配给新字段。
# Name: CalculateField_Random.py # Description: Use CalculateField to assign random values to a new field # Import system modules import arcpy from arcpy import env # Set environment settings 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")