Ajout de code arbitraire à ArcGIS ModelBuilder?

11

Existe-t-il un moyen d'ajouter des extraits de code arbitraires à un modèle ArcGIS?

J'imagine quelque chose de similaire au "show code block" le générateur d'expression dans l'étiquetage avancé ou la calculatrice de champ .

Par exemple, mon projet du moment pourrait grandement bénéficier de la récupération du nom d'utilisateur de la personne exécutant l'outil. Je sais qu'en python, c'est simple import os; os.environ.get('USERNAME'). Je pense que je pourrais écrire cet extrait dans get_username.py, l'ajouter à une boîte à outils dans Arccatalog, puis ajouter cet outil au modèle et l'utiliser comme paramètre de modèle requis pour mon outil actuel. C'est beaucoup de travail pour une si petite chose, et la prochaine fois, je voudrai peut-être autre chose, comme la substitution de variable en ligne ou une variable composée .

Je pense qu'un outil d'extrait de code ou similaire pourrait répondre à tous ces besoins d'une manière générique et largement utile.

Matt Wilkie
la source
pensée folle: au lieu du générateur d'expressions, qu'en est-il d'une fenêtre de ligne de commande python qui enregistre son historique pour que le modèle soit réutilisé?
matt wilkie
2
en fait, ce que je recherche vraiment, c'est la bibliothèque Python entière à exposer au générateur de modèles de la même manière que les outils arcgis. mais c'est juste un discours fou (non?)
matt wilkie
Bonne idée! Vous voulez écrire des extraits de code à la volée dans un "outil" qui traitera l'extrait et renverra les résultats, non? Ainsi, dans votre exemple, "l'outil" retournerait <nom d'utilisateur actuel> qui pourrait ensuite être appliqué à d'autres outils en aval.
RyanKDalton
@RyanDalton, oui c'est exactement ça.
matt wilkie

Réponses:

3

Nouvelle réponse à un ancien post, juste pour clarifier comment créer un modèle réutilisable pour ce faire.

Ouvrez le modèle, Insérer-> Outils de modèle uniquement-> Calculer la valeur.

Dans l'expression, tapez: getuser()

Dans le bloc de code, tapez:

def getuser():
    import getpass
    return getpass.getuser()

(Voir « Obtention du nom d'utilisateur dans un format spécifique » pour la source de l'extrait de code de nom d'utilisateur de @ChadCooper)

Pour Type de données, choisissez String.

entrez la description de l'image ici

Renommez le cercle de sortie en username. Le modèle de résultat final ressemblera à: Utilisation de l'outil Calculer la valeur

Et vous pouvez ensuite simplement faire glisser ce modèle dans tous les futurs modèles et référencer la variable appelée% username% dans tous les futurs modèles ou scripts. Assurez-vous simplement que ce modèle fonctionne avant d'essayer d'accéder à la variable% username%. Vous pouvez le faire en utilisant une condition préalable .

RyanKDalton
la source
Ryan peut-être pourriez-vous expliquer pourquoi la sortie est un aramètre [P] et montrer un exemple du module inclus dans un autre module. J'ai d'abord été très confus pourquoi P pour une sortie, car les paramètres concernent généralement les entrées.
matt wilkie
@mattwilkie, vous n'avez pas besoin de paramètres d'entrée car le script python "lira" les entrées de votre système. Cependant, vous devez faire de la sortie (le nom d'utilisateur) un paramètre afin de pouvoir utiliser les résultats dans un autre modèle ou script python. L'étape suivante serait de passer le paramètre de nom d'utilisateur à quelque chose comme un "script de messagerie" qui utiliserait automatiquement le paramètre de sortie uesrname comme entrée de l'adresse e-mail "À".
RyanKDalton
10

En fait, vous pouvez le faire avec l' outil Calculer la valeur (gestion des données) .

Ce n'est pas particulièrement élégant (le code source complet de l'outil est imprimé dans le journal à chaque exécution), et l'éditeur (vraiment juste une zone de texte) est épouvantable.

Je suggérerais d'écrire des modules à partir desquels vous pouvez ensuite importer et appeler des fonctions, puis il vous suffirait d'écrire des extraits très courts dans la boîte de dialogue. Sinon, ce n'est tout simplement pas très propre.

Calculer la valeur est disponible à tous les niveaux de licence pour Arcgis v10. Avec v9.x, il n'est disponible pour Arcview que si les extensions Spatial ou 3D Analyst sont installées ( réf ).

blah238
la source
Merci! Cela a très bien fonctionné pour ce dont j'avais besoin aujourd'hui (insérer %USERNAME%dans une connexion à une base de données .sde). D'accord, l'éditeur n'est pas digne de ce nom, fonctionne très bien comme destination de collage.
matt wilkie
1
re: 9.x, le libellé de la page d'aide du CV indique que l'outil peut être disponible si les extensions SA / 3D sont simplement installées . Il peut être possible de l'utiliser sans que l'extension soit sous licence ou activée.
matt wilkie
"Je suggérerais d'écrire des modules que vous pourrez ensuite importer" - c'est une très bonne idée!
Curtis Price
2

Peut-être que je comprends mal la question, mais il semble que la fonctionnalité de l'outil de script python, dans ArcToolBox, soit ce que vous recherchez:

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Integrating_scripts_within_a_model/002w0000006n000000/

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//001500000006000000.htm

En fait, vous pouvez également utiliser / combiner plusieurs autres langages de script (R dans cet exemple):

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//002w0000007w000000

Brent Edwards
la source
3
Cela fonctionne (et c'est comme ça que je le ferais), mais Matt a spécifiquement appelé cette méthode "beaucoup de travail pour une si petite chose" dans sa question :)
nmpeterson