2013-04-04 3 views
2

Я довольно новичок в Python и пытаюсь написать сценарий для использования в ArcGIS 10.1 (arcpy); основная идея состоит в том, чтобы добавить новое поле (francis), проверить значения в нескольких других полях, если они являются нулевыми (-99), а затем вывести 0 во Фрэнсис, иначе запустить простое вычисление. Однако я получаю эту ошибку и у меня возникают проблемы движущуюся за ним:«Значение требуется» на arcpy.CalculateField

Traceback (most recent call last):

File "C:\gislab2\Python\take_home\part1\prelim_if2.py", line 28, in arcpy.CalculateField_management(Output_Feature_Class, "Francis", "", "PYTHON_9.3", "")

File "C:\Program Files\ArcGIS\Desktop10.1\arcpy\arcpy\management.py", line 3128, in CalculateField raise e

ExecuteError: Failed to execute. Parameters are not valid. ERROR 000735: Expression: Value is required Failed to execute (CalculateField).

Вот код

# Import arcpy module 
import arcpy 

print "start your engines" 
# Script arguments 
Shapefile = "C:\\gislab2\\Python\\take_home\\USCancer2000.shp" 

Field_Name = Francis 

Output_Feature_Class = "C:\\gislab2\\Python\\take_home\\USCancer2000.shp" 

# Local variables: 
USCancer2000__2_ = Output_Feature_Class 

# Process: Add Field 
arcpy.AddField_management(Shapefile, "Francis", "LONG", "", "", "", "", "NULLABLE", "NON_REQUIRED", "") 

# Process: Calculate Field 
arcpy.CalculateField_management(Output_Feature_Class, "Francis", "", "PYTHON_9.3", "") 
## 
### Process: If-then check for missing values 
## 
if "Cnt1"==-99: 
    Field_name=7 
elif "Cnt2"==-99: 
    Field_name=7 
elif "Cnt3"==-99: 
    Field_name=7 
elif "Pop1"==-99: 
    Field_name==7 
elif "Pop2"==-99: 
    Field_name=7 
elif "Pop3"==-99: 
    Field_name=7 
else: 
     Field_name=("Cnt1"+"Cnt2"+"Cnt3")/("Pop1"+"Pop2"+"Pop3") 
print "done" 

Большое спасибо заранее! david

+0

вы можете показать трассировку стека – karthikr

+0

Traceback (самый последний вызов последнего): Файл "C: \ gislab2 \ Python \ take_home \ part1 \ prelim_if2.py", строка 28, в arcpy.CalculateField_management (Output_Feature_Class, "Francis", "", "PYTHON_9.3", "") Файл "C: \ Program Files \ ArcGIS \ Desktop10.1 \ arcpy \ arcpy \ management.py", строка 3128, в CalculateField raise e ExecuteError: Не удалось выполнить. Параметры недействительны. ERROR 000735: Выражение: требуется значение Не удалось выполнить (CalculateField). >>> заранее заранее –

+1

Поместите это в свой вопрос, где его можно отформатировать правильно, и люди могут его прочитать! – kindall

ответ

2

Третий параметр в arcpy.CalculateField_management говорит ему, что рассчитать. Вы ничего не проходите там. В качестве теста замените эту строку на arcpy.CalculateField_management(Output_Feature_Class, "Francis", 5, "PYTHON_9.3", "") и посмотрите, оценивается ли она.

Как только он успешно запускается, вы должны изучить выражение и кодовое блокирование для выполнения необходимых вычислений. См. Пример расчета (третий) пример here.

--Alternative--

Вы также можете найти его проще использовать updateCursor. Кажется, что больше работы, чем использование calculateField, но это может быть намного быстрее и избавляет вас от необходимости писать свернутый код.

# Import arcpy module 
import arcpy 

print "start your engines" 
# Script arguments 
Shapefile = "C:\\gislab2\\Python\\take_home\\USCancer2000.shp" 

Field_Name = "Francis" 

# Process: Add Field 
arcpy.AddField_management(Shapefile, "Francis", "LONG", "", "", "", "", "NULLABLE", "NON_REQUIRED", "") 

fields = ["Cnt1", "Cnt2", "Cnt3", "Pop1", "Pop2", "Pop3", "Francis"] # the fields you want available to you in the cursor 

with arcpy.da.UpdateCursor(shapefile, fields) as cursor: 
    for row in cursor: # step through each row 
     if not -99 in row: # Check for nulls 
      # none found, do the math 
      row[6] = (row[0] + row[1] + row[2])/(row[3] + row[4] + row[5]) 
     else: 
      # nulls found, zero out the result 
      row[6] = 0 
     cursor.updateRow(row) # save it 

print "done"