Tenho algumas dezenas de classes de recursos, uma das quais contém o campo que estou procurando. Eles são armazenados em vários bancos de dados geográficos de arquivos diferentes.
Existe uma maneira rápida de pesquisar cada classe de recurso para encontrar a que possui meu campo? Ou tenho que verificar a tabela de atributos de cada um no Catálogo? Alguns dos arquivos têm o mesmo nome, mas são armazenados em locais separados.
Gostaria de poder fazer isso dentro de uma Calculate Value
ferramenta no ModelBuilder, para que, sempre que necessário, pudesse executar o modelo em um único arquivo gdb e ele pesquisasse todas as classes de recursos desse gdb e procurasse o campo .
Até agora, eu tenho um iterador de classe de recurso que itera sobre todas as classes de recurso no arquivo gdb recursivamente. Dentro do Calculate Value
eu tenho o seguinte código:
findField(r"%Feature%", "%Search Field%")
def findField(fc, fi):
lst = arcpy.ListFields(fc)
for f in lst:
if f.name == fi:
return fc
else:
return "not found"
Os valores retornados são coletados em Output Values
como seqüências de caracteres. A saída para todas as classes de recursos foi "não encontrada", mesmo que o campo exista em pelo menos 4 delas.
fonte
Calculate Value
para pesquisar o campo e retornar o caminho da classe feature como uma string, se encontrar o campo - veja minha resposta abaixo.Respostas:
Eu preferiria uma compreensão da lista em vez de operações de string (como resposta aceita). Na minha opinião, isso é mais legível e pitônico. Além disso, a abordagem de compreensão da lista pode ser estendida adicionando mais funcionalidades (
str.lower()
como o @RyanDalton) muito fácil.Se você preferir a instrução if-else de um forro:
Ou ainda mais curto, mas menos legível:
fonte
Confira esta função de Bjorn Kuiper para testar se existe um campo :
com o seguinte exemplo de uso:
fonte
você pode usar arcpy:
Além disso, você pode usar o os.walk para arquivos em sua unidade como:
espero que ajude você ....
fonte
Arabella, são as suas façanhas em conjuntos de dados de recursos? Nesse caso, a solução do @ Aragon não funcionará porque você precisa percorrer os conjuntos de dados dos recursos e verificar as classes de recursos.
Usando o código de @ Aragon e o de @ gotchula de Listar todas as classes de recursos no GDB, inclusive nos conjuntos de dados de recursos , eu produzi o código a seguir que lerá todos os conjuntos de dados de recursos e classes de recurso em um geodatabase.
NOTA : Por padrão, ListFields parece fazer distinção entre maiúsculas e minúsculas. Adicionei código para converter o nome do campo definido pelo usuário e o nome do ListField em minúsculas para pesquisas que não diferenciam maiúsculas de minúsculas. Você provavelmente também desejaria desativar a maioria das instruções de impressão, mas as deixei lá para que você possa seguir o código enquanto ele está sendo executado. Eu também criei a subfunção FindField dentro do arquivo para que eu pudesse chamá-lo várias vezes no script sem precisar codificá-lo novamente.
fonte
Calculate Value
que retorne - possoreturn "true" if FindField(fc,myField) =="true" else "false"
?Alguns dançaram da maneira que eu faria isso, mas eu só quero adicionar uma maneira fácil de fazer uma linha:
O que talvez seja mais útil (se você estiver repetindo várias classes de recursos), usaria o oposto do acima como filtro:
fonte
Encontre a resposta com alguma ajuda do código na resposta a esta pergunta . Peguei todos os nomes de campos, os converti em uma sequência e depois procurei na sequência pelo meu campo. O código
Calculate Value
agora é o seguinte:O
Output Values
agora contém a lista completa de classes de recursos que possuem o campo que eu procurei enot found
o restante.fonte