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

#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

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

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 smile

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

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

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

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

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

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

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

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

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

 

Pied de page des forums

Powered by FluxBB