Se / allora di base in Python Parser di ArcGIS Field Calculator?


18

Sto usando ArcGIS 10.2 per desktop e ho cercato in questo sito e non riesco ancora a capire la mia risposta. Molto nuovo per VBA e Python, ma molti anni con ArcGIS. So che posso farlo lentamente con Select By Attributes, ma richiede tempo.

Sto tentando un'unione spaziale tra i casi di una malattia (strato punti) e US Census Tracts (strato poligonale). Ciò richiede i dati di conteggio. Per ogni punto / caso, ho un campo chiamato ANNO con intervalli di date dal 2001 al 2012 a seconda dell'anno in cui si è verificato il caso. Ho bisogno di una colonna di conteggio per ogni anno. Ad esempio, il primo che sto chiamando COUNT01. Se la data del caso in ANNO è 2001, COUNT01 avrà un 1 al suo interno. Se è un altro anno (2002-2012), allora ci dovrà essere un 0. Avrò colonne COUNT02, COUNT03 ... COUNT12. Non può avere un valore "Null".

Ecco cosa ho provato finora

inserisci qui la descrizione dell'immagine

Ed ecco come appaiono i dati in Arc.

inserisci qui la descrizione dell'immagine


3
Ti consiglio di farlo usando Python e modificare la tua domanda per sostituire i tag vbae vbscriptcon un pythontag. Sebbene non sia ancora andato, VBScript è in procinto di essere deprecato . Mi aspetto che sarà facile avere a che fare con il parser Python una volta fornita una descrizione più dettagliata che include un'immagine / tabella di alcune righe di esempio che mostrano l'input effettivo e l'output previsto. ANNO è un campo data o un campo intero contenente valori corrispondenti ad anni?
PolyGeo

Grazie per il consiglio e l'aiuto. Ho aggiunto un'immagine della tabella degli attributi. La variabile di input YEAR è attualmente memorizzata come Double (è stata analizzata da una data SAS) e la colonna della variabile di output Counts01 è memorizzata come numero intero breve.
BenW,

1
Hai preso in considerazione l'utilizzo Statistiche riassuntive con ANNO come campo del tuo caso? Questo dovrebbe darti il ​​COUNT per ogni anno senza dover usare Python o il calcolatore di campo.
PolyGeo

Grazie per il tuo consiglio. Ho preso in considerazione le statistiche riassuntive, ma l'obiettivo finale è quello di avere un conteggio annuale dei casi per i 1.249 trattati individuali di censimento da cui posso calcolare i tassi di incidenza medi annui e 10 anni per 100k. Alcuni tratti del censimento non hanno avuto casi, alcuni ne hanno avuti molti, ma ho bisogno che siano inclusi tutti. Anche riassumendo i trattati per anno omette 278 di quei trattati senza casi.
BenW,

Risposte:


38

Penso che questo sia quello che vuoi .... usando Python potresti fare quanto segue (presuppone che i campi YEAR e COUNT0X siano numeri interi)

  • Passare a Python come evidenziato di seguito
  • Aggiungi il codice nella casella di input "Pre Logic"
  • Modificare l'annoVal come necessario per ogni campo calcolato (Count01 userebbe 2001, Count02 userebbe 2002, ecc.)

Nota Python utilizza il rientro per analizzare il codice, quindi assicurati che la spaziatura sia corretta.

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

Questo


3
@BenW - se il problema è stato risolto, contrassegnalo come risposta (casella di controllo sotto il conteggio dei voti delle risposte).
Chad Cooper,

Cosa fare se si desidera verificare un valore di stringa nell'istruzione if che contiene lettere accentate?
greyline,

Cosa fare se i campi sono di un altro tipo, ad esempio testo, doppio, ecc.?
Khaliff,

@khaliff potresti inserire una funzione di conversione del tipo nel codice python Ad esempio if (int(year) == yearVal): , o altri (vedi: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
gisnside,

Grazie. Hai anche un link dove posso trovare quando usare myCalc, myFunc, Reclass, ecc.?
Khaliff,

8

Questa risposta è essenzialmente la stessa elencata sopra, tuttavia è un modo per non dover usare il blocco di codice ... per il campo Count01, dovresti impostare il parser su Python e quindi impostare il tuo calcolo su

1 if !YEAR! == 2001 else 0

Il modo in cui viene letto è: impostare il campo su 1 se il campo ANNO è 2001, se non è 2001, quindi impostarlo su 0 ...

Se hai più condizioni if, puoi annidare le condizioni "if" seconde (e successive) all'interno dell'istruzione else, come questa ...

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

Il modo in cui viene letto è: impostare il campo su 1 se il campo ANNO è 2001, se non è 2001, quindi impostarlo su 2 se è 2002, in caso contrario, quindi impostarlo su 0 ...


Come devo modificare questo calcolo se ho più di una condizione, intendo come se stessimo usando "elif"?
Khaliff,

Se hai più di una condizione, puoi annidare la seconda (e successiva) condizione "if" all'interno dell'istruzione else ... quindi potresti finire con qualcosa del genere ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller,

6

Se stai per utilizzare VBScript, il tuo calcolo del campo è stato impostato in modo errato. In primo luogo non vorrei usare una variabile che è il nome del campo, questo è confuso, utilizzare un nome diverso in modo che sia chiaro ciò che stavi impostando. Il tuo "endif" era sbagliato, dovrebbe essere "end if" e il tuo codice avrebbe dovuto trovarsi nella sezione degli script pre-logica. Il modo corretto di impostare questo è mostrato di seguito. Ma come hanno detto gli altri, cerca di non usare VBScript poiché ESRI è intenzionato a sbarazzarsene in favore di Python.

Utilizzo corretto del calcolatore di campo


Grazie mille per il tuo aiuto. Ho finito per andare con Python in quanto sembra essere il consenso generale.
BenW,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.