La herramienta Calcular valor es una herramienta ModelBuilder versátil que devuelve un valor de una expresión Python. La herramienta admite cálculos simples, funciones y módulos Python integrado, funciones y objetos de geoprocesamiento y su propio código Python.
Expresión
Realice una variedad de cálculos utilizando solo el parámetro Expresión.
Cálculos matemáticos
La herramienta Calcular valor puede evaluar expresiones matemáticas simples en Python. Por ejemplo, vea las siguientes expresiones:
Operador | Explicación | Ejemplo | Resultado |
---|---|---|---|
x + y | x más y | 3 + 5 | 8 |
x - y | x menos y | 4,3 - 2,1 | 2,2 |
x * y | x multiplicado por y | 8 * 9 | 72 |
x / y | x dividido por y | 4 / 1,25 | 3,2 |
x // y | x dividido por y (división truncada) | 4 // 1,25 | 3 |
x % y | resto de x dividido y | 4 % 1,25 | 0,25 |
x**y | x elevado a la potencia de y | 2 ** 3 | 8 |
x < y | si x es menor que y | 2 < 3 | 1 |
x <= y | si x es menor que o igual a y | 2 <=3 | 1 |
x > y | si x es mayor que y | 2 > 3 | 0 |
x >= y | si x es mayor que o igual a y | 2 >= 3 | 0 |
x == y | si x es igual a y | 2 == 3 | 0 |
x != y | si x no es igual a y | 2 != 3 | 1 |
La herramienta Calcular valor permite el uso del módulo de matemática de Python math para realizar operaciones matemáticas más complejas.
Devolver la raíz cuadrada de un valor.
Expression:
math.sqrt(25)
Devolver el coseno de un valor en radianes.
Expression:
math.cos(0.5)
El módulo de matemática math también admite constantes.
Devolver el valor constante de π.
Expression:
math.pi
La herramienta Calcular valor permite el uso del módulo random para generar números aleatorios. A continuación se presentan ejemplos de uso del módulo random:
Devolver un número aleatorio entre 0 y 10.
Expression:
random.randint(0, 10)
Devolver un valor aleatorio derivado de una distribución normal con un valor medio de 10 y una desviación estándar de 3.
Expression:
random.normalvariate(10, 3)
Ejemplos de cadena de caracteres
Los operadores e índice de Python se pueden utilizar en valores de cadena de caracteres.
Ejemplo | Explicación | Resultado |
---|---|---|
"Input" + " " + "Name" | Concatenación de cadena de caracteres. | Nombre de entrada |
"Input_Name"[6:] | El séptimo carácter al último carácter. | Nombre |
"STREET".lower() | Convertir un valor de cadena de caracteres a minúsculas. | calle |
"Street Name".split()[1] | Dividir una cadena de caracteres en varias cadenas por espacio. Y obtener la segunda cadena de caracteres devuelta. | Nombre |
La herramienta Calcular valor puede sustituir o eliminar caracteres de una cadena de caracteres. Por ejemplo, si tiene un valor de entrada con un decimal (en este caso, el valor de campo de la tabla de entrada) y desea utilizar el valor en el nombre de salida de otra herramienta por medio de la sustitución de variables en línea, el decimal se puede reemplazar mediante el método replace.
Expression:
"%Value%".replace(".", "")
En una cadena de caracteres, Python trata un carácter de barra diagonal inversa (\) como un carácter de escape. Por ejemplo, en la cadena "C:\temp\newProjectFolder", \n representa un avance de línea y \t representa un tabulador. Para asegurarse de que la cadena de caracteres se interpreta de la forma esperada, realice una de las siguientes acciones:
- Utilice una barra diagonal (/) en lugar de una barra invertida.
- Utilice dos barras invertidas en lugar de una.
- Convierta la cadena de caracteres en un literal de cadena de caracteres colocando la letra r antes de la cadena de caracteres.
Tipo de datos
El parámetro Tipo de datos especifica el tipo de salida de la herramienta Calcular valor. Es esencial asegurarse de que el tipo de datos de salida de la herramienta Calcular valor coincida con el tipo de datos de entrada requerido de la herramienta que sigue.
Puede utilizar la salida de la herramienta Calcular valor en cualquier herramienta Spatial Analyst que acepte un valor de ráster o constante como Suma, Mayor que y Menor que. Para utilizar la salida de Calcular valor, cambie el valor de Tipo de datos por Ráster formulado. Este tipo de datos es una superficie ráster cuyas celdas están representadas por una fórmula o una constante.
Devuelva el valor calculado en el tipo de datos Ráster formulado que se utilizará como entrada de la herramienta Mayor que.
Expression:
%A% + 120
El valor del parámetro Expresión utiliza la sustitución de variables en línea. Cuando se ejecuta la herramienta, %A% se reemplazará por el valor de la variable A. El valor de la variable A más 120 se utilizará como Ráster de entrada o valor constante 1 en la herramienta Mayor que.
Bloque que código
Para un cálculo simple, con frecuencia solo tendrá que utilizar el parámetro Expresión. Las expresiones más complejas, como cálculos u operaciones lógicas de varias líneas (if-else), también necesitará el parámetro Bloque de código. El parámetro Bloque de código debe utilizarse junto con el parámetro Expresión.
Se puede hacer referencia a las variables definidas en el parámetro Bloque de código a partir del parámetro Expresión.
Por ejemplo, el tamaño se define en el Bloque de código que cuenta los archivos de la ruta de carpeta. Se hará referencia a él desde el parámetro Expresión durante la ejecución. El valor de salida de la herramienta Calcular es el recuento real de archivos más cinco.
Expression:
5 + size
Code Block:
import os
size = 0
folderpath = r"C:\temp\csvFiles"
for ele in os.scandir(folderpath):
size += 1
También puede usar el parámetro Código bloque para definir una función y llamar a la función desde el parámetro Expresión. En Python, una función se define con la sentencia def seguida por el nombre de la función. Una función puede incluir argumentos obligatorios y opcionales o ningún argumento. Devuelva la salida de una función mediante la declaración return.
Hora
Puede utilizar el parámetro Bloque de código para llamar a los módulos y métodos Python. El ejemplo siguiente llama al método ctime del módulo time.
En los casos en los que necesita hacer una copia de seguridad de los datos con regularidad, agregar tiempo al nombre de la carpeta ayuda a distinguir los datos. En el siguiente ejemplo se muestra cómo agregar una marca de tiempo a un nombre de carpeta. La función time.ctime devuelve la fecha y hora actuales en un formato como Tue Jun 22 16:24:08 2021. Este valor devuelto no se puede utilizar directamente como nombre de carpeta de la herramienta Crear carpeta, ya que no se permiten espacios ni marcas de puntuación. Para quitarlos, el método Python replace se utiliza apilando el método para cada elemento que necesita ser reemplazado. El nombre que se obtiene para esta carpeta en el presente ejemplo es 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 y sustitución en línea
El parámetro Bloque de código también puede tomar en valores por medio de los parámetros de entrada de la función. El número de parámetros del Bloque de código debe coincidir con el número de parámetros del parámetro Expresión. Cuando se ejecuta la herramienta, el valor del parámetro se pasa de la Expresión al Bloque de código. Puede pasar un valor de variable de modelo mediante una variable en línea como el parámetro Expresión, como se muestra a continuación.
En el ejemplo siguiente, la función getAspectDir tiene un parámetro inValue. El parámetro Expresión pasa el valor de la variable Grado de entrada al Bloque de código.
El siguiente ejemplo calcula la dirección de la orientación de la pendiente en función del valor de Grado de entrada. Con el valor de la variable Grado de entrada de 223, la dirección de orientación de salida devuelve Sur.
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"
Sustituciones en múltiples líneas
El parámetro Bloque de código también puede recibir múltiples valores de variables en línea.
El bloque de código verifica si el valor de la variable Valor de entrada del usuario es mayor que el valor del parámetro Valor predeterminado. De ser así, el valor de salida de la herramienta Calcular valor es el Valor de entrada del usuario. De lo contrario, el valor de salida será el valor del parámetro Valor predeterminado. En este caso, el Valor de salida será 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)
Precaución:
Encierre una variable en línea de tipo cadena de caracteres entre comillas ("%string variable%") en una expresión. Las variables en línea de tipos numéricos (double, long) no requieren comillas (%ddouble%).
Concatenación de ruta de datos
El siguiente ejemplo muestra la copia de entidades en una ruta de carpeta y un nombre especificados. El parámetro Bloque de código acepta dos valores: Ruta de carpeta y Nombre de carpeta. El código evalúa si existe una combinación de ruta de carpeta y nombre. Si la ruta combinada no existe, la función makedirs agrega las carpetas que falten. La letra r del parámetro Expresión que precede a la ruta de la carpeta es necesaria para asegurarse de que la ruta se interprete correctamente.
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
Valor de distancia de zona de influencia y concatenación de unidades
Para utilizar la herramienta Calcular valor con una herramienta que acepte una distancia lineal, como la herramienta Zona de influencia, haga lo siguiente:
- Devuelva un valor de distancia y una unidad lineal en el parámetro Bloque de código.
- Establezca el valor del parámetro Tipo de datos en Unidad lineal.
En este ejemplo, la herramienta Calcular valor devuelve un valor de 12 kilómetros para su uso con la herramienta Zona de influencia.
Expression:
fn("%A%", "%B%")
Code Block:
def fn(a, b):
distance = int(a) * int(b)
return f"{distance} Kilometers"
ArcPy
ArcPy es un paquete del sitio Esri Python que proporciona una forma útil y productiva de realizar tareas como el análisis de datos geográficos, la conversión de datos, la administración de datos y la automatización con Python. ArcPy proporciona acceso a herramientas de geoprocesamiento, así como a funciones, clases y módulos adicionales que le permiten crear flujos de trabajo simples o complejos.
Cursor
Puede utilizar el cursor para trabajar con datos. Un cursor es un objeto de acceso a datos que se puede utilizar para recorrer el conjunto de filas de una tabla o insertar nuevas filas en una tabla. Los cursores tienen tres formas: búsqueda, inserción y actualización, que se utilizan normalmente para leer y escribir datos.
Para convertir el código de especies de árboles en su nombre común, puede utilizar UpdateCursor para iterar por cada árbol de la tabla. Asígnele un nombre común en función del valor del código de árbol. Por ejemplo, si un árbol tiene un código PIPO, asigne su nombre común pino ponderosa al campo 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)
Herramientas de geoprocesamiento
ArcPy también proporciona acceso a las herramientas de geoprocesamiento. Puede llamar a las herramientas de geoprocesamiento dentro del parámetro Bloque de código.
En el siguiente ejemplo, la herramienta Calcular valor utiliza las herramientas Seleccionar capa por atributo, Copiar entidades y Zona de influencia. Las herramientas seleccionan todas las carreteras con un campo LABEL que contiene la palabra HIGHWAY, hacen una copia de ellas y, a continuación, crean una zona de influencia de las carreteras.
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