Auflisten von Daten
Einer der grundlegenden Tasks in einem Skript für die Stapelverarbeitung besteht im Katalogisieren der verfügbaren Daten, sodass die Daten während der Verarbeitung durchlaufen werden können. ArcPy verfügt über eine Reihe von Funktionen, mit denen solche Listen erstellt werden können.
ListFields(dataset, wild_card, field_type) |
Gibt eine Liste von Feldern zurück, die im Eingabewert gefunden wurden. |
ListIndexes(dataset, wild_card) |
Gibt eine Liste von Attributindizes zurück, die im Eingabewert gefunden wurden. |
ListDatasets(wild_card, feature_type) |
Gibt die Datasets im aktuellen Workspace zurück. |
ListFeatureClasses(wild_card, feature_type) |
Gibt die Feature-Classes im aktuellen Workspace zurück. |
ListFiles(wild_card) |
Gibt die Dateien im aktuellen Workspace zurück. |
ListRasters(wild_card, raster_type) |
Gibt eine Liste von Rastern zurück, die im aktuellen Workspace gefunden wurden. |
ListTables(wild_card, table_type) |
Gibt eine Liste von Tabellen zurück, die im aktuellen Workspace gefunden wurden. |
ListWorkspaces(wild_card, workspace_type) |
Gibt eine Liste von Workspaces zurück, die im aktuellen Workspace gefunden wurden. |
ListVersions(sde_workspace) |
Gibt eine Liste von Versionen zurück, für die der verbundene Benutzer eine Verwendungsberechtigung hat. |
Das Ergebnis jeder dieser Funktionen ist eine Python-Liste, das heißt eine Liste mit Werten. Eine Liste in Skripten kann jeden Datentyp enthalten, wie etwa Zeichenfolgen. Dabei kann es sich beispielsweise um einen Pfad zu einem Dataset, um ein Feld oder um eine Zeile aus einer Tabelle handeln. Nachdem die Liste mit den gewünschten Werten erstellt wurde, können Sie diese im Skript in einer Schleife durchlaufen und mit den einzelnen Werten arbeiten.
Listenfunktionsparameter
Die Parameter dieser Funktionen sind ähnlich. Einige, z. B. ListFields, erfordern einen Wert für ein Eingabe-Dataset, da sich die von diesen Funktionen aufgelisteten Elemente in einem bestimmten Objekt bzw. Dataset befinden. Andere Funktionen erfordern kein Eingabe-Dataset, da sie Typen von Daten im aktuellen Workspace auflisten, die in den Umgebungseinstellungen definiert sind. Alle Funktionen verfügen über einen Platzhalter-Parameter, mit dem die aufgelisteten Objekte bzw. Datasets nach Namen eingeschränkt werden können. Ein Platzhalter definiert einen Namensfilter, und der gesamte Inhalt in der neu erstellten Liste muss diesem Filter entsprechen. Sie können beispielsweise alle Feature-Classes in einem Workspace auflisten, die mit dem Buchstaben G beginnen. Dies wird im folgenden Beispiel veranschaulicht:
import arcpy from arcpy import env # Set the workspace. List all of the feature classes that start with 'G' # env.workspace = "D:/St_Johns/data.gdb" fcs = arcpy.ListFeatureClasses("G*")
Die Liste kann auch so eingeschränkt werden, dass nach bestimmten Dateneigenschaften gesucht wird, beispielsweise nur nach Polygon-Feature-Classes, Integer-Feldern oder Coverage-Datasets. Hierfür wird in allen Funktionen der Typparameter verwendet. Im nächsten Beispiel werden die Feature-Classes in einem Workspace mit einem Platzhalter und einem Datentyp gefiltert, sodass sich in der zurückgegebenen Liste nur Polygon-Feature-Classes befinden, die mit dem Buchstaben G beginnen:
# Set the workspace. List all of the polygon feature classes that # start with 'G' # env.workspace = "D:/St_Johns/data.gdb" fcs = arcpy.ListFeatureClasses("G*", "polygon")
Verwenden von Listen
ArcPy verwendet einen Python-Listentyp für die Ergebnisse aller seiner Auflistungsfunktionen, da Listen die nötige Flexibilität für den einfachen Zugriff auf Daten und mehrere Datentypen bieten. FOR-Schleifen eignen sich optimal für die Arbeit mit Python-Listen, da mit dieser Schleife Listen schrittweise durchlaufen werden können. Die FOR-Schleife durchläuft wiederholt jedes Element in der Liste. Das folgende Beispiel zeigt eine FOR-Schleife, mit der die im vorherigen Beispiel erzeugte Liste wiederholt durchlaufen wird:
# For each feature class in the list of feature classes # for fc in fcs: # Copy the features from the workspace to a folder # arcpy.CopyFeatures_management(fc, "D:/St_Johns/Shapefiles/” + fc)
Im Folgenden finden Sie ein weiteres Beispiel für die Verwendung einer Auflistungsfunktion. Mit dem Skript werden Raster-Pyramiden für alle Raster erstellt, bei denen es sich um TIFF-Bilder (Tagged Image File Format) in einem Ordner handelt.
# Set the workspace. List all of the TIFF files # env.workspace= "D:/St_Johns/images" # For each raster in the list of rasters # for tiff in arcpy.ListRasters("*", "TIF"): # Create pyramids # arcpy.BuildPyramids_management(tiff)
Python-Listen geben Ihnen die Möglichkeit, die Ergebnisse einer Auflistungsfunktion auf verschiedene Weise zu verwenden und zu verwalten. Listen sind ein vielseitiger Python-Typ. Sie stellen eine Reihe von Methoden (append, count, extend, index, insert, pop, remove, reverse und sort) bereit, mit denen Daten bearbeitet und extrahiert werden können.
Wenn Sie etwa wissen möchten, wie viele Feature-Classes in einem Workspace enthalten sind, können Sie diese Zahl mit der integrierten Python-Funktion "len" abrufen.
import arcpy from arcpy import env env.workspace = "c:/St_Johns/Shapefiles" fcs = arcpy.ListFeatureClasses() # Use Python's built-in function len to reveal the number of feature classes # in the workspace # fcCount = len(fcs) print fcCount
Eine Python-Liste kann den Inhalt leicht anzeigen. Python-Listen können mit einer Reihe von Methoden bearbeitet werden (einschließlich sort, append, reverse).
>>> import arcpy >>> from arcpy import env >>> env.workspace = "c:/data/water.gdb" >>> fcs = arcpy.ListFeatureClasses() >>> print fcs [u'water_pipes', u'water_services', u'water_stations'] >>> fcs.sort(reverse=True) >>> print fcs [u'water_stations', u'water_services', u'water_pipes']
Da Listen eine geordnete Sammlung sind, erlauben sie auch Indizierung und Aufteilung.
>>> print fcs[0] water_stations >>> print fcs[1:] [u'water_services', u'water_pipes']
Listenfunktions-Typschlüsselwörter
Das Standardverhalten für alle Auflistungsfunktionen besteht darin, dass alle unterstützten Typen aufgelistet werden. Mit einem Schlüsselwort wird die zurückgegebene Liste auf einen bestimmten Typ beschränkt. Die Typschlüsselwörter für die einzelnen Funktionen sind in der folgenden Tabelle aufgeführt.
Funktion |
Schlüsselwörter für Datentypen |
---|---|
ListDatasets |
All, Feature, Coverage, RasterCatalog, CAD, VPF, TIN, Topology |
ListFeatureClasses |
All, Point, Label, Node, Line, Arc, Route, Polygon, Region |
ListFields |
All, SmallInteger, Integer, Single, Double, String, Date, OID, Geometry, BLOB |
ListTables |
All, dBASE, INFO |
ListRasters |
All, ADRG, BIL, BIP, BSQ, BMP, CADRG, CIB, ERS, GIF, GIS, GRID, STACK, IMG, JPEG, LAN, SID, SDE, TIFF, RAW, PNG, NITF |
ListWorkspaces |
All, Coverage, Access, SDE, Folder |
Beispiel: Migration von Personal- zu File-Geodatabases mit Auflistungsfunktionen
Ein gängiger Konvertierungs-Task besteht im Übertragen von großen Datenmengen aus einem Format in ein anderes Format. Im folgenden Skript werden mit ListWorkspaces, ListFeatureClasses, ListTables und ListDatasets alle Personal-Geodatabases in einem Ordner bestimmt, und die darin enthaltenen Feature-Datasets, Feature-Classes und Tabellen werden in File-Geodatabases konvertiert.
import arcpy from arcpy import env import os # Allow for the overwriting of file geodatabases, if they already exist # env.overwriteOutput = True # Set workspace to folder containing personal geodatabases # env.workspace = arcpy.GetParameterAsText(0) # Identify personal geodatabases # for pgdb in arcpy.ListWorkspaces("", "Access"): # Set workspace to current personal geodatabase # env.workspace = pgdb # Create file geodatabase based on personal geodatabase # fgdb = pgdb[:-4] + ".gdb" arcpy.CreateFileGDB_management(os.path.dirname(fgdb), os.path.basename(fgdb)) # Identify feature classes and copy to file gdb # for fc in arcpy.ListFeatureClasses(): print "Copying feature class " + fc + " to " + fgdb arcpy.Copy_management(fc, fgdb + os.sep + fc) # Identify tables and copy to file gdb # for table in arcpy.ListTables(): print "Copying table " + table + " to " + fgdb arcpy.Copy_management(table, fgdb + os.sep + table) # Identify datasets and copy to file gdb # Copy will include contents of datasets # for dataset in arcpy.ListDatasets(): print "Copying dataset " + dataset + " to " + fgdb arcpy.Copy_management(dataset, fgdb + os.sep + dataset)