Скрипт на питоне

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Kat
Интересующийся
Сообщения: 40
Зарегистрирован: 08 май 2013, 11:26
Репутация: 1
Откуда: Москва

Скрипт на питоне

Сообщение Kat » 19 апр 2015, 17:13

Здравствуйте!
Пишу скрипт на питоне. Нужно, чтобы он брал данные из таблицы атрибутов, рассчитывал концентрацию и максимальное расстояние и записывал результаты в ту же таблицу, в другие колонки. Пишет ошибку "failed to execute script". Что нужно исправить? :oops:

Код: Выделить всё

import arcpy		     
import sys			      
from math import *	    

A=200
F=1
j=1
PDK1=5
PDK1=7
PDK1=3
V1=(3.14*(D**2)/4)*w
f=1000*(((w**2)*D)/((H**2)*T))
if f<100: m=1/(0.67+(0.1* math.sqrt(f))+(0.34* (math.pow(f, 1./x))))
else: m=1.47/(math.pow(f, 1./x))
vm=0.65*(((V1*T)/H)**0.333)
vml=1.3*(((w**2)*D)/H)
fv=800*(vml**3)
if vm>=2: n=1
if vm<0.5: n=4.4
else: n=(0.532*(vm**2))-(2.13*(vm))+3.13
C1=(A*M1*F*m*n*j)/((H**2)*(V1*T)**0.333)
C2=(A*M2*F*m*n*j)/((H**2)*(V1*T)**0.333)
C3=(A*M3*F*m*n*j)/((H**2)*(V1*T)**0.333)
if vm<=0.5: d=2.48*(1+0.28*(math.pow(fv, 1./x)))
if vm>2: d=7*math.sqrt(vm)*(1+0.28*(math.pow(f, 1./x)))
else: d=(4.95*vm)*(1+0.28*(math.pow(f, 1./x)))

def conc_function(C1, C2, C3, PDK1, PDK2, PDK3):
    return C1+(C2*(PDK1/PDK2))+(C3*(PDK1/PDK3))

def rasst_function(F, d, H):
    return ((5-F)/4)*d*H

table = sys.argv[1]          
Stream = float(sys.argv[2])       

in_field = u'Massa1;Massa2;Massa3;Visota;Temperatur;Diametr;Sred_skor'    
out_field = u'Conc;Maks_rasst'   

rows = arcpy.SearchCursor(table, '', '', in_field)
in_field_values = []
for row in rows:
    tmp = [row.getValue(u'Massa1'), row.getValue(u'Massa2'), row.getValue(u'Massa3'), row.getValue(u'Visota'), row.getValue(u'Temperatur'), row.getValue(u'Diametr'), row.getValue(u'Sred_skor')]
    in_field_values.append(tmp)
del row
del rows

rows = arcpy.UpdateCursor(table, '', '', out_field)
i = 0
for row in rows:
    M1 = in_field_values[i][0]
    M2 = in_field_values[i][1]
    M3 = in_field_values[i][1]
    H = in_field_values[i][1]
    T = in_field_values[i][1]
    D = in_field_values[i][1]
    w = in_field_values[i][1]
    row.setValue(out_field, conc_function(C1, C2, C3, PDK1, PDK2, PDK3))
    row.setValue_1(out_field, rasst_function(F, d, H))
    rows.updateRow(row)
    i += 1
del row
del rows

doujin
Активный участник
Сообщения: 163
Зарегистрирован: 28 июн 2012, 01:02
Репутация: 84
Откуда: Vladivostok

Re: Скрипт на питоне

Сообщение doujin » 20 апр 2015, 07:02

Я бы предложил исправить мозги манеру писать на языке python пренебрегая его рекомендациями об оформлении кода. И еще:
1) Снабдите код комментариями, иначе читать его "как есть" сложно. Это увеличит шанс получить ответ.
2) Напишите сообщение об ошибке полностью, чтобы было легче что-то конкретное советовать.
3) Неплохо было бы приложить пример входных данных, иначе, чтобы протестировать ваш код, нам надо угадать, что вы ему скармливаете.
Ну, а теперь первое, что бросилось в глаза:

Код: Выделить всё

