2017-02-05 2 views
0

Je cherche à déplacer certaines entités géométriques en utilisant ArcPy. Toutefois, le message d'erreur suivant s'affiche chaque fois que j'exécute le script. Quelle est la solution?Fonctions de déplacement utilisant Arcpy

import arcpy 
def shift_features (in_features): 
... with arcpy.da.UpdateCursor(in_features, ['[email protected]','XShift',YShift']) as cursor: 
...  for row in cursor: 
...   cursor.updateRow([[row[0][0] + (row[1] or 0), 
...        row[0][1] + (row[2] or 0)]]) 
... return 
...  

Quand je mis:

shape=r'E:\Yael\All Sorts\Testing\MovingPolygon.shp' 
shift_features(shape) 

(où la forme contient des champs Nom XShift, YSHIFT)

Je continue à recevoir:

Parsing error SyntaxError: EOL while scanning string literal

+0

vous manque une seule citation autour 'YShift' – pbreach

+0

@pbreach J'ai ajouté la citation unique, mais maintenant je reçois l'erreur suivante. 'Erreur d'exécution retraçage (appel le plus récent en dernier): Fichier "", ligne 1, dans Fichier "", ligne 6, en shift_features TypeError: la taille de la séquence doit correspondre à la taille de la row' –

Répondre

0

(Je suppose que vous êtes baser votre code sur this ArcPy Café recipe.)

Lorsque vous appelez cursor.updateRow, vous devez lui renvoyer un paramètre: une liste de valeurs de la même longueur que la liste de row avec laquelle il fonctionnerait. Ainsi, par exemple ...

with arcpy.da.UpdateCursor(feature, ['FIELD', 'FOO', BAR']) as cursor: 
    for row in cursor: 
     print row    # prints a list of 3 values -- ['a', 'b', 'c'] 
     row[0] = 'd'    # changes element 0 of list 
     print row    # ['d', 'b', 'c'] 
     cursor.updateRow(row) # passes ['d', 'b', 'c'] 

Je ne changé la valeur de FIELD, mais a également renvoyer des valeurs pour FOO et BAR. Je pourrais aussi raccourcir:

with arcpy.da.UpdateCursor(feature, ['FIELD', 'FOO', BAR']) as cursor: 
    for row in cursor: 
     cursor.updateRow(['d', 'b', 'c']) # will work 

Mais en passant moins de valeurs dans la liste ne fonctionnera pas:

with arcpy.da.UpdateCursor(feature, ['FIELD', 'FOO', BAR']) as cursor: 
    for row in cursor: 
     cursor.updateRow(['d']) # will fail 

(Il cassera même, si je passe trop de valeurs - le nombre de éléments de la liste doit correspondre au nombre de champs appelés par le UpdateCursor.)


donc, pour votre situation, vous devez transmettre des valeurs f ou [email protected], XShift et YShift. À l'heure actuelle, il ne reçoit que [email protected] (ce qui correspond à la recette originale de l'extrait).

Essayez:

with arcpy.da.UpdateCursor(in_features, ['[email protected]']) as cursor: 
    for row in cursor: 
     cursor.updateRow([[row[0][0] + (row[1] or 0), 
          row[0][1] + (row[2] or 0)]], row[1], row[2])