Exportando dados da saída Collect Values ​​no ArcGIS ModelBuilder?

11

Atualmente, estou jogando com o ModelBuilder. Adicionei uma foto do modelo que tenho no momento.

Atualmente, este modelo está iterando 6 arquivos de forma, de modo que cada um dos 'valores de saída' contenha 6 figuras em uma lista. Não consigo encontrar uma maneira de extrair os valores dessas listas em um arquivo de tabela / texto ou similar.

Existe uma maneira de fazer isso?

modelo

Isto é o que é mostrado quando abro 'valores de saída' depois de executar o modelo: insira a descrição da imagem aqui

Eu só quero pegar esses 6 números de alguma forma ...

JPD
fonte
Isso é basicamente a mesma coisa que você está perguntando aqui, correto? gis.stackexchange.com/questions/25922/… Coletar valores faz exatamente isso. Se você ler a ajuda, ela informará que ela coleta valores que podem ser passados ​​para outra ferramenta. Então, o que você está tentando fazer com os valores? É apenas registrá-los em um arquivo ou você precisa deles para processamento adicional?
theJones
Eu só quero registrá-los em um arquivo. Não consigo encontrar uma ferramenta para alimentar os valores de saída no construtor de modelos para extraí-los.
JPD

Respostas:

17

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 multivaluesToCsvfunçã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:

  1. No seu modelo original, que será o nosso modelo "interno", adicione outra ferramenta Coletar Valores para coletar os Namevalores da variável, para que possamos mapear os valores estatísticos da distância para os nomes de classes de recursos correspondentes.
  2. 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.
  3. 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:

  1. Crie um novo modelo - este será o nosso modelo "externo".
  2. Adicione uma variável do tipo Folderpara permitir que você especifique onde criar o arquivo CSV de saída.
  3. Adicione uma variável do tipo Stringpara permitir que você especifique o nome do arquivo CSV de saída.
  4. 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)
  5. 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).
  6. Adicione a ferramenta Calcular valor ao novo modelo
  7. 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 rantes "%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
    
  8. (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.

  9. (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 interno

Modelo exterior: Modelo externo

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.

blah238
fonte
Olá, obrigado por colocar tanto esforço em sua resposta e desculpas pela minha resposta tardia. Estou tentando executar o modelo como você descreveu, mas estou tendo problemas com o CSV. Criei um arquivo CSV em branco no Excel, salvei-o e carreguei-o no modelo. ERRO 000539: Erro ao executar a expressão: multivaluesToCsv (r "% CSV File%", "% FC Name Values%", "% Valores Mínimos%", "% Valores Médios%", "% Valores Médios%", "% Valores Máximos%") <exceção de tipo .IOError '>: [Erro 13] Permissão negada: u'% CSV File% 'Falha ao executar (Calcular Valor). Eu continuo recebendo esse erro. Meu CSV é chamado CSVFile.csv.
JPD 30/05
1
Apenas consertei - esta é a solução perfeita. Muito obrigado pela sua ajuda!
JPD
O código Python criará o arquivo CSV para você, sem necessidade de criá-lo previamente. Como você viu, se você abrir o arquivo no Excel, ele bloqueia o arquivo e não pode ser gravado pelo Python até você fechá-lo.
Blah238
2
Para sua informação, atualizei as instruções e as capturas de tela para usar modelos aninhados para evitar que o Calculate Value seja executado várias vezes, além de corrigir o problema em que o arquivo de texto deveria existir anteriormente (agora você especifica o local de saída e o nome do arquivo como dois parâmetros separados).
precisa saber é o seguinte
Excelente resposta! Ajudou-me a resolver um problema semelhante, gerando estatísticas de validação cruzada da camada geoestatística em um arquivo csv. Obrigado @ blah238!
Cotton.Rockwood
1

A saída que seu modelo descreve é ​​simplesmente um valor atualizado na tabela de atributos, não é? Você não pode simplesmente abrir o arquivo .dbf associado ao shapefile atualizado?

Caso contrário, a Seleção de Tabela (Ferramentas de Análise> Extrair) deve funcionar com uma consulta SQL.

veedub
fonte
Olá, obrigado pela sua resposta. Receio que não atualize o arquivo .dbf de cada shapefile. Adicionar 'Table Select' ao construtor de modelos também não funciona, pois não consigo conectar 'Minimum / Average / Maximum Distance' ou 'Output Values' como uma entrada para a ferramenta.
JPD 23/05