Базовый If / Тогда в Python Parser ArcGIS Field Calculator?

18

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

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

Вот что я пробовал до сих пор

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

А вот как выглядят данные в Arc.

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

BenW
источник
3
Я рекомендую вам сделать это с помощью Python и редактировать свой вопрос, заменяющий vbaи vbscriptтег с pythonтегом. Хотя это еще не сделано, VBScript находится в процессе устаревания . Я ожидаю, что это будет легко сделать с анализатором Python, как только вы предоставите более подробное описание, которое включает в себя рисунок / таблицу с некоторыми примерами строк, показывающими фактический ввод и ожидаемый вывод. Является ли YEAR полем даты или целочисленным полем, содержащим значения, соответствующие годам?
PolyGeo
Спасибо за совет и помощь. Я добавил изображение таблицы атрибутов. Входная переменная YEAR в настоящее время хранится как Double (она была проанализирована по дате SAS), а столбец выходной переменной Counts01 сохраняется как Short Integer.
BenW
1
Рассматривали ли вы использование сводной статистики с YEAR в качестве поля вашего дела? Это должно дать вам COUNT за каждый год без использования Python или Field Calculator.
PolyGeo
Спасибо за ваш совет. Я рассматривал сводную статистику, но конечной целью является получение ежегодных подсчетов случаев по 1249 отдельным участкам переписи, из которых я могу рассчитать среднегодовые и 10-летние показатели заболеваемости на 100 тыс. Человек. У некоторых участков переписи не было случаев, у некоторых была тонна, но мне нужно, чтобы они все были включены. Даже при суммировании трактатов по годам пропускается 278 из этих трактатов без случаев.
BenW

Ответы:

38

Я думаю, что это то, что вы хотите .... с помощью Python вы можете сделать следующее (предполагается, что поля YEAR и COUNT0X являются целыми числами)

  • Измените на Python, как показано ниже
  • Добавьте код в поле ввода «Pre Logic»
  • Измените yearVal по мере необходимости для каждого вычисляемого поля (Count01 будет использовать 2001, Count02 будет использовать 2002 и т. Д.)

Обратите внимание, что Python использует отступ для анализа кода, поэтому убедитесь, что интервал правильный.

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

это

темный фейдер
источник
3
@BenW - если это решило вашу проблему, отметьте это как ответ (установите флажок под подсчетом ответов).
Чед Купер
Что делать, если я хочу проверить строковое значение в операторе if, который содержит акцентированные буквы?
Greyline
Что делать, если поля другого типа, например, text, double и т. Д.?
Халифф
@khaliff вы можете вставить некоторые функции преобразования типов в код Python, например if (int(year) == yearVal): , или другие (см .: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
Гиснсайд
Спасибо. У вас также есть ссылка, где я могу найти информацию о том, когда использовать myCalc, myFunc, Reclass и т. Д.?
Халиф
8

Этот ответ, по сути, такой же, как перечисленный выше, однако это способ не использовать блок кода ... для поля Count01 вы должны установить синтаксический анализатор на Python, а затем установить свой расчет на

1 if !YEAR! == 2001 else 0

Это выглядит так: Установите поле в 1, если поле YEAR 2001, если не 2001, то установите в 0 ...

Если у вас есть несколько условий if, вы можете вкладывать 2-е (и последующие) условия if в оператор else, например this ...

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

Это читается следующим образом: установите поле в 1, если поле YEAR 2001, если не 2001, то установите в 2, если 2002, если нет, то установите в 0 ...

Джейсон Миллер
источник
Как мне изменить этот расчет, если у меня более одного условия, я имею в виду, как будто мы используем «elif»?
Халифф
Если у вас более одного условия, вы можете вкладывать 2-е (и последующие) условия «если» в оператор else… так что вы можете получить что-то вроде этого…1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Джейсон Миллер,
6

Если вы собираетесь использовать VBScript, тогда ваше поле вычислено неправильно. Во-первых, я бы не использовал переменную, которая является именем поля, это сбивает с толку, используйте другое имя, чтобы его было кристально ясно, что вы устанавливали. Ваш «endif» был неправильным, это должно быть «end if» и ваш код должен был находиться в разделе пред-логического скрипта. Правильный способ настройки показан ниже. Но, как говорили другие, старайтесь не использовать VBScript, поскольку ESRI одержим желанием избавиться от него в пользу Python.

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

Hornbydd
источник
Большое спасибо за вашу помощь. Я закончил с Python, так как это, кажется, общий консенсус.
BenW