Основні Якщо / Тоді в Python Parser калькулятора поля ArcGIS?


18

Я використовую ArcGIS 10.2 для робочого столу, і я переглядав цей сайт, і не можу ще зрозуміти свою відповідь. Дуже новинка VBA та Python, але багато років з ArcGIS. Я знаю, що можу це зробити повільним способом за допомогою Select By Attributes, але це забирає багато часу.

Я намагаюся просторово поєднати між випадками захворювання (точковий шар) та урочищами перепису населення США (багатокутний шар). Для цього потрібні дані підрахунку. Для кожного пункту / випадку я маю поле під назвою YEAR з діапазонами дат 2001 - 2012, залежно від того, у якому році випадок трапився. Мені потрібна графа для підрахунку на кожен рік. Наприклад, перший, який я телефоную COUNT01. Якщо дата справи у РОКІ 2001 року, то COUNT01 матиме 1 у ній. Якщо це будь-який інший рік (2002-2012), тоді знадобиться 0. У мене буде стовпців COUNT02, COUNT03 ... COUNT12. Не може мати значення "Null".

Ось що я спробував поки що

введіть тут опис зображення

І ось як виглядають дані у Arc.

введіть тут опис зображення


3
Я рекомендую зробити це за допомогою Python і відредагувати своє запитання, щоб замінити теги vbaта vbscriptтеги python. Незважаючи на те, що VBScript ще не використовується, система VBScript ще не використовується . Я думаю, що це буде легко зробити з аналізатором Python, як тільки ви надасте більш детальний опис, який включає зображення / таблицю зразків рядків, що показують фактичний вхід та очікуваний вихід. Чи YEAR - це поле дати чи ціле поле, що містить значення, відповідні рокам?
PolyGeo

Дякую за пораду та допомогу. Я додав зображення таблиці атрибутів. Вхідна змінна YEAR в даний час зберігається як подвійна (вона була розбита з дати SAS), а стовпець змінної виводу Counts01 зберігається у вигляді короткого цілого числа.
BenW

1
Чи розглядали Ви як підсумкове статистику використовувати Зведені статистичні дані з YEAR? Це має давати вам КОЛЮЧУ за кожен рік, не використовуючи Python або Field Calculator.
PolyGeo

Дякую за вашу пораду. Я враховував підсумкову статистику, але остаточною метою є щорічне підрахунок випадків на 1249 окремих урочищах перепису, з яких я можу розрахувати середньорічні та 10-річні показники захворюваності на 100 тис. У деяких переписних урочищах не було випадків, в деяких - тонна, але мені потрібно, щоб вони були включені. Навіть підсумовуючи урочища за роками, опущено 278 цих урочищ без випадків.
BenW

Відповіді:


38

Я думаю, що це те, що ти хочеш .... використовуючи python, ти можеш зробити наступне (припускаємо, що поля YEAR і COUNT0X є цілими числами)

  • Перейдіть на Python, як зазначено нижче
  • Додайте код у вікно введення "Попередньо логіка"
  • Змініть yearVal за потребою для кожного обчисленого поля (Count01 буде використовувати 2001, Count02 буде використовувати 2002, тощо)

Зверніть увагу на Python, використовуючи відступи для аналізу коду, щоб переконатися, що інтервал правильний.

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

це


3
@BenW - якщо це вирішило вашу проблему, позначте це як відповідь (прапорець під підрахунком голосів відповідей).
Чад Купер

Що робити, якщо я хочу перевірити значення рядка в операторі if, що містить наголошені літери?
greyline

Що робити, якщо поля знаходяться в іншому типі, наприклад, текст, подвійний тощо?
халіф

@khaliff, ви можете вставити певну функцію перетворення типу в код python, наприклад if (int(year) == yearVal): , або інші (див.: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
gisnside

Дякую. Чи є у вас також посилання, де я можу дізнатися про те, коли використовувати myCalc, myFunc, Reclass тощо?
халіф

8

Ця відповідь по суті така ж, як перерахована вище, однак це спосіб не потрібно використовувати блок коду ... для поля Count01, ви встановите аналізатор на Python, а потім встановите свій розрахунок на

1 if !YEAR! == 2001 else 0

Як це читається: Установіть поле на 1, якщо поле РОКУ 2001, якщо це не 2001, то встановіть його на 0 ...

Якщо у вас кілька, якщо умови, ви можете вкласти 2-й (і наступні) умови "якщо" всередині іншого оператора, такого як цей ...

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

Як це читається: Установіть поле на 1, якщо поле РОКУ 2001, якщо це не 2001, то встановіть його на 2, якщо це 2002, якщо ні, то встановіть його на 0 ...


Як я можу змінити цей розрахунок, якщо у мене більше ніж одна умова, я маю на увазі, ніби ми використовуємо "elif"?
халіф

Якщо у вас є більше ніж одна умова, ви можете вкласти другий (і наступний) умови "if" всередині іншого твердження ... так що ви можете закінчити щось подібне ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Джейсон Міллер

6

Якщо ви збираєтеся використовувати VBScript, то обчислення поля було встановлено неправильно. По-перше, я б не використовував змінну, яка є ім'ям поля, це заплутано, використовуйте іншу назву, щоб її кришталево зрозуміло, що ви встановлювали. Ваш "ендіф" був невірним, він повинен бути "закінчити, якщо", і ваш код повинен був знаходитись у розділі попереднього логічного сценарію. Правильний спосіб цього налаштування показаний нижче. Але, як говорили інші, намагайтеся не використовувати VBScript, оскільки ESRI пекло позбавляється від його позбавлення на користь Python.

Правильне використання калькулятора поля


Дуже дякую за вашу допомогу. Я врешті-решт пішов з Python, як здається, загальний консенсус.
BenW
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.