La introducción de valores con el teclado no es el único modo con el que puede editar valores en una tabla. En algunos casos, puede realizar un cálculo matemático para establecer un valor de campo para un registro único o incluso para todos los registros. Puede realizar cálculos simples y avanzados en todos los registros o en registros seleccionados. Además, puede calcular área, longitud, perímetro y otras propiedades geográficas en campos de tablas de atributos. Las siguientes secciones incluyen ejemplos del uso de la calculadora de campo. Los cálculos se realizan mediante Python, SQL y Arcade.
Este tema se centra en los ejemplos de Calcular campo basados en Python. Para obtener más información sobre las expresiones de Arcade, consulte la Guía de ArcGIS Arcade. Para obtener más información sobre las expresiones de SQL, consulte Calcular un campo.
Nota:
- Python aplica la sangría como parte de la sintaxis. Utilice dos o cuatro espacios para definir cada nivel lógico. Alinee el comienzo y el final de los bloques de declaración, y sea consistente.
- Los campos de expresión de cálculo de Python se encuentran entre signos de exclamación (!!).
- Cuando nombre variables, tenga en cuenta que Python distingue entre mayúsculas y minúsculas, de modo que valor no es lo mismo que Valor.
- Después de introducir las sentencias, puede hacer clic en el botón Exportar si desea escribirlas en un archivo. El botón Importar le solicitará que busque y seleccione un archivo de cálculo existente.
Cálculos simples
Ejemplos de cadenas sencillas
Varias funciones de cadenas de Python, incluidas capitalize, rstrip y replace, admiten cadenas.
Poner en mayúscula el primer carácter de la cadena del campo CITY_NAME.
!CITY_NAME!.capitalize()
Eliminar los espacios en blanco al final de la cadena del campo CITY_NAME.
!CITY_NAME!.rstrip()
Reemplazar las instancias de "california" con "California" que se encuentran en el campo STATE_NAME.
!STATE_NAME!.replace("california", "California")
Los caracteres en un campo de cadena se pueden acceder mediante la indexación y la segmentación en Python. La indexación recupera los caracteres en una posición del índice; la segmentación recupera un grupo de caracteres. En la tabla siguiente considere que !fieldname! es una cadena de caracteres con el valor "abcde".
Ejemplo | Explicación | Resultado |
---|---|---|
!fieldname![0] | El primer carácter. | "a" |
!fieldname![-2] | Del segundo al último carácter. | "d" |
!fieldname![1:4] | El segundo, tercero y cuarto carácter. | "bcd" |
Python también admite el formato de cadena de caracteres con el método format().
Combinar FieldA y FieldB, separados por dos puntos.
"{}:{}".format(!FieldA!, !FieldB!)
Ejemplos de matemática sencillos
Python proporciona herramientas para procesar números. Python también admite una serie de funciones numéricas y matemáticas, incluidas math, cmath, decimal, random, itertools, functools y operator.
Operador | Explicación | Ejemplo | Resultado |
---|---|---|---|
x + y | x más y | 1.5 + 2.5 | 4.0 |
x - y | x menos y | 3.3 - 2.2 | 1.1 |
x * y | x multiplicado por y | 2.0 * 2.2 | 4.4 |
x / y | x dividido por y | 4.0 / 1.25 | 3.2 |
x // y | x dividido por y (división truncada) | 4.0 // 1.25 | 3.0 |
x % y | x módulo y | 8 % 3 | 2 |
-x | expresión negativa de x | x = 5 -x | -5 |
+x | x no cambia | x = 5 +x | 5 |
x ** y | x elevado a la potencia de y | 2 ** 3 | 8 |
Multiplicar
!Rank! * 2
Calcule el volumen de una esfera dado un campo de radio.
4.0 / 3.0 * math.pi * !Radius! ** 3
Heredado:
En ArcGIS Pro, se usa Python 3; en ArcGIS Desktop, se usa Python 2. Python 2 utiliza un álgebra de números enteros, lo que significa que, al dividir dos valores enteros, siempre se obtendrá un valor entero (3 / 2 = 1). En Python 3, al dividir dos valores enteros se obtendrá un valor flotante (3 / 2 = 1.5).
Funciones de Python incorporadas
Python tiene varias funciones incorporadas disponibles para su uso, incluidas max, min, round y sum.
Calcular el valor máximo para cada registro a partir de la lista de campos.
max([!field1!, !field2!, !field3!])
Calcular la suma para cada registro a partir de la lista de campos.
sum([!field1!, !field2!, !field3!])
Utilizar bloques de código
Con las expresiones de Python y el parámetro Bloque de código, puede realizar lo siguiente:
- Utilizar cualquier función de Python en la expresión.
- Acceder a los objetos y las funciones de geoprocesamiento.
- Acceder a las propiedades de geometría de entidad.
- Acceder al nuevo operador de valor aleatorio.
- Reclasificar valores con la lógica if-then-else.
Tipo de expresión | Bloque de código |
---|---|
Python 3 | Es compatible con la funcionalidad de Python. El bloque de código se expresa utilizando funciones de Python (def). Las propiedades de geometría se expresan utilizando objetos de geoprocesamiento, como objetos de punto, donde sea apropiado. |
Arcade | Admite la funcionalidad de Arcade. |
SQL | Admite expresiones SQL. Se implementaron expresiones de SQL para mejorar la compatibilidad de los cálculos en servicios de entidades y geodatabases corporativas, especialmente con rendimiento. En lugar de realizar cálculos entidad por entidad o fila por fila, se define una sola solicitud para el servicio de entidades o la base de datos. |
Heredado:
En ArcGIS Desktop, la herramienta Calcular campo admite VB, PYTHON y PYTHON_9.3 como tipos de expresión. El tipo de expresión VB, que se admite en algunos productos, no se admite en productos de 64 bits, incluido ArcGIS Pro.
Aún se admiten las palabras clave de PYTHON y PYTHON_9.3 en ArcGIS Pro para la compatibilidad con versiones anteriores, pero no se muestran como opciones. Los scripts de Python que utilizan estas palabras clave seguirán funcionando.
La única diferencia entre Python 3 y la palabra clave heredada de PYTHON_9.3 es que Python 3 devuelve los valores de los campos de fecha como objetos datetime de Python.
Nota:
El tipo de expresión de Python 3 no está relacionado con la versión de Python instalada con ArcGIS Pro. Se trata únicamente de la tercera palabra clave relacionada con Python históricamente (tras PYTHON y PYTHON_9.3).
Las funciones de Python se definen con la palabra clave def seguida del nombre de la función y los argumentos de entrada de la función. Una función de Python se puede escribir para aceptar cualquier cantidad de argumentos de entrada (inclusive ninguno). La función devuelve un valor mediante una sentencia return. El nombre de la función es elección suya (no utilice espacios ni números a la izquierda).
Nota:
Si no se devuelve explícitamente un valor de una función con una sentencia return, la función devolverá None.
Nota:
Recuerde que Python aplica la sangría como parte de la sintaxis. Utilice cuatro espacios para definir cada nivel lógico. Alinee el comienzo y el final de los bloques de declaración, y sea consistente.
Muestras de código: matemática
Nota:
Para utilizar todas las muestras de abajo, supongamos que se utiliza un tipo de expresión de Python 3.
Redondear el valor del campo a dos posiciones decimales.
Expresión:
round(!area!, 2)
Utilizar el módulo de matemática para convertir metros a pies. La conversión se eleva a la potencia de 2 y se multiplica por el área.
Expresión:
MetersToFeet((float(!shape.area!)))
Código bloque:
import math
def MetersToFeet(area):
return math.pow(3.2808, 2) * area
Calcular campos utilizando la lógica con Python
Clasificar basado en los valores de campo.
Expresión:
Reclass(!WELL_YIELD!)
Código bloque:
def Reclass(WellYield):
if (WellYield >= 0 and WellYield <= 10):
return 1
elif (WellYield > 10 and WellYield <= 20):
return 2
elif (WellYield > 20 and WellYield <= 30):
return 3
elif (WellYield > 30):
return 4
Ejemplos de código: geometría
Nota:
Para obtener más información sobre cómo convertir unidades geométricas, consulte Conversiones de unidades geométricas a continuación.
Calcular el área de una entidad.
Expresión:
!shape.area!
Calcular la coordenada X máxima de una entidad.
Expresión:
!shape.extent.XMax!
Calcular el número de vértices de una entidad.
Expresión:
MySub(!shape!)
Code Block:
def MySub(feat):
partnum = 0
# Count the number of points in the current multipart feature
partcount = feat.partCount
pntcount = 0
# Enter while loop for each part in the feature (if a singlepart
# feature this will occur only once)
#
while partnum < partcount:
part = feat.getPart(partnum)
pnt = part.next()
# Enter while loop for each vertex
#
while pnt:
pntcount += 1
pnt = part.next()
# If pnt is null, either the part is finished or there
# is an interior ring
#
if not pnt:
pnt = part.next()
partnum += 1
return pntcount
Para una clase de entidad de puntos, cambiar la coordenada x de cada punto por 100.
Expresión:
shiftXCoordinate(!SHAPE!)
Code Block:
def shiftXCoordinate(shape):
shiftValue = 100
point = shape.getPart(0)
point.X += shiftValue
return point
Conversiones de unidades geométricas
Las propiedades de área y longitud del campo de geometría se pueden modificar con tipos de unidades expresados con un signo @.
- Palabras clave de unidad de medida de área:
- ACRES | ARES | HECTARES | SQUARECENTIMETERS | SQUAREDECIMETERS | SQUAREINCHES | SQUAREFEET | SQUAREKILOMETERS | SQUAREMETERS | SQUAREMILES | SQUAREMILLIMETERS | SQUAREYARDS | SQUAREMAPUNITS | UNKNOWN
- Palabras clave de unidad de medida lineal:
- CENTIMETERS | DECIMALDEGREES | DECIMETERS | FEET | INCHES | KILOMETERS | METERS | MILES | MILLIMETERS | NAUTICALMILES | POINTS | UNKNOWN | YARDS
Nota:
Si los datos se almacenan en un sistema de coordenadas geográficas y se proporciona una unidad lineal (por ejemplo, pies), el cálculo de longitud se convertirá mediante un algoritmo geodésico.
Precaución:
Convertir las unidades de área en datos en un sistema de coordenadas geográficas producirá resultados cuestionables ya que los grados decimales no son consistentes en el globo.
Calcular la longitud de una entidad en yardas.
Expresión:
!shape.length@yards!
Calcular el área de una entidad en acres.
Expresión:
!shape.area@acres!
La longitud y el área geodésicas también se pueden calcular utilizando las propiedades geodesicArea y geodesicLength con @ seguidas de una palabra clave de unidad de medida.
Calcule la longitud geodésica de una entidad en yardas.
Expresión:
!shape.geodesicLength@yards!
Calcule el área geodésica de una entidad en acres.
Expresión:
!shape.geodesicArea@acres!
Ejemplos de código: fechas
Calcular la fecha actual.
Expresión:
time.strftime("%d/%m/%Y")
Calcular la fecha y hora actuales.
Expresión:
datetime.datetime.now()
Calcular la fecha para que sea el 31 de diciembre de 2000.
Expresión:
datetime.datetime(2000, 12, 31)
Calcular el número de días entre la fecha actual y el valor en un campo.
Expresión:
(datetime.datetime.now() - !field1!).days
Calcular una fecha agregando 100 días al valor de fecha en un campo.
Expresión:
!field1! + datetime.timedelta(days=100)
Calcular el día de la semana (por ejemplo, domingo) para un valor de fecha en un campo.
Expresión:
!field1!.strftime('%A')
Ejemplos de código: cadenas de caracteres
Devolver los tres caracteres más a la derecha.
Expresión:
!SUB_REGION![-3:]
Remplazar todas las instancias de una "P" mayúscula con una "p" minúscula.
Expresión:
!STATE_NAME!.replace("P","p")
Concatenar dos campos con un separador de espacio
Expresión:
!SUB_REGION! + " " + !STATE_ABBR!
Convertir a la primera letra de cada palabra en mayúscula y las demás en minúscula
Los siguientes ejemplos muestran diferentes maneras de convertir palabras de modo que cada palabra tenga la primer letra en mayúscula y el resto de las letras en minúscula.
Expresión:
' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')])
Expresión:
!STATE_NAME!.title()
Expresiones regulares
El módulo re de Python proporciona operaciones de concordancia de expresión regular que se pueden utilizar para elaborar reglas complejas de concordancia y sustitución de patrones de cadenas de caracteres.
Reemplazar St o St. al iniciar una nueva palabra al final de la cadena de caracteres con la palabra Street.
Expresión:
update_street(!ADDRESS!)
Código bloque:
import re
def update_street(street_name):
return re.sub(r"""\b(St|St.)\Z""",
'Street',
street_name)
Cálculos acumulativos y secuenciales
Calcular un número o Id. secuencial basado en un intervalo.
Expresión:
autoIncrement()
Código bloque:
rec=0
def autoIncrement():
global rec
pStart = 1 #adjust start value, if req'd
pInterval = 1 #adjust interval value, if req'd
if (rec == 0):
rec = pStart
else:
rec = rec + pInterval
return rec
Calcular el valor acumulativo de un campo numérico.
Expresión:
accumulate(!FieldA!)
Código bloque:
total = 0
def accumulate(increment):
global total
if total:
total += increment
else:
total = increment
return total
Calcular el aumento del porcentaje de un campo numérico.
Expresión:
percentIncrease(float(!FieldA!))
Código bloque:
lastValue = 0
def percentIncrease(newValue):
global lastValue
if lastValue:
percentage = ((newValue - lastValue) / lastValue) * 100
else:
percentage = 0
lastValue = newValue
return percentage
Valores aleatorios
Utilizar el paquete del sitio de numpy para calcular valores flotantes aleatorios entre 0,0 y 1,0.
Expresión:
getRandomValue()
Código bloque:
import numpy
def getRandomValue():
return numpy.random.random()
Utilizar el módulo aleatorio para calcular valores enteros aleatorios entre 0 y 10.
Expresión:
random.randint(0, 10)
Código bloque:
import random
Calcular valores nulos
En una expresión de Python, se pueden calcular los valores nulos utilizando un Python None.
Nota:
El siguiente cálculo solo funcionará si el campo es anulable.
Utilice la expresión None de Python para calcular valores nulos.
Expresión:
None