научите дурака писать функцию для field сalculator !

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
rapackivi
Новоприбывший
Сообщения: 12
Зарегистрирован: 25 июн 2015, 12:34
Репутация: 2

научите дурака писать функцию для field сalculator !

Сообщение rapackivi » 07 сен 2015, 11:49

ЗАдача - по значению поля X установить значение в поле Y
Пытаюсь коде питона реализовать так:

pre-logic script code:
def find(value):
if !X!=='sobaka':
return 'nadpisy'
else return '0'

Y=find(X)


Но выдает синтаксическую ошибку. Где я даю маху?

Monstria
Активный участник
Сообщения: 133
Зарегистрирован: 17 май 2011, 06:22
Репутация: 50
Откуда: Нижний Новгород

Re: научите дурака писать функцию для field сalculator !

Сообщение Monstria » 07 сен 2015, 12:59

X,Y - тип поля какой?

rapackivi
Новоприбывший
Сообщения: 12
Зарегистрирован: 25 июн 2015, 12:34
Репутация: 2

Re: научите дурака писать функцию для field сalculator !

Сообщение rapackivi » 07 сен 2015, 13:56

text

Monstria
Активный участник
Сообщения: 133
Зарегистрирован: 17 май 2011, 06:22
Репутация: 50
Откуда: Нижний Новгород

Re: научите дурака писать функцию для field сalculator !

Сообщение Monstria » 07 сен 2015, 22:20

Спойлер
2015-09-07_22-15-12.jpg
2015-09-07_22-15-12.jpg (68.44 КБ) 7325 просмотров
На скрине не хватает последней строки кода: -"end if"

Vaska72
Интересующийся
Сообщения: 26
Зарегистрирован: 03 янв 2012, 18:49
Репутация: 13
Откуда: Тюмень

Re: научите дурака писать функцию для field сalculator !

Сообщение Vaska72 » 08 сен 2015, 06:15

rapackivi писал(а): pre-logic script code:
def find(value):
if !X!=='sobaka':
return 'nadpisy'
else return '0'
Не проверял, но
1) после else не хватает двоеточия
2) внутри функции нельзя использовать названия полей, значение поля X передается в функцию как параметр. Соответственно должно быть if value=='sobaka':

rapackivi
Новоприбывший
Сообщения: 12
Зарегистрирован: 25 июн 2015, 12:34
Репутация: 2

Re: научите дурака писать функцию для field сalculator !

Сообщение rapackivi » 08 сен 2015, 12:04

