Iterieren von Namen von Feature-Class-Ausgabedateien mit ModelBuilder?

11

Ich versuche, eine Reihe von Feature-Classes (Polygonen) im Model Builder zu iterieren, um eine Reihe von Polygonen in Raster zu konvertieren. Ich habe jedoch ein Problem mit den Namen der Ausgabedateien.

Nach dem Einfügen des Werkzeugs "Feature-Klasse iterieren" in das Modell-Builder-Fenster und dem Verknüpfen meiner GDB, in der alle Polygone als Eingabe gespeichert sind, wird das Ausgabe-Feature (grüne Blase) automatisch zum Namen meines ersten Polygons. Infolgedessen scheint das Modell, das ich ausführen möchte, zu diesem benannten Polygon zurückzukehren, anstatt zum nächsten Polygon in der Liste zu wechseln. Ausgabe-Raster werden erstellt, überschreiben jedoch diesen Dateinamen, anstatt ein neues Raster mit einem neuen Namen zu generieren, der den nachfolgenden Polygonen entspricht.

Was mache ich falsch?

Macdonaw
quelle

Antworten:

10

Hier ist das Modell, es verwendet Inline-Substitution, wie von Aaron beschrieben. Beachten Sie, dass die Ausgabe des Polygon-Raster-Werkzeugs .. \ fGBD_Scratch.gdb \ ras_ % Value% lautet . Der Wert kommt vom Iterator, der in diesem Fall auf FID gesetzt wurde, um eindeutige Zeilen auszugeben. Der erste Raster-Datensatz wäre also ras_1, dann ras_2 usw.

Modell

Hornbydd
quelle
Fügen Sie einfach das "%" auf beiden Seiten des in die Ausgabe eingefügten Namens hinzu? Zum Beispiel% name% _clip?
Macdonaw
Ja, in Ihrem Beispiel ist 'Name' eine Variable in Ihrem Modell, normalerweise etwas von einem Iterator.
Hornbydd
1
Ja, aber Ihr Name sollte nicht mit% sign beginnen ... verwenden Sie ihn in umgekehrter Reihenfolge, dh clip_% Name%
maycca
10

Es gibt verschiedene Möglichkeiten, mit der Benennung im Model Builder umzugehen. ArcGIS bietet dazu einen Hilfeabschnitt: Eine kurze Einführung in die Verwendung der Inline-Variablensubstitution .

Eine einfache Möglichkeit, aus einem Iterator schnell eindeutige Namen zu erstellen, besteht darin, die Systemvariablen %i%oder aufzurufen %n%, die Dateien in der folgenden Form ausgeben: Datei1, Datei2, Datei3, Datei4 ... Die %i%Systemvariable verweist auf die aktuelle Listenposition , während die %n%Systemvariable verweist auf die aktuelle Modelliteration. Sie würden dies im Ausgabeparameter eines von Ihnen verwendeten Werkzeugs in die Praxis umsetzen. Beispielsweise:

Ausgabe-Feature-Class

C:\temp\out%i%.shp
Aaron
quelle
1

Es hört sich so an, als ob Sie ein paar verschachtelte Schleifen ausführen möchten, eine für die Feature-Classes in einem Arbeitsbereich und eine für die Features in jeder Feature-Class. Dies ist mit ModelBuilder schmerzhaft (aber möglich ).

Wenn Sie sich mit Python die Hände schmutzig machen möchten (was ich auf jeden Fall für solche Dinge empfehle), finden Sie hier ein Beispiel, um Ihnen den Einstieg zu erleichtern:

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)

Ungetestet, aber hoffentlich kommen Sie auf die Idee. IMO, Python-Skripte sind für alle außer den trivialsten Aufgaben viel einfacher zu bearbeiten als ModelBuilder-Modelle.

Informationen zu Python / ArcPy-Lernressourcen finden Sie in der folgenden Frage: Welche Ressourcen gibt es zum Erlernen von ArcPy?

blah238
quelle
Verschachtelte Schleifen im Modellbauer sind ein Elend. Vermeiden Sie wenn möglich.
Mox