Vous exportez des données à partir de la sortie des valeurs de collecte dans ArcGIS ModelBuilder?

11

Je joue actuellement avec ModelBuilder. J'ai ajouté une photo du modèle que j'ai en ce moment.

Ce modèle itère actuellement 6 fichiers de formes, de sorte que chacune des «valeurs de sortie» contient 6 chiffres dans une liste. Je ne trouve pas de moyen d'extraire les valeurs de ces listes dans un fichier tableau / texte ou similaire.

Y a-t-il un moyen de faire cela?

modèle

Voici ce qui s'affiche lorsque j'ouvre les «valeurs de sortie» après avoir exécuté le modèle: entrez la description de l'image ici

Je veux juste saisir ces 6 chiffres en quelque sorte ...

JPD
la source
C'est essentiellement la même chose que vous demandez ici, n'est-ce pas? gis.stackexchange.com/questions/25922/… Collecter des valeurs fait exactement cela. Si vous lisez l'aide, il vous dira qu'il collecte des valeurs qui peuvent être passées dans un autre outil. Alors qu'essayez-vous de faire avec les valeurs? S'agit-il simplement de les enregistrer dans un fichier ou en avez-vous besoin pour un traitement ultérieur?
theJones
Je veux juste les enregistrer dans un fichier. Je ne trouve pas d'outil pour alimenter les valeurs de sortie dans le générateur de modèles afin de les extraire.
JPD

Réponses:

17

Vous pouvez le faire à l'aide de l' outil Calculer la valeur (gestion des données) et de la magie Python. Voir aussi cette question connexe: Ajouter du code arbitraire au générateur de modèles Arcgis?

Une variable à valeurs multiples est juste une chaîne de valeurs délimitée par des points-virgules, donc la multivaluesToCsvfonction ci-dessous divise les variables à valeurs multiples en listes et les transpose en lignes qui sont ensuite écrites dans un fichier texte CSV (valeur séparée par des virgules) .

Les itérateurs de modèle exécutent TOUS les processus du modèle une fois par itération - cela n'est pas souhaitable pour notre outil Calculer la valeur, que nous voulons exécuter une seule fois à la fin. Pour ce faire, vous pouvez créer un autre modèle externe pour envelopper le modèle interne d'origine. Ceci est abordé dans la rubrique d'aide Intégration d'un modèle dans un modèle .

Voici donc ce que vous devez faire pour que cela fonctionne:

Inner Model - Itère les classes d'entités, les traite, collecte les valeurs:

  1. Dans votre modèle d'origine, qui sera notre modèle "interne", ajoutez un autre outil Collecter les valeurs pour collecter les Namevaleurs de la variable afin que nous puissions mapper les valeurs des statistiques de distance à leurs noms de classe d'entités correspondants.
  2. Exposez les variables d'entrée et de sortie en tant que paramètres de modèle (cliquez avec le bouton droit sur un ovale et cochez Paramètres du modèle). Effectuez cette opération pour chacune des sorties des outils de collecte de valeur ainsi que pour les paramètres d'entrée dont vous avez besoin, tels que l'espace de travail d'entrée.
  3. Enregistrez et fermez le modèle interne.

