Você pode fazer isso usando a ferramenta Calcular valor (gerenciamento de dados) e alguma mágica do Python. Veja também esta pergunta relacionada: Adicionar código arbitrário ao construtor de modelos Arcgis?
Uma variável de múltiplos valores é apenas uma sequência de valores delimitada por ponto-e-vírgula; portanto, o que a multivaluesToCsv
função abaixo faz é dividir as variáveis de múltiplos valores em listas e transpor essas linhas para linhas que são gravadas em um arquivo de texto CSV (valor separado por vírgula) .
Os iteradores de modelo executam TODOS os processos no modelo uma vez por iteração - isso é indesejável para a ferramenta Calcular Valor, que queremos executar apenas uma vez no final. A maneira como você faz isso é criando outro modelo externo para envolver o modelo interno original. Isso é discutido no tópico da ajuda Integrando um modelo em um modelo .
Então, aqui está o que você precisa fazer para que isso funcione:
Modelo Interno - Repete as classes de recursos, processa-as e coleta valores:
- No seu modelo original, que será o nosso modelo "interno", adicione outra ferramenta Coletar Valores para coletar os
Name
valores da variável, para que possamos mapear os valores estatísticos da distância para os nomes de classes de recursos correspondentes.
- Exponha as variáveis de entrada e saída como parâmetros do modelo (clique com o botão direito do mouse em uma forma oval e marque Parâmetro do modelo). Faça isso para cada uma das saídas das ferramentas Coletar valor, bem como quaisquer parâmetros de entrada necessários, como o Espaço de trabalho de entrada.
- Salve e feche o modelo interno.
Modelo externo - Executa o modelo interno, executa a ferramenta Calcular valor apenas uma vez quando o modelo interno é concluído:
- Crie um novo modelo - este será o nosso modelo "externo".
- Adicione uma variável do tipo
Folder
para permitir que você especifique onde criar o arquivo CSV de saída.
- Adicione uma variável do tipo
String
para permitir que você especifique o nome do arquivo CSV de saída.
- Adicione o Modelo Interno ao novo modelo (arraste e solte no ArcToolbox ou clique com o botão direito do mouse em Adicionar Dados ou Ferramenta, navegue até o modelo interno e clique em Adicionar)
- Crie variáveis para quaisquer parâmetros do modelo interno que você deseja definir a partir do modelo externo, como o Espaço de Trabalho de Entrada (clique com o botão direito do mouse no modelo interno e escolha Tornar Variável a Partir do Parâmetro).
- Adicione a ferramenta Calcular valor ao novo modelo
Cole o seguinte nas caixas apropriadas da ferramenta Calcular Valor:
Expressão :
multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
- Isso usa substituição de variável em linha para passar as variáveis de modelo para a função. Ajuste para corresponder aos nomes de variáveis do modelo.
- O
r
antes "%Output CSV File Location%"
é significativo: isso indica que essa é uma sequência bruta ; como os caminhos do sistema de arquivos do Windows geralmente contêm barras invertidas (um caractere de escape no Python), precisamos usá-lo para impedir que o Python interprete incorretamente as barras invertidas e os caracteres subseqüentes como sequências de caracteres especiais.
- Certifique-se de colocar aspas em torno das variáveis em linha, porque sem elas o Python pensará que são identificadores em vez de cadeias.
Bloco de código:
import os, csv
def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
ext = 'csv' # Define output file extension (e.g. csv or txt)
header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
# Join CSV file path and name, adding extension if necessary
csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
# Open text file for writing
with open(csvfile, 'wb') as f:
w = csv.writer(f)
w.writerow(header) # Write header row
rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
w.writerows(rows)
return csvfile
(Opcional) Exponha as variáveis de entrada e saída como parâmetros do modelo se desejar poder executá-las na caixa de diálogo de ferramentas do modelo ou encadear com outros modelos / scripts. A única saída do modelo externo é o arquivo CSV.
- (Opcional) Conecte as variáveis de entrada e as saídas do modelo interno à ferramenta Calcular valor como pré-condições. Eu não acho que isso tenha algum efeito, apenas torna mais claro visualmente o que está acontecendo.
Eu testei isso com o ModelBuilder e o fiz funcionar (veja as capturas de tela).
Modelo interno :
Modelo exterior:
O modelo interno executa todos os seus processos uma vez por classe de recurso e, em seguida, a ferramenta Calcular Valor é executada uma vez no final para gerar o arquivo CSV uma vez e apenas uma vez.