Pages: 1
- Sujet précédent - Remplir un champs avec une condition via la calculette - ArcGIS10 - Sujet suivant
#1 Fri 30 November 2012 09:02
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Remplir un champs avec une condition via la calculette - ArcGIS10
Bonjour,
Je demande votre aide car je suis un peu à bout de solution et pourtant je suis sur que c'est tres simple comme problème.
Mon objectif est de remplir un champs en fonction d'une condition. Si mon champs [COUNT_NUMERO] ne contient rien (donc NULL dans ce cas), je veux remplir mon champs [Indicateur] par la valeur 0. Si ce même champs contient une valeur, je veux que mon champs soit rempli par un ratio [COUNT_NUMERO]/Shape_area.
Je précise que ce calcul est intégré dans un model builder et donc il constitue la fin de ce dernier.
Pour cela, j'utilise donc le code VB SCript de la calculette d'arcgis. Je veux appliquer le code ci dessous mais ARC GIS me sort le message d'erreur "ERROR 999999: Erreur lors de l’exécution de la fonction.
Fin d'instruction attendue"
Code:
Dim X as Long If [COUNT_NUMERO] IS "<Null>" Then X = 0 Elseif [COUNT_NUMERO] IS NOT "<Null>" Then X = [COUNT_NUMERO]/ ([Shape_Area]/10000) End if
Si vous avez une solution je suis preneur car je tourne un peu en rond la.
Hors ligne
#2 Fri 30 November 2012 10:00
- Spacejo
- Membre
- Lieu: Nancy
- Date d'inscription: 17 Aug 2008
- Messages: 2511
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Salut,
De quelle nature est ton champ [COUNT_NUMERO] ?
A+
Joël
Hors ligne
#3 Fri 30 November 2012 10:10
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
C'est un champs en LONG comme mon champs ou je veux réaliser mon calcul
Hors ligne
#4 Fri 30 November 2012 10:34
- Spacejo
- Membre
- Lieu: Nancy
- Date d'inscription: 17 Aug 2008
- Messages: 2511
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Re,
A essayer:
Code:
Dim X as Long CHAMP=[COUNT_NUMERO] If IsNull(CHAMP) = true then X = 0 ElseIf IsNull(CHAMP) = false Then X = [COUNT_NUMERO]/ ([Shape_Area]/10000) End if
Si true et false ne fonctionne pas à essayer aussi:
Code:
Dim X as Long CHAMP=[COUNT_NUMERO] If IsNull(CHAMP) = 0 then X = 0 ElseIf IsNull(CHAMP) = 1 Then X = [COUNT_NUMERO]/ ([Shape_Area]/10000) End if
A+
Joël
Dernière modification par Spacejo (Fri 30 November 2012 10:34)
Hors ligne
#5 Fri 30 November 2012 11:34
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Merci de tes propositions.
J'ai testé les deux et dans les deux cas je retrouve mon message d'erreur.
Je ne sais pas si cela a son importance mais ce champs [COUNT_NUMERO] est issue d'une fusion et donc d'une operation de type COUNT justement
Hors ligne
#6 Fri 30 November 2012 12:18
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Bonjour,
Voilà une boucle qui marche en Python pour des requêtes sur des valeurs nulles. Il fait un test sur la colonne MaColonne pour voir si les valeurs sont nulles. Si c'est le cas il renvoie 1 sinon il renvoie une valeur nulle.
Code:
Code : def Calcul(ChampTest): if str(ChampTest) == "None" : return 1 else: return None En sortie : Calcul( !MaColonne! )
Dans votre cas, ça donnerait un truc du genre :
Code:
Code : def Calcul(CHAMPTEST,CHAMPCOUNT,CHAMPSHAPE): if str(CHAMPTEST) == "None" : return 0 else: return (CHAMPCOUNT/ (CHAMPSHAPE/10000)) En sortie : Calcul( !MaColonne!,!COUNT_NUMERO!,!Shape_Area! )
Ce dernier code est à tester, c'est juste pour l'idée
Dernière modification par Robin (Fri 30 November 2012 13:12)
Hors ligne
#7 Fri 30 November 2012 13:52
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Merci Robin pour ton aide en Python.
On avance car le scritp ne retourne plus la même erreur. Juste qu'il ne reconnait pas !MaColonne! comme champs. (oui je ne maitrise pas du tout python).
En changeant !MaColonne! par ce le nom de celle ou je veux effectuer mon calcul, le script fonctionne mais ne me retourne aucun résultat.
Hors ligne
#8 Fri 30 November 2012 14:25
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Voilà qui devrait aider, j'ai bien relu ce que tu veux faire et j'ai inclus les noms de tes champs. Tu copie/colle ça dans Notepad et tu l’appelle MonScript.cal. Ensuite quand tu es dans ta fenêtre de mise à jour de champ, tu "Charge ce fichier" ou tu peux juste récupérer les codes de part et d'autre de __esri_field_calculator_splitter__
def Calcul(var1,var2):
if str(var1) == "None" :
return 0
else:
return var1/ (var2/10000)
__esri_field_calculator_splitter__
Calcul( !COUNT_NUMERO! , !Shape_Area! )
Hors ligne
#9 Fri 30 November 2012 15:27
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Le message évolue dorénavant.
J'ai utilisé les deux morceaux de codes et il me retourne une erreur de sythaxe Python sur la ligne 1
ERROR 000989 : Erreur de synthaxe Python : Parsing error <type 'exceptions.SyntaxError'>:invalid syntax(line1)
J'ai également tester l'inverse
Code:
def Calcul( CHAMPTEST ): if str( CHAMPTEST ) = 1 : return 1 else: return 0 En sortie Calcul(!tmp!)
Hors ligne
#10 Fri 30 November 2012 15:36
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Question basique : est-ce que Python est bien coché avant que tu lances la commande ? (en général c'est VBScript qui est par défaut)
Hors ligne
#11 Fri 30 November 2012 16:05
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Oui Python est bien coché en haut.
J'ai testé le script sur un autre shape ou je lui fait tester un code INSEE d'une commune.
Code:
def Calcul( !INSEE! ): if str( !INSEE! ) > 1 : return 1 else: return 0 En sortie : tmp = Calcul (!tmp!)
Et j'obtiens le meme message
Hors ligne
#12 Fri 30 November 2012 16:12
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Je precise que je travaille en Geodatabase fichier.
Mais j'ai également tester le script en SHAPE et j'ai le meme message d'erreur
Hors ligne
#13 Fri 30 November 2012 16:34
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
def Calcul( CHAMPTEST ):
if str( CHAMPTEST ) = 1 :
return 1
else:
return 0
En sortie
Calcul(!tmp!)
Attention, il y a une erreur dans ce code, égal pour tester une équivalence s'écrit == (contrairement à = qui indique une assignation à une variable)
De plus str indique une conversion en string donc ce serait plutôt : if str(CHAMPTEST) == "1" :
Idem pour le >, ça s'applique à un champ de nombre pas à une chaine de caractères, ou plutôt ça n'a pas vraiment de sens sur celle ci. Il se peut que j'ai omis un détail qui m'échappe, comme une indentation manquante, un saut de ligne de trop, etc. Python est sensible à la fois à la casse et aux indentations (le retrait de ligne), il faut bien faire attention.
Hors ligne
#14 Fri 30 November 2012 17:17
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Merci pour les précisions. J'ai déjà plus qu’améliorer mes connaissances en Python la.
J'ai bien corrigé le code et bien vérifier les indentations. Apparemment cela serait dans les paramètres qu'il y aurait un soucis.
Même en faisant varié le "None" par un"<Nul>" comme indiqué dans la table il me met le même message d'erreur.
Hors ligne
#15 Fri 30 November 2012 17:50
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
Le None est récupéré via str(var1) sous forme d'une chaine de caractère "None". <Nul> n'est que de l'affichage.
Il s'écrit selon les cas NULL ou None. Pour créer des valeurs nulles en python, il suffit de mettre None (sans guillemets).
Pour ton script n°2, il y a une autre erreur, car tu as mis !INSEE! dans le code.
Le principe pour faire tourner une requête avec Python :
1. Tu écris une fonction générique dans la case d'en haut :
def Calcul(var1,var2):
if str(var1) == "None" :
return 0
else:
return var1/ (var2/10000)
Cette fonction admet en entrée des variables var1 et var2 qui doivent être des noms de champ dans notre cas, récupérés lors du lancement de la fonction.
2. Tu écris ces variables dans la fonction et dans la case d'en bas :
Calcul( !COUNT_NUMERO! , !Shape_Area! ) qui passe donc comme arguments !COUNT_NUMERO! (var1) et !Shape_Area! (var2).
Tes champs !COUNT_NUMERO! et !Shape_Area! sont bien orthographiés comme ça ? Ce sont bien des champs numériques ?
3. Le champ numérique sur lequel porte la fonction récupère la valeur envoyée par return.
Dernière modification par Robin (Fri 30 November 2012 17:52)
Hors ligne
#16 Fri 30 November 2012 18:20
- Fab64
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 4 Oct 2006
- Messages: 20
Re: Remplir un champs avec une condition via la calculette - ArcGIS10
D'accord j'avais mal compris les histoires de variables à passer en paramètres mais la c'est bon.
La formule passe sans erreur dorénavant.
Il fait bien le calcul du else.
Par contre il me remonte la valeur <Nul> et pas un 0.
Mais je sens que le denouement est proche
Hors ligne
Pages: 1
- Sujet précédent - Remplir un champs avec une condition via la calculette - ArcGIS10 - Sujet suivant