Dans la capture d'écran ci-jointe, les attributs contiennent deux champs d'intérêt "a" et "b". Je veux écrire un script pour accéder aux lignes adjacentes afin de faire des calculs. Pour accéder à une seule ligne, j'utiliserais le UpdateCursor suivant:
fc = r'C:\path\to\fc'
with arcpy.da.UpdateCursor(fc, ["a", "b"]) as cursor:
for row in cursor:
# Do something
Par exemple, avec OBJECTID 4, je suis intéressé à calculer la somme des valeurs de ligne dans le champ "a" adjacent à la ligne OBJECTID 4 (c'est-à-dire 1 + 3) et à ajouter cette valeur à la ligne OBJECTID 4 dans le champ "b". Comment puis-je accéder aux lignes adjacentes avec le curseur pour effectuer ce genre de calculs?
la source
OBJECTID
cette solution peut identifier de manière fiable les voisins en fonction des valeurs de cette clé. Cependant, les dictionnaires ne prennent généralement pas en charge une recherche "suivante" ou "précédente". Vous avez besoin de quelque chose comme un Trie .Lors du bouclage sur les lignes, vous devez garder une trace des valeurs précédentes. C'est une façon de procéder:
ou, si la table n'est pas énorme, je construirais probablement un dictionnaire, comme d = {a: b} puis dans le curseur de mise à jour, accédez aux données du dictionnaire: d.get (a + 1) ou d.get (a -1) pour faire le calcul ..
la source
J'ai accepté la réponse de @Hornbydd pour m'avoir conduit vers une solution de dictionnaire. Le script joint effectue les actions suivantes:
la source
Le module d'accès aux données est assez rapide et vous pouvez créer un
SearchCursor
pour enregistrer toutes les valeurs de «a» dans une liste, puis créer unUpdateCursor
pour parcourir chaque ligne et sélectionner dans la liste pour mettre à jour les lignes «b» nécessaires. De cette façon, vous n'avez pas à vous soucier de l'enregistrement des données entre les lignes =)Donc quelque chose comme ça:
C'est une solution assez grossière mais je l'ai utilisée récemment pour contourner un problème très similaire. Si le code ne fonctionne pas, espérons-le, il vous met sur la bonne voie!
Edit: dernière modification de l'instruction if de AND en OR Edit2: modification en arrière. Ahh la pression de mon premier post StackExchange!
la source
aList
au lieu d'ajouter chaque entrée. 2) Utilisezenumerate()
au lieu d'avoir un compteur séparé pour l'index.Vous avez d'abord besoin d'un curseur de recherche; Je ne pense pas que vous puissiez obtenir des valeurs avec un curseur de mise à jour. Ensuite, à chaque itération, utilisez aNext = row.next (). GetValue ('a') pour obtenir la valeur de la ligne suivante.
Pour obtenir la valeur de la ligne précédente, je définirais une variable à l'extérieur de la boucle for égale à zéro. Ceci est mis à jour pour égaler la valeur actuelle des lignes de 'a'. Vous pouvez ensuite accéder à cette variable dans l'itération suivante.
Cela satisferait alors votre équation de B = A (rowid-1) + A (rowid + 1)
la source
fieldA
et l'utiliser pour calculer une nouvelle valeur pourfieldB
.)