Exemples d’utilisation de l’outil Calculer une valeur avec Python

L’outil Calculer une valeur est un outil polyvalent de ModelBuilder qui renvoie une valeur issue d’une expression Python. Cet outil prend en charge des calculs simples, des modules et des fonctions intrinsèques Python, des fonctions et des objets de géotraitement, ainsi que votre propre code Python.

Expression

Effectuez divers calculs en utilisant uniquement le paramètre Expression.

Calculs mathématiques

L’outil Calculer une valeur peut résoudre des expressions mathématiques simples dans Python. Par exemple, consultez les expressions suivantes :

OpérateurExplicationExempleRésultat

x + y

x plus y

3 + 5

8

x - y

x moins y

4,3 - 2,1

2.2

x * y

x fois y

8 * 9

72

x / y

x divisé par y

4 / 1,25

3.2

x // y

x divisé par y (division du sol)

4 // 1,25

3

x % y

reste de x divisé par y

4 % 1,25

0,25

x**y

x puissance y

2 ** 3

8

x < y

si x est inférieur à y

2 < 3

1

x <= y

si x est inférieur ou égal à y

2 <=3

1

x > y

si x est supérieur à y

2 > 3

0

x >= y

si x est supérieur ou égal à y

2 >= 3

0

x == y

si x est égal à y

2 == 3

0

x != y

si x est différent de y

2 != 3

1

L’outil Calculer une valeur permet d’utiliser le module Python math pour effectuer des opérations mathématiques plus complexes.

Renvoie la racine carrée d’une valeur.

Expression:
math.sqrt(25)

Renvoie le cosinus d’une valeur en radians.

Expression:
math.cos(0.5)

Les constantes sont également prises en charge dans tout le module math.

Renvoie la valeur constante de π.

Expression:
math.pi

L’outil Calculer une valeur permet d’utiliser le module random pour générer des nombres aléatoires. Vous trouverez ci-dessous quelques exemples d’utilisation du module random :

Renvoie un entier aléatoire compris entre 0 et 10.

Expression:
random.randint(0, 10)

Renvoie une valeur aléatoire dérivée d’une distribution normale avec une moyenne de 10 et un écart type de 3.

Expression:
random.normalvariate(10, 3)

Exemples de chaînes

Les index et opérateurs Python peuvent être utilisés dans des valeurs de chaîne.

ExempleExplicationRésultat

"Input" + " " + "Name"

Concaténation de chaînes.

Input Name

"Input_Name"[6:]

Du septième caractère au dernier.

Nom

"STREET".lower()

Convertit une valeur de chaîne en minuscules.

rue

"Street Name".split()[1]

Fractionne une chaîne en plusieurs chaînes au niveau de l’espace. Obtient également la deuxième chaîne renvoyée.

Nom

L’outil Calculer une valeur permet de remplacer ou de supprimer des caractères dans une chaîne. Par exemple, si vous souhaitez utiliser une valeur en entrée dotée d’une virgule (valeur de champ de la table en entrée dans ce cas) dans le nom en sortie d’un autre outil via la substitution de variable en ligne, la virgule peut être remplacée avec la méthode replace.

Expression:
"%Value%".replace(".", "")

Exemple d’utilisation de la méthode Python replace

Dans une chaîne, Python traite une barre oblique inverse (\) en tant que caractère d’échappement. Par exemple, dans la chaîne "C:\temp\newProjectFolder", \n représente un saut de ligne et \t, une tabulation. Pour garantir que la chaîne est interprétée comme vous l’attendez, effectuez l’une des opérations suivantes :

  • Utilisez une barre oblique (/) à la place d’une barre oblique inverse.
  • Utilisez deux barres obliques inverses au lieu d’une.
  • Convertissez la chaîne en un littéral de type chaîne en plaçant la lettre r avant la chaîne.

En savoir plus sur la définition des chemins d’accès dans Python

Type de données

Le paramètre Data Type (Type de données) spécifie le type de données de la sortie de l’outil Calculer une valeur. Veillez à ce que le type de données de la sortie de l’outil Calculer une valeur corresponde au type de données en entrée requis par l’outil suivant.

