2017-02-05 3 views
0

Я ищу, чтобы сместить некоторые геометрические функции с помощью ArcPy. Однако каждый раз при запуске скрипта я получаю следующее сообщение об ошибке. В чем проблема?Сдвиговые функции с использованием 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 
...  

Когда я поставил:

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

(где форма содержит поля имя XShift, YShift)

я получаю:

Parsing error SyntaxError: EOL while scanning string literal

+0

Вы упускаете апостроф вокруг 'YShift' – pbreach

+0

@pbreach Я добавил апостроф, но теперь я получаю следующее сообщение об ошибке. 'Ошибка выполнения Traceback (самый последний вызов последнего): Файл "", строка 1, в Файл "", строка 6, в shift_features TypeError: размер последовательности должен соответствовать размеру row' –

ответ

0

(я предполагаю, что вы исходя из кода this ArcPy Café recipe.)

Когда вы вызываете cursor.updateRow, вам необходимо передать ему параметр: список значений такой же длины, как и список row, с которым он будет работать. Так, к примеру ...

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'] 

Я только изменил значение из FIELD, но и должны были отправить обратно значения FOO и BAR. Я мог бы также сократить его:

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

Но проходя меньше значения в списке не будет работать:

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

(Это будет так же сломается, если я прохожу слишком много значения - число элементов в списке должно совпадать с количеством полей, называемых по UpdateCursor.)


Так что для вашей конкретной ситуации, вам необходимо передать обратно значения п или [email protected], XShift и YShift. Прямо сейчас, это только получение [email protected] (в котором работает весь оригинальный рецепт фрагмента).

Try:

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]) 
Смежные вопросы