Itération des noms de fichiers de sortie de classe d'entités à l'aide de ModelBuilder?

11

J'essaie d'itérer une série de classes d'entités (polygones) dans le générateur de modèles pour convertir une série de polygones en rasters, mais j'ai un problème avec les noms des fichiers de sortie.

Après avoir inséré l'outil "itérer la classe d'entités" dans la fenêtre du générateur de modèles et lié mon gdb stockant tous les polygones en entrée, l'entité en sortie (bulle verte) devient automatiquement le nom de mon premier polygone. Par conséquent, le modèle que j'essaie d'exécuter semble revenir à ce polygone nommé plutôt que d'aller au polygone suivant de la liste. Les rasters en sortie sont créés, mais écrasez ce nom de fichier plutôt que de générer un nouveau raster avec un nouveau nom qui correspond aux polygones suivants.

Qu'est-ce que je fais mal?

macdonaw
la source

Réponses:

10

Voici le modèle, il utilise la substitution en ligne comme décrit par Aaron. Notez que la sortie de l'outil Polygone vers raster est .. \ fGBD_Scratch.gdb \ ras_ % Value% . La valeur provient de l'itérateur qui dans ce cas a été défini sur FID pour distribuer des lignes uniques. Le premier jeu de données raster serait donc ras_1, puis ras_2, etc.

Modèle

Hornbydd
la source
Ajoutez-vous simplement le "%" de chaque côté du nom inséré dans la sortie? par exemple% name% _clip?
macdonaw
Oui, donc dans votre exemple, «nom» est une variable dans votre modèle, généralement quelque chose provenant d'un itérateur.
Hornbydd
1
Oui, mais votre nom ne doit pas commencer par le signe% ... utilisez-le dans l'ordre inverse, c'est-à-dire clip_% Name%
maycca
10

Il existe plusieurs façons de gérer la dénomination dans le générateur de modèles. ArcGIS contient une section d'aide à ce sujet: Présentation rapide de l'utilisation de la substitution de variables en ligne .

Une façon simple de créer rapidement des noms uniques à partir d'un itérateur consiste à appeler les variables système %i%ou %n%, qui produisent des fichiers sous la forme suivante: fichier1, fichier2, fichier3, fichier4 ... La %i%variable système fait référence à la position actuelle de la liste, tandis que la %n%variable système référence l'itération actuelle du modèle. Vous mettriez cela en pratique dans le paramètre de sortie d'un outil que vous utilisez. Par exemple:

Classe d'entités en sortie

C:\temp\out%i%.shp
Aaron
la source
1

Il semble que vous souhaitiez effectuer deux boucles imbriquées, une pour les classes d'entités dans un espace de travail et une pour les entités de chaque classe d'entités. C'est douloureux (mais possible ) à faire avec ModelBuilder.

Si vous voulez vous salir les mains avec Python (que je recommande vraiment pour des trucs comme ça), voici un exemple pour vous aider à démarrer:

import arcpy, os

# Your source file geodatabase
input_workspace = r"c:\GISData\input.gdb"

# Your output raster folder
output_workspace = r"c:\GISData\rasters"

# The file extension for the output rasters -- when not saving to a geodatabase, specify .tif for a TIFF file format, .img for an ERDAS IMAGINE file format, or no extension for a GRID raster format.
output_ext = ".img"

# The field used to assign values to the output raster -- hopefully this is the same for all of your feature classes
value_field = "VALUE"

# Note: Instead of hardcoding the above values, you could also use arcpy.GetParameterAsText to allow the user to specify them via script tool parameters

# Set current workspace to the source file geodatabase
arcpy.env.workspace = input_workspace

# Loop over the feature classes
for fc in arcpy.ListFeatureClasses():

  # Get the name of the ObjectID field so we can use it to name the output rasters
  oid_field = arcpy.Describe(fc).OIDFieldName

  # Loop over the features in the current feature class
  for row in arcpy.SearchCursor(fc):

    # Figure out what to name the output raster. In this case we should get something like "c:\GISData\rasters\myFeatureClass_1.img"
    out_raster = os.path.join(output_workspace, "{0}_{1}{2}".format(os.path.basename(fc), row.getValue(oid_field), output_ext))

    # Convert to raster
    arcpy.PolygonToRaster_conversion(row, value_field, out_raster)

Non testé, mais j'espère que vous avez l'idée. IMO, les scripts Python sont beaucoup plus faciles à utiliser que les modèles ModelBuilder pour toutes les tâches sauf les plus triviales.

Pour les ressources d'apprentissage Python / ArcPy, ne cherchez pas plus loin que cette question: Quelles sont certaines ressources pour apprendre ArcPy?

blah238
la source
Les boucles imbriquées dans le générateur de modèles sont une misère. A éviter si possible.
Mox