Vous pouvez utiliser la sortie de l’outil Calculer une valeur dans tous les outils Spatial Analyst qui acceptent un raster ou une valeur constante, notamment Plus, Supérieur à et Inférieur à. Pour utiliser la sortie de l’outil Calculer une valeur, modifiez la valeur de Data Type (Type de données) en Formulated Raster (Raster [formule]). Ce type de données est une surface raster dont les valeurs de cellule sont représentées par une formule ou une constante.

Renvoie la valeur calculée dans le type de données Formulated Raster (Raster [formule]) pour qu’elle soit utilisée en tant qu’entrée de l’outil Supérieur à.

Expression:
%A% + 120

La valeur du paramètre Expression utilise la substitution de variables en ligne. Lors de l’exécution de l’outil, %A% est remplacé par la valeur de la variable A. La valeur de la variable A plus 120 est utilisée en tant que Input raster or constant value 1 (Raster ou valeur constante 1 en entrée) dans l’outil Supérieur à.

Type de données Raster (formule)

Bloc de code

Pour des calculs simples, vous aurez souvent besoin d’utiliser le paramètre Expression. Pour des expressions plus complexes, telles que les calculs d’expressions multilignes ou les opérations (if-else), vous aurez également besoin du paramètre Code Block (Bloc de code). Le paramètre Code Block (Bloc de code) doit être utilisé avec le paramètre Expression.

Les variables définies dans le paramètre Code Block (Bloc de code) peuvent être référencées à partir du paramètre Expression.

Par exemple, la variable size est définie dans le paramètre Code Block (Bloc de code) qui compte le nombre de fichiers dans le chemin d’accès au dossier. Elle est référencée à partir du paramètre Expression au cours de l’exécution. La valeur de la sortie de l’outil Calculate Value correspond au nombre réel de fichiers plus cinq.

Expression:
5 + size

Code Block:
import os
size = 0
folderpath = r"C:\temp\csvFiles"    
for ele in os.scandir(folderpath):
    size += 1

Utilisation des paramètres Expression et Bloc de code

Le paramètre Code Block (Bloc de code) permet également de définir une fonction et de l’appeler à partir du paramètre Expression. Dans Python, une fonction est définie par l’instruction def suivie du nom de la fonction. Une fonction peut inclure des arguments facultatifs et obligatoires, ou ne comporter aucun argument. Renvoie la sortie d’une fonction à l’aide de l’instruction return.

Durée

Le paramètre Code Block (Bloc de code) permet d’appeler des méthodes et modules Python. L’exemple ci-dessous illustre l’appel de la méthode ctime du module time.

Si vous avez besoin de sauvegarder régulièrement des données, vous pouvez les différencier en ajoutant l’heure au nom du dossier. L’exemple ci-dessous illustre comment ajouter un horodatage à un nom de dossier. La fonction time.ctime renvoie la date et l’heure actuelles dans un format semblable au suivant : Tue Jun 22 16:24:08 2021. Cette valeur renvoyée ne peut pas être utilisée directement comme nom de dossier dans l’outil Créer un dossier car les espaces et les signes de ponctuation n’y sont pas autorisés. Pour les supprimer, la méthode replace dans Python est utilisée en empilant la méthode pour chaque élément devant être remplacé. Le nom de dossier ainsi obtenu dans cet exemple est TueJun221622522021.

Expression:
gettime()

Code Block:
import time

def gettime():
  	 # First replace removes punctuation marks. Second replace removes spaces.
  	 return time.ctime().replace(":", "").replace(" ", "")
Exemple d’utilisation du module time de Python

Instruction If-then-else et substitution en ligne

Le paramètre Code Block (Bloc de code) peut également accepter des valeurs par le biais de paramètres de fonction en entrée. Le nombre de paramètres dans Code Block (Bloc de code) doit correspondre au nombre de paramètres dans Expression. Lors de l’exécution de l’outil, la valeur du paramètre est transmise du paramètre Expression à Code Block (Bloc de code). Vous pouvez transmettre la valeur d’une variable de modèle en utilisant une variable en ligne dans le paramètre Expression, comme illustré ci-dessous.

Dans l’exemple ci-dessous, la fonction getAspectDir possède un paramètre inValue. Le paramètre Expression transmet la valeur de la variable Input Degree (Degré en entrée) à Code Block (Bloc de code).

L’exemple suivant illustre le calcul de la direction de l’exposition de la pente d’après la valeur de la variable Input Degree (Degré en entrée). La variable Input Degree (Degré en entrée) ayant une valeur de 223, la direction de l’exposition de la pente renvoie South (Sud).

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"
Définition des fonctions dans le bloc de code

