banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Fri 17 July 2015 15:34

Allererste
Participant occasionnel
Date d'inscription: 11 Aug 2011
Messages: 15

Python calcul d'un champs par rapport aux valeurs d'un autre

Bonjour,

Je commence sur python et j'ai voulu créé un petit code simple qui a pour but:

1) De découper une table d'occupation du sol par rapport a un périmètre

2) D'ajouter une colonne a la table d'occupation du sol ainsi obtenue

3) De calculer des valeurs dans le champ ajouté a cette table

C'est la troisième étape qui me pose problème, je n'arrive pas a calculer un champ à partir d'un autre, en résumé je voudrais que:

Quand le champ LIB2011_1 contient la valeur "Milieux naturels et forestiers" mon champ qui se nomme TB soit rempli de la valeur "OUI" et pour toutes les autres valeurs de  LIB2011_1 il soit rempli de la valeur "NON"

Exemple de la phase 3 de mon code:

# Set local variables
inTable = "C:/Users/xx/Documents/MXD_exo/zoneclip.shp"
fieldName1 = "TB"
expression = "Reclass(text(!LIB2011_1!))"   #c'est cette partie qui me pose problème
codeblock = """def Reclass(LIB2011_1):
    if LIB2011_1 == Milieux naturels et forestiers:
        return OUI
    else:
        return NON"""



# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)

Hors ligne

 

#2 Fri 17 July 2015 18:44

Minotaure
Participant occasionnel
Date d'inscription: 7 Aug 2014
Messages: 32

Re: Python calcul d'un champs par rapport aux valeurs d'un autre

Bonjour.

J'enfonce peut être une porte ouverte, mais à première vue il manque des guillemets autour de "Milieux naturels et forestiers" pour que la comparaison puisse être effectuée. non ?


ἀγεωμέτρητος μηδεὶς εἰσίτω

Hors ligne

 

#3 Fri 17 July 2015 18:51

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: Python calcul d'un champs par rapport aux valeurs d'un autre

Bonjour,

Quel est le message d'erreur que vous obtenez ?

Il me semble que la fonction "text()" n'existe pas en Python...
Il est possible d'utiliser la classe str.

A+

Franck

Hors ligne

 

#4 Sat 18 July 2015 09:26

Allererste
Participant occasionnel
Date d'inscription: 11 Aug 2011
Messages: 15

Re: Python calcul d'un champs par rapport aux valeurs d'un autre

J'ai essayé ça :

Code:

# Set local variables
inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp"
fieldName1 = "TB"
expression = "Reclass(str(!LIB2011_1!))"
codeblock = """def Reclass(LIB2011_1):
    if LIB2011_1 == "Milieux naturels et forestiers":
        return OUI
    else:
        return NON"""



# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)

et j'ai ce message d'erreur:

Exécution du script Script...

<class 'arcgisscripting.ExecuteError'>: ERROR 000539: Error running expression: Reclass(str("Espaces artificialisés")) <type 'exceptions.NameError'>: global name 'NON' is not defined
Échec de l’exécution de (CalculateField).

Échec de l’exécution de (Script).
Échec à Sat Jul 18 09:24:13 2015 (temps écoulé : 15,00 secondes)

Hors ligne

 

#5 Sat 18 July 2015 11:43

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: Python calcul d'un champs par rapport aux valeurs d'un autre

Bonjour,

Il manque des guillemets autour de vos chaînes de retour.
Un mot sans guillemets est forcément soit un mot clé du langage ou un nom de variable dans presque tous les langages de programmation.

C'est le sens du message d'erreur Python :

<type 'exceptions.NameError'>: global name 'NON' is not defined


Le script corrigé :

Code:

# Set local variables
inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp"
fieldName1 = "TB"
expression = "Reclass(str(!LIB2011_1!))"
codeblock = """def Reclass(LIB2011_1):
    if LIB2011_1 == "Milieux naturels et forestiers":
        return 'OUI'
    else:
        return 'NON'"""



# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)

A+

Franck

Hors ligne

 

#6 Sat 18 July 2015 14:02

Allererste
Participant occasionnel
Date d'inscription: 11 Aug 2011
Messages: 15

Re: Python calcul d'un champs par rapport aux valeurs d'un autre

En tapant ce code :

Code:

inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp"
fieldName1 = "TB"
expression = "getClass(!TB!)"
codeblock = """def getClass(LIB2011_1):
    if LIB2011_1 == 'Milieux naturels et forestiers':
        return 'OUI'
    else:
        return 'NON'"""


# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)

La colonne "TB" est remplie mais uniquement de "NON" ! Pas de "OUI" en face de "Milieux naturels et forestiers.

Mais déjà on avance merci pour vos réponses

Hors ligne

 

#7 Sat 18 July 2015 15:42

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: Python calcul d'un champs par rapport aux valeurs d'un autre

Forcément smile

Il faudrait mettre :

Code:

expression = "getClass(!LIB2011_1)"

Et non :

Code:

expression = "getClass(!TB!)"

Ton code fait un calcul sur le champ TB à partir des valeurs du champ TB.

A+

Hors ligne

 

#8 Sat 18 July 2015 18:17

Allererste
Participant occasionnel
Date d'inscription: 11 Aug 2011
Messages: 15

Re: Python calcul d'un champs par rapport aux valeurs d'un autre

Parfait ca marche !

Merci beaucoup pour votre aide.


Pour info le code qui fonctionne :

Code:

inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp"
fieldName1 = "TB"
expression = "getClass(!LIB2011_1!)"
codeblock = """def getClass(LIB2011_1):
    if LIB2011_1 == 'Milieux naturels et forestiers':
        return 'OUI'
    else:
        return 'NON'"""


# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)

Hors ligne

 

Pied de page des forums

Powered by FluxBB