Básico Se / Então no Python Parser da ArcGIS Field Calculator?

18

Estou usando o ArcGIS 10.2 for Desktop, e eu tenho procurado neste site, e parece que ainda não consigo descobrir minha resposta. Muito novo para VBA e Python, mas muitos anos com ArcGIS. Eu sei que posso fazer isso da maneira mais lenta com Selecionar por atributos, mas é demorado.

Estou tentando uma junção espacial entre os casos de uma doença (camada de pontos) e os setores censitários dos EUA (camada de polígono). Isso requer dados de contagem. Para cada ponto / caso, eu tenho um campo chamado YEAR com períodos de 2001 a 2012, dependendo do ano em que o caso ocorreu. Eu preciso de uma coluna de contagem para cada ano. Por exemplo, o primeiro que eu estou chamando de COUNT01. Se a data do caso em ANO for 2001, COUNT01 terá 1. Se for outro ano (2002-2012), será necessário um zero. Terei colunas COUNT02, COUNT03 ... COUNT12. Não pode ter um valor "Nulo".

Aqui está o que eu tentei até agora

insira a descrição da imagem aqui

E aqui está a aparência dos dados no Arc.

insira a descrição da imagem aqui

BenW
fonte
3
Eu recomendo que você faça isso usando Python e edite sua pergunta para substituir as tags vbae vbscriptpor uma pythontag. Embora ainda não tenha desaparecido, o VBScript está sendo preterido . Espero que seja fácil fazer isso com o analisador Python depois de fornecer uma descrição mais detalhada, que inclui uma imagem / tabela de algumas linhas de amostra mostrando a entrada real e a saída esperada. YEAR é um campo de data ou um número inteiro que contém valores correspondentes a anos?
PolyGeo
Obrigado pelo conselho e ajuda. Eu adicionei uma imagem da tabela de atributos. A variável de entrada YEAR está atualmente armazenada como um Duplo (foi analisada a partir de uma Data SAS) e a coluna da variável de saída Counts01 é armazenada como Número Inteiro Curto.
BenW
1
Você já pensou em usar Estatísticas resumidas com YEAR como seu campo de caso? Isso deve fornecer a COUNT para cada ano sem a necessidade de usar o Python ou a calculadora de campo.
PolyGeo
Obrigada pelo Conselho. Eu considerei as Estatísticas Resumidas, mas o objetivo final é ter contagens anuais de casos de 1.249 setores censitários individuais, a partir dos quais posso calcular taxas de incidência anuais e médias de 10 anos por 100 mil. Alguns setores censitários não tiveram casos, outros tiveram uma tonelada, mas eu preciso que todos sejam incluídos. Mesmo resumir os folhetos por ano omite 278 desses folhetos sem casos.
BenW

Respostas:

38

Eu acho que é isso que você quer .... usando python, você poderia fazer o seguinte (assume que os campos YEAR e COUNT0X são inteiros)

  • Mude para Python, como destacado abaixo
  • Adicione o código à caixa de entrada 'Pré lógica'
  • Altere o yearVal conforme necessário para cada campo calculado (Count01 usaria 2001, Count02 usaria 2002, etc.)

Observe o Python usando indentação para analisar o código e garantir que o espaçamento esteja correto.

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

esta

fader escuro
fonte
3
@ BenW - se isso resolveu o seu problema, marque-o como a resposta (caixa de seleção abaixo da contagem de votos para respostas).
Chad Cooper
O que fazer se eu quiser verificar um valor de sequência na instrução if, que contém letras acentuadas?
Greyline
O que fazer se os campos estiverem em outro tipo, por exemplo, texto, duplo, etc?
khaliff
@ khaliff, você pode inserir alguma função de conversão de tipo no código python Por exemplo if (int(year) == yearVal): , ou outras (consulte: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
Gisnside #
Obrigado. Você também tem um link onde posso encontrar informações sobre quando usar myCalc, myFunc, Reclass, etc.?
Khaliff # 27/17
8

Essa resposta é essencialmente a mesma listada acima, no entanto, é uma maneira de não precisar usar o bloco de código ... para o campo Count01, você configuraria o analisador para Python e, em seguida, seu cálculo para

1 if !YEAR! == 2001 else 0

A maneira como se lê é: Defina o campo como 1 se o campo ANO for 2001, se não for 2001, defina-o como 0 ...

Se você tiver várias condições if, poderá aninhar as 2º (e subsequentes) condições "if" dentro da instrução else, como esta ...

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

A maneira como se lê é: Defina o campo como 1 se o campo ANO for 2001, se não for 2001, defina-o como 2 se for 2002, se não for, defina-o como 0 ...

Jason Miller
fonte
Como devo modificar esse cálculo se tiver mais de uma condição, quero dizer, como se estivéssemos usando "elif"?
Khaliff #
Se você tem mais de uma condição, você pode aninhar o 2º (e posterior) "se" condições dentro do else ... então você pode acabar com algo parecido com isso ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller
6

Se você estiver usando o VBScript, seu cálculo de campo foi configurado incorretamente. Em primeiro lugar, eu não usaria uma variável que é o nome do campo, isso é confuso, use um nome diferente para que fique claro o que você estava definindo. Seu "endif" estava errado, deveria ser "end if" e seu código deveria estar na seção de script pré-lógico. A maneira correta de configurar isso é mostrada abaixo. Mas, como os outros disseram, tente não usar o VBScript, pois as ESRI estão empenhadas em se livrar dele em favor do Python.

Uso correto da calculadora de campo

Hornbydd
fonte
Muito obrigado pela sua ajuda. Acabei indo com Python, pois parece ser o consenso geral.
BenW