Substitutions en ligne multiples

Le paramètre Code Block (Bloc de code) peut également accepter plusieurs valeurs de variables en ligne.

Le bloc de code vérifie si la valeur de la variable User Input Value (Valeur saisie par l’utilisateur) est supérieure à la valeur de la variable Default Value (Valeur par défaut). Si tel est le cas, la sortie de l’outil Calculate Value (Calculer une valeur) correspond à la valeur de User Input Value (Valeur saisie par l’utilisateur). Dans le cas contraire, la valeur en sortie correspond à la valeur de Default Value (Valeur par défaut). Dans ce cas, la valeur de Output Value (Valeur en sortie) sera 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)
Exemple d’instruction If-else
Attention :

Une variable en ligne de type chaîne est placée entre guillemets ("%string variable%") dans une expression. Les variables en ligne de type numérique (double, long) n’ont pas besoin de guillemets (%double%).

Concaténation d’un chemin d’accès aux données

L’exemple ci-dessous illustre la copie d’entités dans un dossier dont le nom et le chemin d’accès sont spécifiés. Le paramètre Code Block (Bloc de code) accepte deux valeurs : Folder Path (Chemin d’accès au dossier) et Folder Name (Nom de dossier). Le code évalue si la combinaison du chemin d’accès au dossier et du nom de dossier existe. Si le chemin d’accès combiné n’existe pas, la fonction makedirs permet d’ajouter les dossiers manquants. Il est nécessaire d’ajouter la lettre r avant le chemin d’accès au dossier dans le paramètre Expression pour garantir qu’il soit correctement interprété.

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
Exemple de jointure d’un chemin d’accès

Valeur de distance de la zone tampon et concaténation d’unité

Pour utiliser l’outil Calculer une valeur avec un outil qui accepte une distance linéaire, tel que l’outil Zone tampon, procédez comme suit :

  • Renvoyez une valeur de distance et une unité linéaire dans le paramètre Code Block (Bloc de code).
  • Définissez la valeur du paramètre Data Type (Type de données) sur Linear Unit (Unité linéaire).

Dans cet exemple, l’outil Calculer une valeur renvoie une valeur de 12 Kilometers (12 kilomètres) à utiliser avec l’outil Zone tampon.

Expression:
fn("%A%", "%B%")

Code Block:
def fn(a, b):
   	distance = int(a) * int(b)
   	return f"{distance} Kilometers"
Utilisation de la sortie Calculer une valeur comme distance de la zone tampon

ArcPy

ArcPy est un site-package Python d’Esri qui constitue une solution utile et productive pour analyser des données géographiques, convertir ou gérer des données et automatiser des cartes avec Python. ArcPy fournit l’accès à des outils de géotraitement ainsi qu’à des fonctions, des classes et des modules supplémentaires qui vous permettent de créer des processus simples ou complexes.

Curseur

Vous pouvez également utiliser des données à l’aide d’un curseur. Un curseur est un objet d’accès aux données permettant d’explorer par itération un ensemble de lignes d’une table ou d’insérer de nouvelles lignes dans une table. Les curseurs possèdent trois formes : recherche, insertion et mise à jour. Elles sont habituellement utilisées pour lire et écrire des données.

Pour convertir le code d’une espèce d’arbre en son nom commun, vous pouvez utiliser UpdateCursor pour itérer sur chaque arbre de la table. En fonction de la valeur du code de l’arbre, son nom commun lui est affecté. Par exemple, si un arbre possède le code PIPO, affectez-lui son nom commun ponderosa pine (pin ponderosa) dans le champ 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)
Utilisation de Calculer une valeur avec un curseur

Outils de géotraitement

ArcPy permet également d’accéder à des outils de géotraitement. Vous pouvez appeler des outils de géotraitement dans le paramètre Code Block (Bloc de code).

Dans l’exemple suivant, l’outil Calculer une valeur utilise les outils Sélectionner une couche par attributs, Copier des entités et Zone tampon. Ces outils permettent de sélectionner toutes les routes avec un champ LABEL contenant le mot HIGHWAY (Autoroute), d’en faire une copie, puis de buffériser ces routes.

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
Utilisation de Calculer une valeur avec des outils de géotraitement

Rubriques connexes