Suite

Vous utilisez l'analyseur Python de la calculatrice de champ avec ArcPy ?

Vous utilisez l'analyseur Python de la calculatrice de champ avec ArcPy ?


J'ai un fichier de formes de points avec deux colonnes que je veux traiter. La première colonne est aspect et la seconde est aspect_m60, il n'y a qu'une seule ligne avec l'aspect de mon point. J'ai essayé d'écrire un script en Python pour ArcGIS 10.2.2 car je veux le mettre dans mon code mais sans succès. Le code est celui-ci :

# Calculer le champ import arcpy # Définir les paramètres d'environnement arcpy.env.workspace = "c:/W/Sik" # Définir les variables locales inTable = "Point" fieldName = "aspect_m60" expression = "getCalc(!aspect!, !aspect_m60!) " codeblock = """def getCalc(aspect, aspect_m60): if (aspect < 60): aspect_m60 = (aspect - 60) + 360 if (aspect = 60): aspect_m60 = aspect - 60 else: aspect_m60 = aspect - 60" ""

Il est beaucoup plus intuitif, à mon avis, de travailler avec des curseurs (plutôt que d'essayer d'émuler la calculatrice de champ dans un script) pour ce type de problème. Voici comment porter le problème sur un curseur de mise à jour :

import arcpy # L'entrée FC fc = "C:/W/Sik.gdb/yourFC" avec arcpy.da.UpdateCursor(fc, ["aspect", "aspect_m60"]) comme curseur : pour la ligne dans le curseur : # ligne[ 0] = "aspect" # ligne[1] = "aspect_m60" if ligne[0] < 60 : ligne[1] = (ligne[0] - 60) + 360 elif ligne[0] == 60 : ligne[1 ] = ligne[0] - 60 else : ligne[1] = ligne[0] - 60 curseur.updateRow(ligne)

Vous essayez de définir le champ dans le bloc de code, alors qu'en réalité vous avez besoin du bloc de code pourrevenirla valeur que vous recherchez. Si vous venez d'ajouterretour aspect_m60après le bloc else, cela devrait fonctionner correctement.

Considérez le bloc de code comme un endroit où écrire des fonctions dont les résultats peuvent être utilisés dans l'expression de votre calculateur de champs.


Votre fonction ne renvoie rien. J'ai modifié votre code pour renvoyer la valeur de aspect_m60.

# Calculer le champ import arcpy # Définir les paramètres d'environnement arcpy.env.workspace = "c:/W/Sik" # Définir les variables locales inTable = "Point" fieldName = "aspect_m60" expression = "getCalc(!aspect!)" codeblock = " ""def getCalc(aspect): if (aspect < 60): aspect_m60 = (aspect - 60) + 360 if (aspect = 60): aspect_m60 = aspect - 60 else: aspect_m60 = aspect - 60 return aspect_m60"""

Comme quelques autres l'ont souligné, il vous manque une valeur de retour. Vous confondez également l'opérateur d'affectation=pour un opérateur d'égalité==(au 2ème si). La structure if est également incorrecte (if/if/else) et calculera la mauvaise valeur pour tout ce qui est inférieur à 60 (devrait être if/elif/else).

Si vous souhaitez toujours utiliser CalculateField (l'autre réponse avec UpdateCursor est parfaitement valide), le bloc de code ci-dessous serait ce que vous vouliez.

codeblock = """def getCalc(aspect, aspect_m60): if aspect < 60: aspect_m60 = (aspect - 60) + 360 elif aspect == 60: aspect_m60 = aspect - 60 else: aspect_m60 = aspect - 60 return aspect_m60 """