Monstria писал(а):На скрине не хватает последней строки кода: -"end if"
да, я понял - чтобы закрыть первый if.
Но Ваш код у меня не пошел(((( Я вообще не знаю VB - наверное, поэтому. Или я не корректно сформулировал задачу. В любом случае, интерестно было бы узнать реализацию и на VB
Конкретно, пробывал в таком виде:

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

dim s                   ' это, я так понимаю, объявление переменной s. 
                         'Причем, я не пойму - а тип определится автоматически?  
s= [age]                 ' припаяли значение поля age (геологический возраст объекта) переменной s
if not isnull(s) then  ' s - не нулевое? если да (а зачем эта доп.проверка?)
   if s='P2bc' then      'то проверяем s == P2bc ?  Если да,
      s='{щb]'               'то выставляем значение под шрифт отображения Geof
  end if
end if
Итак, s у нас теперь содержит либо ок либо ничего и это присваиваем новому полю TITLE Но это не работает(((( синтаксическую ошибку выдает


А вот замечания Vaska72 помогли запустить код на Python!
Vaska72 писал(а):Не проверял, но
1) после else не хватает двоеточия
да, это промазал как оформлял. Вообще оказалось что в моем случае ветка else - не нужна напрочь. Функция
сама возвращает без спроса у меня ноль
Vaska72 писал(а): 2) внутри функции нельзя использовать названия полей, значение поля X передается в функцию как параметр. Соответственно должно быть if value=='sobaka':
А вот вот это оказалось корнем зла моей проблемы :mrgreen:
Вот изучаешь язык, изучаешь. Читаешь, блин, про локальные глобальные переменные, функции, параметры функций... Все так понятно. Весь такой умный ходишь. А когда приходится попрактиковать - все эти знания лежат на дне сознания как куча хлама. И забываешь напрочь что там в использовании функции допустимо, а что нет.
Конечный код на питоне таков (может, кому пригодится).

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

def index(value):
    if value=='P3':
        return '}х'
    elif  value=='P2bc':      
        return '}зb['  
    elif  value=='P2kn':     
        return '}зkn'  
    elif  value=='P2kv':     
        return '}зkv'  
    elif  value=='N2':     
        return 'N2'  
    elif  value=='N1':     
        return 'N1'  
TITLE=index(age)

Monstria
Активный участник
Сообщения: 133
Зарегистрирован: 17 май 2011, 06:22
Репутация: 50
Откуда: Нижний Новгород

Re: научите дурака писать функцию для field сalculator !

Сообщение Monstria » 08 сен 2015, 17:43

rapackivi писал(а):
Monstria писал(а):

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

if not isnull(s) then  ' s - не нулевое? если да (а зачем эта доп.проверка?)
Можно и не проверять, но если код будет более сложным, то многие функции сбоят если значение в них NULL
Monstria писал(а):

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

      s='{щb]'               'то выставляем значение под шрифт отображения Geof
Но это не работает(((( синтаксическую ошибку выдает
В VB символ ' обозначает начало комментария, для того что бы указать что оперируем строкой, строку необходимо ограничивать ". Т.е. запись должны быть такая:

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

s="{щb]"

rapackivi
Новоприбывший
Сообщения: 12
Зарегистрирован: 25 июн 2015, 12:34
Репутация: 2

Re: научите дурака писать функцию для field сalculator !

Сообщение rapackivi » 09 сен 2015, 11:12

Monstria писал(а):МНЕ БОЛЕЕ ПО ДУШЕ VB - ДЛЯ НЕГО ТАК
Обнаружил у интерпретатора питона под аркгис очень неприятную проблему - если использовать в названиях полей знак подчеркивания - "_", то такой код будет интерпретироваться как синтаксически неверным.
В VB такой проблемы не наблюдается => буду учить VB, вернее вспоминать Basic :D

dime1
Гуру
Сообщения: 939
Зарегистрирован: 29 май 2011, 19:41
Репутация: 94
Откуда: Киев

Re: научите дурака писать функцию для field сalculator !

Сообщение dime1 » 09 сен 2015, 12:28

Решил не создавать новую тему, тоже бодаюсь с if-else в Python. Выдаёт ошибку:
ERROR 999999: Error executing function.
The field is not nullable. [LC_Type]
LC_Type - тип текст, Value - long integer.
Код взят отсюда. Мне тоже нужно сделать подобное - заменить значения (23-100) из поля value и записать их в поле LC_Type. Заранее благодарен.

Pre-logic Script Code:

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

def calcVal(inVal):
  values = {23: "Developed, Open Space",
    24: "Forest",
    25: "Water",
    26: "Wetland"}
  if inVal in values.keys():
    return values[inVal]
  else:
    pass
LC_Type=

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

calcVal(!Value!)
Последний раз редактировалось dime1 09 сен 2015, 13:44, всего редактировалось 1 раз.

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: научите дурака писать функцию для field сalculator !

Сообщение Ariki » 09 сен 2015, 13:13

А это потому что в ветке else у вас идёт pass вместо return. Функция возвращает None, а поле не поддерживает значение null. Вам нужно вернуть по умолчанию либо пустую строку, либо исходное значение LC_Type - смотря что вы хотите получить, если функции встретится значение, которого нет в словаре.

Кроме того, из вашего описания следует, что функции нужно передавать значение поля value, а вы передаёте LC_Type.

С помощью метода get можно сделать вообще в одну строчку:

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

LC_Type = {23: "Developed, Open Space", 24: "Forest", 25: "Water", 26: "Wetland"}.get(!value!, !LC_Type!)
Здесь первый параметр get() - ключ словаря, второй - значение, возвращаемое по умолчанию.

dime1
Гуру
Сообщения: 939
Зарегистрирован: 29 май 2011, 19:41
Репутация: 94
Откуда: Киев

Re: научите дурака писать функцию для field сalculator !

Сообщение dime1 » 09 сен 2015, 13:36

Ariki, за вариант с get отдельное спасибо. Разобрался.

Ответить

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

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

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