for row in rows:
M1 = in_field_values[0]
M2 = in_field_values[1]
M3 = in_field_values[1]
H = in_field_values[1]
T = in_field_values[1]
D = in_field_values[1]
w = in_field_values[1]
Вот в этом участке кода всем переменным кроме М1 присваивается одно и тоже значение. Скорей всего, это не верно.

Kat
Интересующийся
Сообщения: 40
Зарегистрирован: 08 май 2013, 11:26
Репутация: 1
Откуда: Москва

Re: Скрипт на питоне

Сообщение Kat » 23 апр 2015, 20:28

Дело в том, что по простой (не нагруженной переменными ) формуле все работает...
Например так:

Код: Выделить всё

import arcpy           
import sys               
from math import *       

#задается функция, которая считает концентрацию
def conc_function(М1, М2, М3, Н, Т, D, w):
    return M1+(M2*D)+(M3+T)+w+H

#входные параметры
table = sys.argv[1]         

#название входных полей
in_field = u'Massa1;Massa2;Massa3;Visota;Temperatur;Diametr;Sred_skor'   

#название выходных полей
out_field = u'Conc'   

#Создаем курсор, считывающий пары из значений входных полей, который поместит их в список in_field_values
rows = arcpy.SearchCursor(table, '', '', in_field)
in_field_values = []
for row in rows:
    tmp = [row.getValue(u'Massa1'), row.getValue(u'Massa2'), row.getValue(u'Massa3'), row.getValue(u'Visota'), row.getValue(u'Temperatur'), row.getValue(u'Diametr'), row.getValue(u'Sred_skor')]
    in_field_values.append(tmp)
del row
del rows

#Создаем курсор, обновляющий значения выходного поля, в цикле перебираем все строки таблицы, считая и записывая значения; значения берем из соответствующих пар значений
rows = arcpy.UpdateCursor(table, '', '', out_field)
i = 0
for row in rows:
    M1 = in_field_values[i][0]
    M2 = in_field_values[i][1]
    M3 = in_field_values[i][2]
    H = in_field_values[i][3]
    T = in_field_values[i][4]
    D = in_field_values[i][5]
    w = in_field_values[i][6]
    row.setValue(out_field, conc_function(C1, C2, C3, PDK1, PDK2, PDK3))
    rows.updateRow(row)
    i += 1
del row
del rows
Все записывается в столбец как надо..
А как сделать,чтобы работало с несколькими формулами и if, else? То есть добавить эту часть:

Код: Выделить всё

A=200
F=1
j=1
V1=(3.14*(D**2)/4)*w
f=1000*(((w**2)*D)/((H**2)*T))
if f<100: m=1/(0.67+(0.1* math.sqrt(f))+(0.34* (math.pow(f, 1./x))))
else: m=1.47/(math.pow(f, 1./x))
vm=0.65*(((V1*T)/H)**0.333)
vml=1.3*(((w**2)*D)/H)
fv=800*(vml**3)
if vm>=2: n=1
if vm<0.5: n=4.4
else: n=(0.532*(vm**2))-(2.13*(vm))+3.13
C1=(A*M1*F*m*n*j)/((H**2)*(V1*T)**0.333)
C2=(A*M2*F*m*n*j)/((H**2)*(V1*T)**0.333)
C3=(A*M3*F*m*n*j)/((H**2)*(V1*T)**0.333)
if vm<=0.5: d=2.48*(1+0.28*(math.pow(fv, 1./x)))
if vm>2: d=7*math.sqrt(vm)*(1+0.28*(math.pow(f, 1./x)))
else: d=(4.95*vm)*(1+0.28*(math.pow(f, 1./x)))
Последний раз редактировалось Kat 23 апр 2015, 20:44, всего редактировалось 2 раза.

Kat
Интересующийся
Сообщения: 40
Зарегистрирован: 08 май 2013, 11:26
Репутация: 1
Откуда: Москва

Re: Скрипт на питоне

Сообщение Kat » 23 апр 2015, 20:36

Так выглядит таблица с данными (первые столбцы являются входными данными,ИЗ которых берутся значения)
Столбец "Концентрация" является выходным, сюда записываются посчитанные данные.
Вложения
Безымянный.png
Безымянный.png (21.22 КБ) 3757 просмотров

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей