Basic If / Then in Python Parser of ArcGIS Field Calculator?

18

Korzystam z ArcGIS 10.2 dla komputerów stacjonarnych i przeglądałem tę stronę i wydaje mi się, że nie mogę jeszcze znaleźć odpowiedzi. Nowość w VBA i Python, ale wiele lat w ArcGIS. Wiem, że mogę to zrobić powoli, korzystając z opcji Wybierz według atrybutów, ale jest to czasochłonne.

Próbuję połączyć przestrzennie przypadki choroby (warstwa punktów) i US Census Tracts (warstwa wielokąta). Wymaga to danych zliczających. Dla każdego punktu / sprawy mam pole o nazwie ROK z zakresami dat od 2001 do 2012 w zależności od roku, w którym sprawa się wydarzyła. Potrzebuję kolumny zliczającej na każdy rok. Na przykład pierwszy dzwonię do COUNT01. Jeśli datą sprawy w ROKU jest rok 2001, wówczas COUNT01 będzie miał 1. Jeśli to będzie jakikolwiek inny rok (2002-2012), wtedy będzie musiało być 0. Będę miał COUNT02, COUNT03 ... COUNT12 kolumn. Nie może mieć wartości „Null”.

Oto, co próbowałem do tej pory

wprowadź opis zdjęcia tutaj

A oto jak wyglądają dane w Arc.

wprowadź opis zdjęcia tutaj

BenW
źródło
3
I zaleca, aby zrobić to przy użyciu Python i zmienił swoje pytanie mającą zastąpić vbai vbscriptznaczniki z pythontagiem. Mimo że VBScript nie został jeszcze usunięty, jest on przestarzały . Oczekuję, że będzie to łatwe w przypadku parsera Python, gdy podasz bardziej szczegółowy opis, który zawiera obraz / tabelę niektórych przykładowych wierszy pokazujących rzeczywiste dane wejściowe i oczekiwane dane wyjściowe. Czy ROK jest polem daty lub polem całkowitym zawierającym wartości odpowiadające latom?
PolyGeo
Dziękuję za radę i pomoc. Dodałem obraz tabeli atrybutów. Zmienna wejściowa YEAR jest obecnie przechowywana jako Double (została przeanalizowana z daty SAS), a kolumna zmiennej wyjściowej Counts01 jest przechowywana jako Short Integer.
BenW
1
Czy rozważałeś użycie statystyk podsumowujących z YEAR jako pola swojej sprawy? To powinno dać Ci COUNT na każdy rok bez konieczności używania Pythona lub kalkulatora pola.
PolyGeo
Dzięki za radę. Rozważyłem Statystyki podsumowujące, ale ostatecznym celem jest, aby roczne liczby przypadków przypadały na 1249 indywidualnych obszarów spisu powszechnego, z których mogę obliczyć roczne i 10-letnie średnie współczynniki zapadalności na 100 tys. Niektóre traktaty spisowe nie miały żadnych przypadków, niektóre miały mnóstwo, ale potrzebuję ich wszystkich. Nawet podsumowanie traktatów według roku pomija 278 tych traktatów bez żadnych spraw.
BenW

Odpowiedzi:

38

Myślę, że tego właśnie chcesz .... używając Pythona możesz wykonać następujące czynności (zakłada się, że pola YEAR i COUNT0X są liczbami całkowitymi)

  • Przejdź na Python, jak zaznaczono poniżej
  • Dodaj kod do pola wprowadzania „Pre Logic”
  • Zmień wartość YearVal zgodnie z potrzebami dla każdego obliczanego pola (Count01 użyłby 2001, Count02 użyłby 2002 itd.)

Uwaga: Python używa wcięcia do parsowania kodu, więc upewnij się, że odstępy są prawidłowe.

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

to

ciemny suwak
źródło
3
@BenW - jeśli to rozwiązało problem, zaznacz to jako odpowiedź (pole wyboru pod liczbą głosów odpowiadających).
Chad Cooper
Co zrobić, jeśli chcę sprawdzić wartość ciągu w instrukcji if zawierającej akcentowane litery?
greyline
Co zrobić, jeśli pola są innego typu, np. Tekstowy, podwójny itp?
khaliff
@khaliff możesz wstawić na przykład jakąś funkcję konwersji typu w kodzie Pythona if (int(year) == yearVal): lub inne (patrz: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
gisnside
Dziękuję Ci. Czy masz również link, w którym mogę znaleźć informacje o tym, kiedy użyć myCalc, myFunc, Reclass itp.?
khaliff
8

Ta odpowiedź jest zasadniczo taka sama, jak wymieniona powyżej, jednak jest to sposób, aby nie musieć używać bloku kodu ... dla pola Count01 ustawiłbyś parser na Python, a następnie ustawiłeś swoje obliczenia na

1 if !YEAR! == 2001 else 0

Sposób ten brzmi: Ustaw pole na 1, jeśli pole ROK to 2001, jeśli nie jest 2001, a następnie ustaw je na 0 ...

Jeśli masz wiele warunków if, możesz zagnieździć drugi (i kolejne) warunki „if” w instrukcji else, takie jak ten ...

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

Sposób ten brzmi: Ustaw pole na 1, jeśli pole ROK to 2001, jeśli nie jest 2001, a następnie ustaw je na 2, jeśli to 2002, jeśli nie, a następnie ustaw na 0 ...

Jason Miller
źródło
Jak powinienem zmodyfikować to obliczenie, jeśli mam więcej niż jeden warunek, to znaczy, jakbyśmy używali „elif”?
khaliff
Jeśli masz więcej niż jeden warunek, możesz zagnieździć drugi (i kolejne) warunek „jeśli” w instrukcji else ... więc możesz skończyć z czymś takim ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller,
6

Jeśli zamierzasz używać VBScript, to obliczenia pola były niepoprawne. Po pierwsze, nie użyłbym zmiennej, która jest nazwą pola, to jest mylące, użyj innej nazwy, aby było jasne, co ustawiłeś. Twój „endif” był niepoprawny, powinien to być „end if”, a twój kod powinien znajdować się w sekcji skryptu pre-logicznego. Prawidłowy sposób skonfigurowania tego pokazano poniżej. Ale, jak powiedzieli inni, staraj się nie używać VBScript, ponieważ ESRI są bardzo zainteresowani pozbyciem się go na rzecz Pythona.

Prawidłowe użycie kalkulatora pola

Hornbydd
źródło
Bardzo dziękuję za pomoc. Skończyło się na Pythonie, ponieważ wydaje się, że jest to ogólny konsensus.
BenW