Base If / Then dans Python Parser of ArcGIS Field Calculator?

18

J'utilise ArcGIS 10.2 for Desktop, et j'ai parcouru ce site, et je n'arrive pas encore à comprendre ma réponse. Très nouveau pour VBA et Python, mais beaucoup d'années avec ArcGIS. Je sais que je peux le faire lentement avec Select By Attributes, mais cela prend du temps.

J'essaie une jonction spatiale entre les cas de maladie (couche de points) et les secteurs de recensement américains (couche de polygone). Cela nécessite des données de comptage. Pour chaque point / cas, j'ai un champ appelé YEAR avec des plages de dates de 2001 à 2012 selon l'année où le cas s'est produit. J'ai besoin d'une colonne de comptage pour chaque année. Par exemple, le premier que j'appelle COUNT01. Si la date du cas en YEAR est 2001, alors COUNT01 aura un 1. Si c'est une autre année (2002-2012), alors il devra y avoir un 0. J'aurai des colonnes COUNT02, COUNT03 ... COUNT12. Impossible d'avoir une valeur "Null".

Voici ce que j'ai essayé jusqu'à présent

entrez la description de l'image ici

Et voici à quoi ressemblent les données dans Arc.

entrez la description de l'image ici

BenW
la source
3
Je vous recommande de le faire en utilisant Python et de modifier votre question pour remplacer les balises vbaet vbscriptpar une pythonbalise. Bien que pas encore parti VBScript est en train d'être dépréciée . Je m'attends à ce qu'il soit facile à faire avec l'analyseur Python une fois que vous aurez fourni une description plus détaillée qui comprend une image / tableau de quelques exemples de lignes montrant l'entrée réelle et la sortie attendue. YEAR est-il un champ de date ou un champ entier contenant des valeurs correspondant à des années?
PolyGeo
Merci pour les conseils et l'aide. J'ai ajouté une image de la table attributaire. La variable d'entrée YEAR est actuellement stockée sous forme de double (elle a été analysée à partir d'une date SAS) et la colonne de variable de sortie Counts01 est stockée sous forme d'entier court.
BenW
1
Avez-vous envisagé d'utiliser Statistiques récapitulatives avec YEAR comme champ de cas? Cela devrait vous donner le COUNT pour chaque année sans avoir besoin d'utiliser Python ou le Field Calculator.
PolyGeo
Merci pour vos conseils. J'ai pris en compte les statistiques sommaires, mais l'objectif final est d'avoir un nombre annuel de cas pour les 1 249 secteurs de recensement individuels à partir desquels je peux calculer les taux d'incidence annuels et 10 ans par 100 000 habitants. Certains secteurs de recensement n'ont eu aucun cas, certains en ont eu une tonne, mais j'ai besoin qu'ils soient tous inclus. Même en résumant les Tracts par année, 278 de ces tracts sont omis sans cas.
BenW

Réponses:

38

Je pense que c'est ce que vous voulez .... en utilisant python, vous pouvez faire ce qui suit (suppose que les champs YEAR et COUNT0X sont des entiers)

  • Passez à Python comme indiqué ci-dessous
  • Ajoutez le code dans la zone de saisie «Pre Logic»
  • Modifiez le YearVal selon les besoins pour chaque champ que vous calculez (Count01 utiliserait 2001, Count02 utiliserait 2002, etc.)

Remarque Python utilise l'indentation pour analyser le code, assurez-vous donc que l'espacement est correct.

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

cette

fader sombre
la source
3
@BenW - si cela a résolu votre problème, veuillez le marquer comme réponse (case à cocher sous le décompte des votes).
Chad Cooper
Que faire si je veux vérifier une valeur de chaîne dans l'instruction if qui contient des lettres accentuées?
greyline
Que faire si les champs sont sur un autre type (texte, double, etc.)?
khaliff
@khaliff, vous pouvez insérer une fonction de conversion de type dans le code python Par exemple if (int(year) == yearVal): , ou d'autres (voir: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
gisnside
Je vous remercie. Avez-vous également un lien où je peux trouver quand utiliser myCalc, myFunc, Reclass, etc.?
khaliff
8

Cette réponse est essentiellement la même que celle répertoriée ci-dessus, mais c'est un moyen de ne pas avoir à utiliser le bloc de code ... pour le champ Count01, vous devez définir l'analyseur sur Python, puis définir votre calcul sur

1 if !YEAR! == 2001 else 0

La façon dont cela se lit est la suivante: définissez le champ sur 1 si le champ YEAR est 2001, si ce n'est pas 2001, puis définissez-le sur 0 ...

Si vous avez plusieurs conditions if, vous pouvez imbriquer la 2ème (et les suivantes) conditions "if" à l'intérieur de l'instruction else, comme celle-ci ...

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

La façon dont cela se lit est la suivante: définissez le champ sur 1 si le champ YEAR est 2001, si ce n'est pas 2001, puis définissez-le sur 2 si c'est 2002, sinon, définissez-le sur 0 ...

Jason Miller
la source
Comment dois-je modifier ce calcul si j'ai plus d'une condition, je veux dire comme si nous utilisons "elif"?
khaliff
Si vous avez plus d'une condition, vous pouvez imbriquer la 2ème (et les suivantes) conditions "si" à l'intérieur de l'instruction else ... de sorte que vous pourriez vous retrouver avec quelque chose comme ça ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller
6

Si vous allez utiliser VBScript, votre calcul de champ a été mal configuré. Premièrement, je n'utiliserais pas une variable qui est le nom du champ, c'est déroutant, utilisez un nom différent pour que ce soit clair comme vous le définissiez. Votre "endif" était faux, il devrait être "end if" et votre code aurait dû être dans la section du script de pré-logique. La manière correcte de configurer cela est indiquée ci-dessous. Mais comme les autres l'ont dit, essayez de ne pas utiliser VBScript car ESRI est déterminé à s'en débarrasser en faveur de Python.

Utilisation correcte de la calculatrice de champ

Hornbydd
la source
Merci beaucoup pour votre aide. J'ai fini par aller avec Python car cela semble être le consensus général.
BenW