Modèle externe - Exécute le modèle interne, exécute l'outil Calculer la valeur une seule fois lorsque le modèle interne se termine:

  1. Créez un nouveau modèle - ce sera notre modèle "extérieur".
  2. Ajoutez une variable de type Folderpour vous permettre de spécifier créer le fichier CSV de sortie.
  3. Ajoutez une variable de type Stringpour vous permettre de spécifier le nom du fichier CSV de sortie.
  4. Ajoutez le modèle interne au nouveau modèle (faites glisser et déposez depuis ArcToolbox ou cliquez avec le bouton droit et ajoutez des données ou un outil, accédez au modèle interne et cliquez sur Ajouter)
  5. Créez des variables pour tous les paramètres du modèle interne que vous souhaitez pouvoir définir à partir du modèle externe, tels que l'espace de travail en entrée (cliquez avec le bouton droit sur le modèle interne et choisissez Créer un paramètre à partir de la variable).
  6. Ajoutez l'outil Calculer la valeur au nouveau modèle
  7. Collez ce qui suit dans les cases appropriées de l'outil Calculer la valeur:

    Expression :

    multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
    • Cela utilise la substitution de variables en ligne pour passer les variables du modèle dans la fonction. Ajustez pour correspondre aux noms de variables de votre modèle.
    • L' ravant "%Output CSV File Location%"est significatif: cela indique qu'il s'agit d'une chaîne brute ; parce que les chemins d'accès au système de fichiers Windows contiennent généralement des barres obliques inverses (un caractère d'échappement en Python), nous devons l'utiliser pour empêcher Python d'interpréter de manière erronée les barres obliques inverses et les caractères suivants en tant que séquences de caractères spéciaux.
    • Assurez-vous de mettre des guillemets autour des variables en ligne car sans elles, Python pensera qu'elles sont des identifiants plutôt que des chaînes.

    Bloc de code:

    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. (Facultatif) Exposez les variables d'entrée et de sortie en tant que paramètres de modèle si vous souhaitez pouvoir les exécuter à partir de la boîte de dialogue d'outils du modèle ou les chaîner avec d'autres modèles / scripts. La seule sortie du modèle externe est le fichier CSV.

  9. (Facultatif) Connectez les variables d'entrée et les sorties du modèle interne à l'outil Calculer la valeur en tant que conditions préalables. Je ne pense pas que cela ait réellement un effet, cela rend simplement plus clair visuellement ce qui se passe.

J'ai testé cela avec ModelBuilder et l'ai fait fonctionner (voir les captures d'écran).

Modèle intérieur : Modèle intérieur

Modèle extérieur: Modèle extérieur

Le modèle interne exécute tous ses processus une fois par classe d'entités, puis l'outil Calculer la valeur s'exécute une fois à la fin pour sortir le fichier CSV une seule fois.

blah238
la source
Bonjour, merci d'avoir mis tant d'efforts dans votre réponse et excuses pour ma réponse tardive. J'essaie d'exécuter le modèle comme vous l'avez décrit, mais j'ai des problèmes avec le CSV. J'ai créé un fichier CSV vierge dans Excel et l'ai enregistré, puis chargé dans le modèle. ERREUR 000539: Erreur lors de l'exécution de l'expression: multivaluesToCsv (r "% CSV File%", "% FC Name Values%", "% Minimum Values%", "% Average Values%", "% Maximum Values%") <type 'exceptions .IOError '>: [Errno 13] Autorisation refusée: u'% CSV File% 'Échec d'exécution (Calculer la valeur). Je reçois toujours cette erreur. Mon CSV s'appelle CSVFile.csv.
JPD
1
Je viens de le réparer - c'est la solution parfaite. Merci beaucoup pour votre aide!
JPD
Le code Python créera le fichier CSV pour vous, pas besoin de le créer au préalable. Comme vous l'avez vu cependant, si vous ouvrez le fichier dans Excel, cela verrouille le fichier et il ne peut pas être écrit par Python jusqu'à ce que vous le fermiez.
blah238
2
Pour info, j'ai mis à jour les instructions et les captures d'écran pour utiliser des modèles imbriqués afin d'éviter de calculer plusieurs fois la valeur et de résoudre le problème où le fichier texte devait exister au préalable (vous spécifiez maintenant son emplacement de sortie et son nom de fichier comme deux paramètres distincts).
blah238
Excellente réponse! M'a aidé à résoudre un problème similaire de sortie des statistiques de validation croisée de la couche géostatistique dans un fichier csv. Merci @ blah238!
Cotton.Rockwood
1

La sortie décrite par votre modèle est simplement une valeur mise à jour dans la table attributaire, n'est-ce pas? Ne pouvez-vous pas simplement ouvrir le fichier .dbf associé au fichier de formes mis à jour?

A défaut, Table Select (Outils d'analyse> Extraire) devrait fonctionner avec une requête SQL.

veedub
la source
Bonjour, merci pour votre réponse. Je crains qu'il ne mette pas à jour le fichier .dbf de chaque fichier de formes. L'ajout de «Sélection de table» au générateur de modèle ne fonctionne pas non plus, car je ne peux pas connecter «Distance minimale / moyenne / maximale» ou «Valeurs de sortie» comme entrée pour l'outil.
JPD