计算值工具是一种多功能 模型构建器 工具,可从 Python 表达式返回值。 该工具支持简单计算、Python 内置函数和模块、地理处理函数和对象以及您自己的 Python 代码。
表达式
仅使用表达式参数执行各种计算。
数学计算
计算值工具可对 Python 中的简单数学表达式进行求值。 例如,请参阅以下表达式:
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
x + y | x 加上 y | 3 + 5 | 8 |
x - y | x 减去 y | 4.3 - 2.1 | 2.2 |
x * y | x 乘以 y | 8 * 9 | 72 |
x / y | x 除以 y | 4 / 1.25 | 3.2 |
x // y | x 除以 y(向下取整除法) | 4 // 1.25 | 3 |
x % y | x 除以 y 的余数 | 4 % 1.25 | 0.25 |
x**y | 以 x 为底,以 y 为指数的幂 | 2 ** 3 | 8 |
x < y | 如果 x 小于 y | 2 < 3 | 1 |
x <= y | 如果 x 小于或等于 y | 2 <=3 | 1 |
x > y | 如果 x 大于 y | 2 > 3 | 0 |
x >= y | 如果 x 大于或等于 y | 2 >= 3 | 0 |
x == y | 如果 x 等于 y | 2 == 3 | 0 |
x != y | 如果 x 不等于 y | 2 != 3 | 1 |
计算值工具允许使用 Python math 模块执行更为复杂的数学运算。
返回某个值的平方根。
Expression:
math.sqrt(25)
返回值的余弦,单位为弧度。
Expression:
math.cos(0.5)
math 模块还支持常量。
返回 π 的常数值。
Expression:
math.pi
计算值工具允许使用 random 模块生成随机数。 使用 random 模块的示例如下:
将返回 0 到 10 之间的随机整数。
Expression:
random.randint(0, 10)
返回从平均值为 10 且标准差为 3 的正态分布中获取的随机值。
Expression:
random.normalvariate(10, 3)
字符串示例
Python 运算符和索引可用于字符串值。
示例 | 说明 | 结果 |
---|---|---|
"Input" + " " + "Name" | 字符串串连 | 输入名称 |
"Input_Name"[6:] | 第七个字符到最后一个字符。 | 名称 |
"STREET".lower() | 将字符串值转换为小写。 | 街道 |
"Street Name".split()[1] | 按空格将一个字符串拆分为多个字符串。 并获取第二个返回的字符串。 | 名称 |
计算值工具可以替换或移除字符串中的字符。 例如,如果输入值带有小数(输入表的字段值即为这种情况),并且您想通过行内变量替换在其他工具的输出名称中使用此值,则可使用 replace 方法替换此小数。
Expression:
"%Value%".replace(".", "")
在字符串中,Python 将反斜线字符 (\) 视为转义字符。 例如,在字符串 "C:\temp\newProjectFolder" 中,\n 代表换行,\t 代表制表符。 要确保按预期解释字符串,请执行以下操作之一:
- 使用正斜线 (/) 代替反斜线杠。
- 使用两个反斜线代替一个。
- 通过在字符串前放置字母 r 将字符串转换为字符串文字。
数据类型
数据类型参数指定计算值工具输出的数据类型。 必须确保计算值工具输出数据类型与后续工具所需的输入数据类型匹配。
在任何接受栅格或常数值的 Spatial Analyst 工具中,可以使用计算值工具的输出结果,例如,加、大于和小于。 要使用计算值工具的输出结果,请将数据类型值更改为格式化栅格。 此数据类型为栅格表面,其像元值由公式或常量表示。
返回格式化栅格数据类型中的计算值,以用作大于工具的输入。
Expression:
%A% + 120
表达式参数值使用行内变量替换。 当工具运行时,%A% 将被变量 A 的值替换。 变量 A 的值加上 120 将被用作大于工具中的输入栅格或常量值 1。
代码块
对于简单计算,通常只需要使用表达式参数。 对于复杂的表达式,例如多行计算或逻辑运算 (if-else),还需使用代码块参数。 代码块参数必须与表达式参数结合使用。
可从表达式参数中引用代码块参数中定义的变量。
例如,在代码块中定义大小,以计算文件夹路径中的文件数量。 它将在执行期间从表达式参数中引用。 计算值工具输出值为实际文件数加 5。
Expression:
5 + size
Code Block:
import os
size = 0
folderpath = r"C:\temp\csvFiles"
for ele in os.scandir(folderpath):
size += 1
还可以使用代码块参数来定义函数并从表达式参数调用该函数。 在 Python 中,使用 def 语句后跟函数名来定义函数。 函数可以包含必需参数和可选参数,或者根本不包含参数。 通过 return 语句返回函数输出。
时间
您可以使用代码块参数来调用 Python 模块和方法。 以下示例将调用 time 模块的 ctime 方法。
在需要定期备份数据的情况下,在文件夹名称中添加时间有助于区分数据。 以下示例演示了如何向文件夹名称添加时间戳。 time.ctime 函数以 Tue Jun 22 16:24:08 2021 等格式返回当前日期和时间。 由于不允许使用空格和标点符号,因此此返回值不能直接用作创建文件夹工具的文件夹名称。 要将其移除,Python replace 方法的使用方式为,为每个需要替换的元素堆叠此方法。 在本示例中,得到的文件夹名称为 TueJun221622522021。
Expression:
gettime()
Code Block:
import time
def gettime():
# First replace removes punctuation marks. Second replace removes spaces.
return time.ctime().replace(":", "").replace(" ", "")
If-then-else 和行内替换
代码块参数也可以通过函数输入参数取值。 代码块中的参数数量必须与表达式参数中的参数数量相匹配。 执行工具时,参数值从表达式传递到代码块。 您可以通过将行内变量用作表达式参数来传递模型变量值,如下所示。
在以下示例中,getAspectDir 函数具有一个 inValue 参数。 表达式参数将输入度数变量的值传递给代码块。
以下示例将根据输入度数值计算坡向方向。 输入度数变量值为 223 时,输出坡向方向将返回南。
Expression:
getAspectDir("%Input Degree%")
Code Block:
def getAspectDir(inValue):
inValue = int(inValue)
if inValue >= 45 and inValue < 135:
return "East"
elif inValue >= 135 and inValue < 225:
return "South"
elif inValue >= 225 and inValue < 315:
return "West"
else:
return "North"
多个行内替换
代码块参数还可以接受多个行内变量值。
代码块将检查用户输入值变量的值是否大于默认值的值。 如果是,则计算值工具输出值为用户输入值。 否则,输出值将为默认值的值。 在此情况下,输出值将为 10。
Expression:
fn("%User Input Value%","%Default Value%")
Code Block:
def fn(userInputValue, defaultValue):
if float(userInputValue) > float(defaultValue):
return float(userInputValue)
else:
return float(defaultValue)
警告:
将字符串类型的行内变量括在表达式中的引号 ("%string variable%") 内。 数值类型的行内变量(双精度型、长整型)不需要使用引号括起 (%double%)。
数据路径串连
以下示例演示了将要素复制到指定文件夹路径和名称的过程。 代码块参数可以接受两个值:文件夹路径和文件夹名称。 该代码将评估文件夹路径和名称的组合是否存在。 如果组合路径不存在,则 makedirs 函数会添加所有丢失的文件夹。 要确保正确解释路径,文件夹路径前面必须具有表达式参数中的字母 r。
Expression:
getPath(r"%Folder Path%", "%Folder Name%")
Code Block:
import os
def getPath(folderPath, folderName):
outPath = os.path.join(folderPath, folderName)
if not os.path.exists(outPath):
os.makedirs(outPath)
return outPath
缓冲距离值和单位串联
要将计算值工具与接受线性距离的工具(例如缓冲区工具)结合使用,请执行以下操作:
- 将在代码块参数中返回一个距离值和一个线性单位。
- 将数据类型参数值设置为线性单位。
在此示例中,计算值工具返回 12 千米的值以与缓冲区工具配合使用。
Expression:
fn("%A%", "%B%")
Code Block:
def fn(a, b):
distance = int(a) * int(b)
return f"{distance} Kilometers"
ArcPy
ArcPy 为 Esri Python 站点包,可提供通过 Python 执行地理数据分析、转换和管理及地图自动化的实用且高效的方式。通过 ArcPy 可访问地理处理工具以及其他函数、类和模块,从而创建简单或复杂的工作流。
游标
您可以使用游标来处理数据。 游标是一个数据访问对象,用于在表中的各个行上进行迭代或在表中插入新行。 游标有三种形式:搜索、插入和更新,通常用于读写数据。
要将树种代码转换为其常用名称,可以使用 UpdateCursor 来遍历表中的每棵树。 根据树代码值,为其分配常用名称。 例如,如果一棵树的代码为 PIPO,则将其常用黄松分配给 CommonName 字段。
Expression:
fn("%trees%")
Code Block:
def fn(trees):
with arcpy.da.UpdateCursor(trees, ["Code", "CommonName"]) as cursor:
for row in cursor:
if row[0] == "PIPO":
row[1] = "ponderosa pine"
elif row[0] == "BEPA":
row[1] = "paper birch"
elif row[0] == "FAGR":
row[1] = "American beech"
cursor.updateRow(row)
地理处理工具
ArcPy 还提供了对地理处理工具的访问。 可以在代码块参数中调用地理处理工具。
在以下示例中,计算值工具将使用按属性选择图层、复制要素和缓冲区工具。 这些工具将选择包含 HIGHWAY 词的 LABEL 字段的所有道路,制作其副本,然后缓冲道路。
Expression:
fn("%Input Feature Class%")
Code Block:
def fn(InputFC):
# To allow overwriting outputs change overwriteOutput option to True.
arcpy.env.overwriteOutput = True
# Process: Select Layer By Attribute (Select Layer By Attribute) (management)
InputFC_Layer, Count = arcpy.management.SelectLayerByAttribute(InputFC, "NEW_SELECTION", "LABEL LIKE '%HIGHWAY%'")
# Process: Copy Features (Copy Features) (management)
copyFeaturesOutput = "C:\\temp\\Output.gdb\\copyFeaturesOutput"
arcpy.management.CopyFeatures(InputFC_Layer, copyFeaturesOutput)
# Process: Buffer (Buffer) (analysis)
bufferOutput = "C:\\temp\\Output.gdb\\bufferOutput"
arcpy.analysis.Buffer(copyFeaturesOutput, bufferOutput, "1500 Feet")
return bufferOutput