Datasets mit Python auflisten und beschreiben

Ein Projekt öffnen und Datasets überprüfen

Bevor Sie beginnen, mit Python Datasets aufzulisten und zu beschreiben, laden Sie die .zip-Datei der Projektdaten herunter, extrahieren sie in ArcGIS Pro und verschaffen sich einen Überblick über die Daten.

  1. Laden Sie die Daten für dieses Lernprogramm herunter, und extrahieren Sie den Inhalt in einem Verzeichnis auf Ihrem Computer.

    Die .zip-Datei enthält einen Ordner namens PythonDesc.

    In diesem Lernprogramm werden die Daten in C:\Lessons\PythonDesc\ angezeigt. Sie können einen anderen Ordner verwenden. Achten Sie dann jedoch darauf, die Pfade in den folgenden Anweisungen und im Code anzupassen.

  2. Starten Sie ArcGIS Pro.
  3. Klicken Sie in ArcGIS Pro unter Neues Projekt auf Ohne Vorlage beginnen.

    Ohne Vorlage beginnen

    Daraufhin wird ein neues Projekt mit dem Namen "Unbenannt" geöffnet. Da Sie nur ArcGIS Pro verwenden, um sich einen Überblick über die Daten zu verschaffen, müssen Sie das Projekt nicht umbenennen und Ihre Arbeit nicht speichern.

  4. Wenn der Bereich Katalog nicht bereits sichtbar ist, klicken Sie auf der Registerkarte Ansicht auf den Bereich Katalog.
  5. Klicken Sie hierzu im Bereich Katalog mit der rechten Maustaste auf Ordner, und klicken Sie dann auf Ordnerverbindung hinzufügen.

    Ordnerverbindung hinzufügen

  6. Navigieren Sie im Fenster Ordnerverbindung hinzufügen zu dem Speicherort, an dem Sie die Datei "PythonDesc.zip" (C:\Lessons) extrahiert haben, klicken Sie auf den Ordner PythonDesc und dann auf OK.
  7. Blenden Sie im Bereich Katalog den Bereich Ordner und dann PythonDesc ein.

    Inhalt des Ordners "PythonDesc"

    Der Ordner enthält zwei Shapefiles (bike_routes.shp und watersheds.shp), eine Textdatei (bike_racks.csv) und eine Datenbanktabelle (gardens.dbf). Zudem enthält er eine Geodatabase mit dem Namen DC.gdb.

  8. Blenden Sie Dc.gdb ein.

    eingeblendet.

    Die Geodatabase enthält drei Feature-Classes (boundary, neighborhoods und public_schools), eine Tabelle (car_share_locations) und ein Feature-Dataset (Transportation).

  9. Blenden Sie Transportation ein.

    Dataset "Transportation" eingeblendet.

    Das Feature-Dataset enthält vier Feature-Classes (roads, street_lights, traffic_analysis_zones und traffic_junctions) und ein Netzwerk-Dataset (traffic).

    Die Datasets sind typisch für GIS-Projekte: Feature-Classes und Tabellendaten in unterschiedlichen Formaten sowie andere Elementen zum Strukturieren dieser Daten. Verwenden Sie Python-Code, um diese Datasets anhand des Typs und anderer Eigenschaften zu erkennen. Beachten Sie, dass diese Gruppierungen bedeuten, dass die Projektdaten eine geschachtelte Struktur mit mehreren Ebenen aufweisen.

    Bevor Sie Python-Code verwenden, erkunden Sie zudem diese Datasets, indem Sie sich die eigentlichen Dateien auf Ihrem Computer ansehen.

  10. Öffnen Sie Microsoft File Explorer, und navigieren Sie zum Ordner C:\Lessons\PythonDesc\ oder zu dem Verzeichnis, in dem Sie den Ordner PythonDesc gespeichert haben.

    Ordnerinhalt in Windows Explorer

    Die Dateien werden in File Explorer angezeigt. Bei den beiden Standalone-Tabellen bike_racks.csv und gardens.dbf handelt es sich um einzelne Dateien. Die Shapefiles bike_routes und watersheds bestehen jeweils aus mehreren Dateien mit demselben Namen und unterschiedlichen Dateierweiterungen. Bei der Geodatabase DC handelt es sich um einen Ordner mit der Dateierweiterung .gdb.

  11. Blenden Sie in File Explorer den Ordner DC.gdb ein.

    Inhalt der Geodatabase

    Dieser Ordner enthält Dutzende Dateien. Es gibt keine klar erkennbare Verbindung zwischen diesen Dateien und den Datenelementen, die beim Anzeigen der Geodatabase im Bereich Katalog in ArcGIS Pro angezeigt werden. Es lassen sich beispielsweise keine Dateien erkennen, die eine bestimmte Feature-Class bilden. Das ist wichtig zu wissen, wenn GIS-Datasets in Python-Code verwendet werden, da dies Auswirkungen darauf hat, wie auf Datasets in verschiedenen Formaten zugegriffen wird und wie diese Datasets verwendet werden.

  12. Sie haben sich einen Überblick über die Gliederung der Daten in ArcGIS Pro und in Windows Explorer verschafft. Als Nächstes öffnen Sie eine Python-Datei und verwenden Python, um diese Daten aufzulisten und zu beschreiben.

Eine Python-Skriptdatei öffnen

In diesem Lernprogramm schreiben Sie Python-Code mithilfe von IDLE. IDLE ist ein einfacher Python-Editor, der in ArcGIS Pro enthalten ist.

Um sicherzustellen, dass mit Python die richtige Version von ArcGIS Pro installiert wurde und zum Ausführen von Code verwendet wird, starten Sie IDLE mit einer Verknüpfung.

Wenn Sie auch ArcGIS Desktop (ArcMap) installiert haben, enthält das Kontextmenü zudem die Verknüpfung Edit with IDLE. Verwenden Sie diese Verknüpfung nicht. Damit wir eine ältere Version von Python geöffnet.

  1. Navigieren Sie in File Explorer eine Ebene nach oben zum Ordner C:\Lessons\PythonDesc\.
  2. Klicken Sie mit der rechten Maustaste auf describe_data.py, und klicken Sie auf Edit with IDLE (ArcGIS Pro).

    Edit with IDLE (ArcGIS Pro)

    Wenn Sie IDLE auf diese Weise öffnen, wird das Skript mithilfe der aktiven Python-Umgebung von ArcGIS Pro geöffnet. Dadurch wird sichergestellt, dass die richtige Version von Python verwendet wird. In diesem Lernprogramm wird IDLE als Code-Editor verwendet, aber der Code funktioniert auch in anderenPython-Editoren wie PyCharm oder Spyder sowie im Python-Fenster oder in Notebooks in ArcGIS Pro.

    Hinweis:
    Wenn Edit with IDLE (ArcGIS Pro) im Kontextmenü nicht angezeigt wird, klicken Sie auf Start, blenden Sie ArcGIS ein, und klicken Sie auf die Python-Eingabeaufforderung. Geben Sie im Fenster Python-Eingabeaufforderung idle ein, und drücken Sie die Eingabetaste. Daraufhin wird IDLE (Python 3.7-Shell) angezeigt. Klicken Sie auf Datei und dann auf Öffnen. Navigieren Sie zur Datei describe_data.py, und öffnen Sie sie.

    Das Skript wird geöffnet.

    In IDLE geöffnetes Skript.

    Das Skript enthält für den Anfang drei Codezeilen. Die erste Zeile lautet import arcpy. Damit wird das ArcPy-Paket importiert. Dadurch ist die Funktionalität von ArcPy und somit auch die Funktionen zum Auflisten und Beschreiben von GIS-Datasets im Skript verfügbar.

    In der zweiten Zeile ist der Pfad angegeben, an dem sich die Daten befinden. Dieser Wert ist einer Variablen mit dem Namen mypath zugewiesen.

    Im Pfad wird anstelle eines umgekehrten Schrägstrichs (/) ein regulärer Schrägstrich (\) verwendet. Ein einzelner umgekehrter Schrägstrich dient in Python als Escape-Zeichen und kann bei Verwendung in Pfaden unerwünschte Folgen haben. Wenn danach bestimmte andere Zeichen folgen, wird damit ein bestimmtes Verhalten codiert. \t steht beispielsweise für einen Tabulator und würde bei einem Pfad wie C:\Lessons\toronto.gdb bedeuten, dass im Pfad ein Tabulatorzeichen hinzugefügt und somit ein Fehler auftreten würde.

    Anstelle eines regulären Schrägstrichs können Sie auch den Buchstaben r (für RAW) vor der Zeichenfolge (r"C:\Lessons\PythonDesc") hinzufügen oder zwei umgekehrte Schrägstriche ("C:\\Lessons\\PythonDesc") verwenden. Alle drei Schreibweisen funktionieren.

    Mit der dritten Zeile wird der Workspace festgelegt. Ein Workspace ist das Standardverzeichnis für die Dateien, die Sie verwenden, z. B. Eingabe- und Ausgabe-Datasets. Der Workspace wird auf die Variable mypath festgelegt. Es ist zwar möglich, den Workspace ohne die Variable mypath direkt festzulegen, Es hat jedoch Vorteile, eine separate Variable für den Pfad zu verwenden, in dem sich die Daten befinden.

  3. Wenn Sie den Ordner PythonDesc nicht im Verzeichnis C:\Lessons\PythonDesc\ gespeichert haben, bearbeiten Sie den Pfad im Skript so, dass es auf das Verzeichnis zeigt, in dem Sie den Ordner gespeichert haben.

    Wenn Sie die Daten für dieses Lernprogramm beispielsweise im Ordner C:\EsriLessons extrahiert haben, ändern Sie die zweite Zeile wie folgt:

    mypath = "C:/EsriLessons/PythonDesc"

    Wenn der Pfad recht lang ist, können Sie ihn in Explorer kopieren und im Skript einfügen. Klicken Sie hierzu mit der rechten Maustaste auf den Ordner (Windows 11), oder halten Sie die Umschalttaste gedrückt, und klicken Sie mit der rechten Maustaste auf den Ordner (Windows 10), und klicken Sie dann auf Als Pfad kopieren. Sie können den alten Pfad im Skript auswählen und löschen und Strg+V drücken, um den neuen Pfad einzufügen.

    Damit ein Pfad als gültiger Workspace verwendet werden kann, muss es sich dabei um eine Python-Zeichenfolge handeln, d. h., der Pfad muss in Anführungszeichen stehen. Zudem müssen Sie einen der drei weiter oben erwähnten für Pfade geeigneten Styles verwenden. Wenn Sie einen Windows-Pfad kopieren, enthält dieser umgekehrte Schrägstriche. Sie können je einen umgekehrten Schrägstrich durch je zwei umgekehrte Schrägstriche oder einen regulären Schrägstrich ersetzen. Bei langen Pfaden stellen Sie am einfachsten der Zeichenfolge ein "r" voran, sodass aus der Zeichenfolge eine RAW-Zeichenfolge wird. Damit wird sichergestellt, dass die umgekehrten Schrägstriche nicht als Escape-Zeichen interpretiert werden.

    Als Nächstes testen Sie Ihren Code.

  4. Klicken Sie auf File und dann auf Save.
  5. Klicken Sie auf Run und dann auf Run Module.

    Daraufhin wird das Fenster der IDLE-Shell mit der Meldung angezeigt, dass die Shell für Ihr Skript neu gestartet wurde. Der Pfad und der Dateiname des Skripts werden angezeigt. Nach einer Pause von mehreren Sekunden wird die Eingabeaufforderung >>> der IDLE-Shell zurückgegeben.

    Die

    Es mag so aussehen, als hätte sich nichts getan, weil das Skript keine Anweisungen für die Ausgabe von Daten an die Shell enthält. Später fügen Sie Ihrem Code print-Anweisungen hinzu, sodass Informationen an die Shell zurückgegeben werden.

    Die IDLE-Shell ist außerdem ein Ort, an dem Sie Codezeilen eingeben und sofort ausführen lassen können.

  6. Geben Sie in der IDLE-Shell nach der Eingabeaufforderung >>> den Befehl print(arcpy.env.workspace) ein, und drücken Sie die Eingabetaste.

    Ausgabe des Workspace.

    Der Pfad zum Workspace, den Sie im Skript festlegen, wird an die IDLE-Shell ausgegeben. Mit dem Skript wurde das arcpy-Modul importiert, die Variable mypath auf eine Zeichenfolge festgelegt, die den Pfad zu den Daten des Lernprogramms enthält, sowie der Workspace für arcpy auf diesen Pfad festgelegt. Durch die Ausgabe des Wertes arcpy.env.workspace in der Shell haben Sie gezeigt, dass das Skript funktioniert.

  7. Schließen Sie das Fenster der IDLE-Shell.

Wenn der Workspace festgelegt ist, kann ein Dataset mithilfe des Dateinamens ohne den vollständigen Pfad referenziert werden.

Ein Dataset mit Python beschreiben

Da mit dem Skript nun der Workspace festgelegt wird, können Sie Python verwenden, um die Eigenschaften eines Datasets in diesem Workspace zu beschreiben.

Hierzu verwenden Sie die Funktion da.Describe().

  1. Klicken Sie im Fenster des IDLE-Editors auf eine Stelle hinter der Zeile arcpy.env.workspace = mypath, und drücken Sie die Eingabetaste, um eine neue Zeile hinzuzufügen.
  2. Geben Sie den folgenden Code ein, und drücken Sie die Eingabetaste:

    desc = arcpy.da.Describe("bike_routes.shp")

    Beschreiben Sie Radwege.

    Bei der Funktion da.Describe() handelt es sich um eine Funktion des Moduls arcpy.da, das für Datenzugriffs-Workflows verwendet wird. Von der Funktion wird ein Python-Wörterbuch zurückgegeben. Ein Python-Wörterbuch besteht aus Schlüsselpaaren und den entsprechenden Werten. Bei den in einem Wörterbuch von da.Describe() zurückgegebenen Schlüsseln handelt es sich um die Eigenschaften des Datasets.

  3. Fügen Sie nach der Zeile desc = arcpy.da eine neue Zeile und den folgenden Code hinzu, und drücken Sie dann die Eingabetaste:

    print(f'baseName: {desc["baseName"]}')

    Beim Ausführen des Skripts wird der Wert der Eigenschaft baseName ausgegeben. In der obigen Codezeile ist desc das Wörterbuch der Eigenschaften und baseName der Schlüssel in Form einer Zeichenfolge. Mit dem Ausdruck desc["baseName"] wird der Wert zurückgegeben, der im Wörterbuch mit diesem Schlüssel verknüpft ist.

    Der Style, der hier für die Ausgabeformatierung verwendet wird, wird als "f-string" bezeichnet. "F-strings" werden auch als formatierte Zeichenfolgenliterale bezeichnet. Hierbei handelt es sich um Zeichenfolgen, denen der Buchstabe f vorangestellt ist, und die Variablen in Klammern enthalten. Diese Variablen werden zur Laufzeit durch die entsprechenden Werte ersetzt. Im obigen Codebeispiel ist der Wert baseName in doppelte Anführungszeichen, wodurch daraus eine Zeichenfolge wird. Da Anführungszeichen auch für "f-strings" verwendet werden, müssen einfache Anführungszeichen verwendet werden, um sie von den doppelten Anführungszeichen zu unterscheiden. Diese verschiedenen Arten von Anführungszeichen sind in Python austauschbar, müssen jedoch einheitlich verwendet werden.

    Der folgende Code ist ebenfalls richtig:

    print(f"baseName: {desc['baseName']}")

    Der vollständige Code sieht bisher wie folgt aus:

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    desc = arcpy.da.Describe("bike_routes.shp")
    print(f'baseName: {desc["baseName"]}')

    Wenn Sie die Daten in einem anderen Verzeichnis gespeichert haben, sieht die Zeile mypath bei Ihnen anders aus.

  4. Klicken Sie auf File und auf Save, um das Skript zu speichern.

    Hierfür können Sie auch die Tastenkombination Strg+S verwenden.

  5. Klicken Sie auf Run und dann auf Run Module.

    BaseName "bike_routes" anzeigen.

    Im Fenster der IDLE-Shell wird das folgende Ergebnis angezeigt:

    baseName: bike_routes

    Der Basisname der Daten entspricht dem Dateinamen ohne Dateierweiterung.

    Wenn man lernt zu codieren, ist es normal, dass man Fehler macht. Ein typischer Fehler, der bei der Ausführung dieses Skripts auftreten kann, wird im nächsten Schritt erläutert.

  6. Ändern Sie die Zeile desc = arcpy.da.Describe("bike_routes.shp"), indem Sie den Unterstrich in bike_routes entfernen.

    desc = arcpy.da.Describe("bikeroutes.shp")

  7. Speichern Sie das Skript, und führen Sie es aus.

    In der IDLE-Shell wird eine Fehlermeldung angezeigt:

    ValueError: Object: Error in accessing describe

    ValueError

    Die Fehlermeldung besagt, dass beim Ausführen der Funktion da.Describe() ein Fehler auftritt. Der Grund für diesen Fehler ist, dass der Name der Feature-Class falsch geschrieben ist, sodass sie nicht gefunden werden kann. Wenn dieser Fehler auftritt, sollten Sie daher überprüfen, ob der Name richtig geschrieben ist. Ein weiterer möglicher Fehler ist, dass der Workspace nicht ordnungsgemäß eingerichtet wurde. Überprüfen daher auch den für den Workspace verwendeten Pfad.

    Hinweis:
    Sie können nicht nur da.Describe(), sondern auch die reguläre ArcPy-Funktion Describe() verwenden, um die Eigenschaften von GIS-Datasets einzusehen. Die Syntax unterscheidet sich geringfügig von da.Describe(). Die Funktion Describe() gibt ein Describe-Objekt zurück, das Sie zum Überprüfen der entsprechenden Eigenschaften verwenden können.

  8. Ändern Sie im Fenster des IDLE-Editors die Zeile, um den Feature-Class-Namen zu korrigieren.

    desc = arcpy.da.Describe("bike_routes.shp")

  9. Fügen Sie nach der Zeile print(f'baseName: die folgenden Zeilen hinzu:

    print(f'extension: {desc["extension"]}')
    print(f'dataType: {desc["dataType"]}')
    print(f'shapeType: {desc["shapeType"]}')

  10. Speichern Sie das Skript, und führen Sie es aus.

    Ergebnisse mit zusätzlich ausgegebenen Eigenschaften

    Der Basisname, die Dateierweiterung, der Datentyp und der Geometrietyp des Eingabe-Datasets werden ausgegeben. Im Bereich Katalog ist einfach zu erkennen, dass bike_routes.shp ein Polylinien-Shapefile ist. Aber nun können Sie auf diese Eigenschaften in einem Python-Skript zugreifen.

    Es gibt noch viele weitere Eigenschaften. Dies ist jedoch ein guter Anfang, um sich einen Überblick über die einzelnen Datasets zu verschaffen. Eine umfassende Liste mit Eigenschaften finden Sie im Abschnitt ArcPy-Dokumentation der ArcGIS Pro-Hilfeseiten.

    Es gibt viele verschiedene Eigenschaften, die auf den Hilfeseiten in Eigenschaftengruppen geordnet sind. Die Describe-Eigenschaftengruppe im obigen Link enthält einige allgemeine Eigenschaften für alle Datasets wie baseName, extension und datatype. Dann gibt es noch Eigenschaftengruppe für bestimmte Dataset-Typen. So enthält die Eigenschaftengruppe FeatureClass beispielsweise die Eigenschaft shapeType, die im obigen Codebeispiel verwendet wurde. Nicht alle Datasets verfügen über diese Eigenschaft, da sie möglicherweise keine Geometrie enthalten. Einige Eigenschaften lassen sich beim Navigieren durch die Hilfeseiten möglicherweise nicht so einfach finden. So befindet sich beispielsweise die extent-Eigenschaft in der Eigenschaftengruppe Dataset. Die Eigenschaftengruppen beziehen sich nur auf die Gliederung der Hilfeseiten und haben keine Auswirkungen auf den Code.

Als Nächstes ersetzen Sie den Verweis auf das Dataset, um das Skript zum Erkunden anderer Datasets zu verwenden.

Andere Dataset beschreiben

Nachdem Sie das Skript so erstellt haben, dass damit das Dataset bike_routes.shp beschrieben wird, ändern Sie es nun so, dass damit andere Daten beschrieben werden.

  1. Ersetzen Sie in der Zeile desc = arcpy.da.Describe("bike_routes.shp") den Teil bike_routes.shp durch watersheds.shp.

    desc = arcpy.da.Describe("watersheds.shp")

  2. Speichern Sie das Skript, und führen Sie es aus.

    Ergebnisse für das Shapefile "Watershed"

  3. Ersetzen Sie in der Zeile desc = arcpy.da.Describe("bike_routes.shp") den Teil watersheds.shp durch bike_racks.csv.

    desc = arcpy.da.Describe("bike_racks.csv")

  4. Speichern Sie das Skript, und führen Sie es aus.

    Schlüsselfehler in der CSV-Datei

    In der IDLE-Shell wird eine Fehlermeldung angezeigt.

    KeyError: 'shapeType'

    Das bedeutet, dass beim Verwenden des Wörterbuches ein Fehler aufgetreten ist, da der Wörterbuchschlüssel shapeType nicht vorhanden war. Wenn Sie bedenken, was shapeType bedeutet, ergibt das durchaus einen Sinn. Da eine Textdatei keine Geometrie aufweist, kann sie nicht als Punkt, Polylinie oder Polygon kategorisiert werden. Die Eigenschaft ist im Wörterbuch nicht vorhanden, da sie bei CSV-Dateien keinen Sinn ergibt.

    Das durch da.Describe() zurückgegebene Wörterbuch enthält die Schlüssel und Werte, die für einen bestimmten Datentyp sinnvoll sind.

    Sie können diesen Fehler verhindern, indem Sie eine Prüfung durchführen.

  5. Klicken Sie auf eine Stelle hinter der Zeile print(f'dataType: {desc["dataType"]}'), und drücken Sie die Eingabetaste, um eine neue Zeile hinzuzufügen.

    Fügen Sie eine neue Zeile hinzu.

  6. Fügen Sie nach der Zeile print(f'dataType: die folgenden Zeile hinzu:

    if "shapeType" in desc:

    Die Zeile enthält eine if-Anweisung. Zeilen mit einer If-Anweisung enthalten einen Test, in diesem Fall zum Ermitteln, ob die Zeichenfolge "shapeType" im Wörterbuch desc vorhanden ist. Nach dem Test steht nach if-Anweisungen ein Doppelpunkt. Die nächste Zeile ist die erste Zeile eines Code-Blocks, der nur dann ausgeführt wird, wenn dieser Test mit "True" ausgewertet wird. Die Zeilen des Code-Blocks müssen eingerückt werden, um Python mitzuteilen, dass sie zusammengehören und nur ausgeführt werden sollen, wenn sich beim Test "True" ergibt.

  7. Klicken Sie auf eine Stelle am Anfang der letzten Zeile, und fügen Sie vier Leerzeichen ein, um die Zeile einzurücken.

    Rücken Sie die letzte Zeile ein.

    Die letzten beiden Codezeilen lauten wie folgt:

    if "shapeType" in desc:
        print(f'shapeType: {desc["shapeType"]}')

  8. Speichern Sie das Skript, und führen Sie es aus.

    Ergebnisse der CSV-Datei

    Die Ergebnisse für die CSV-Datei werden ohne Fehler ausgegeben. Zunächst werden die ersten drei Eigenschaften ausgegeben. Anschließend wird mit der if-Anweisung geprüft, ob das Wörterbuch "shapeType" enthält. Da dies nicht der Fall ist, wird die letzte Zeile nicht ausgeführt.

    Woran können Sie erkennen, welche Eigenschaften für ein bestimmtes Dataset verfügbar sind?

    Sie können die Eigenschaften einsehen, indem Sie das gesamte Wörterbuch ausgeben.

    Als Nächstes erfahren Sie, wie Sie die Eigenschaften ausgeben.

Alle Eigenschaften für ein Dataset ausgeben

Sie haben gesehen, wie bestimmte Schlüssel und Werte für ein Wörterbuch ausgegeben werden und wie geprüft wird, ob ein bestimmter Schlüssel im Wörterbuch enthalten ist. Als Nächstes erfahren Sie, wie das gesamte Wörterbuch ausgegeben wird.

  1. Wählen Sie die letzten fünf Zeilen des Skripts aus.

    Das sind die Zeilen, mit denen die ersten drei Eigenschaften ausgegeben werden, sowie die if-Anweisung und die letzte print-Zeile.

  2. Nachdem Sie die Codezeilen ausgewählt haben, klicken Sie auf Format und dann auf Comment Out Region.

    Comment Out Region

    Den ausgewählten Zeilen sind nun jeweils zwei Rautezeichen vorangestellt. Ein vorangestelltes #-Zeichen macht für Python, aus einer Zeile einen Kommentar, sodass diese Zeilen beim Ausführen des Codes nicht ausgeführt werden.

    Sie erreichen dies, indem Sie am Anfang der einzelnen Zeilen ein Rautezeichen eingeben. Die Menüoption in IDLE ermöglicht jedoch die Eingabe für mehrere Zeilen in einem Schritt.

    Diesen Vorgang können Sie rückgängig machen, indem Sie die Zeilen auswählen und im Menü Format die Option Uncomment Region.

  3. Fügen Sie am Ende des Skripts eine neue Zeile hinzu, und entfernen Sie die Einrückungen.
  4. Fügen Sie die folgenden Zeilen hinzu:

    for k, v in desc.items():
        print(f"{k}: {v}")

    Schleife zum Ausgeben aller Eigenschaften

    Mit der ersten der beiden neuen Zeilen wird eine for-Schleife angefangen. For-Schleifen verwenden verschiedene Eingaben und einen Block mit eingerückten Codes und führen den Codeblock für jede Eingabe aus. In diesem Fall durchläuft die for-Schleife die Schlüssel/Wert-Paare, die durch den Aufruf der items-Methode für das Wörterbuch desc zurückgegeben werden. Weitere Informationen zum Ausführen von Schleifen für Wörterbücher finden Sie in der Dokumentation zu Python.

    Die zweite Zeile ist eingerückt. Diese Zeile ist die einzige Zeile des Code-Blocks der for-Schleife. Jedes Mal, wenn die Schleife ausgeführt wird, gibt diese Zeile eine formatierte Zeichenfolge aus, die die durch einen Doppelpunkt voneinander getrennte Werte der Variablen k und v ("k" für "key" (Schlüssel) und "v" für "value" (Wert)) enthält.

  5. Speichern Sie das Skript, und führen Sie es aus.

    Ergebnis nach dem Ausführen der Schleife zum Auflisten der Schlüssel und Werte für die CSV-Datei

    Der Code durchläuft alle Elemente im Wörterbuch und gibt die Schlüssel und Werte aus.

    Wenn Sie das Wörterbuch ausgeben, können Sie die Eigenschaften für einen bestimmten Datentyp einsehen.

    Als Nächstes sehen Sie sich einige Elemente in der Geodatabase an.

Geodatabase-Feature-Classes beschreiben

Nachdem Sie nun wissen, wie Sie die Eigenschaften von dateibasierten Shapefiles und CSV-Tabellen einsehen können, verwenden Sie Python, um Eigenschaften von Elementen in einer Geodatabase anzuzeigen. Statt alle Eigenschaften aufzulisten, verwenden Sie die print-Anweisungen, die Sie eben schon verwendet haben.

  1. Wählen Sie die fünf Codezeilen aus, die Sie zuvor auskommentiert haben. Klicken Sie auf Format und dann auf Uncomment Region.
  2. Kommentieren Sie die letzten beiden Codezeilen aus, die zum Durchlaufen des Wörterbuches verwendet wurden.
  3. Ändern Sie die Zeile mypath = "C:/Lessons/PythonDesc", indem Sie /DC.gdb hinzufügen.

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

  4. Ändern Sie die Zeile desc = arcpy.da.Describe("bike_racks.csv") so, dass damit die boundary-Feature-Class beschrieben wird.

    desc = arcpy.da.Describe("boundary")

    Elemente in einer Geodatabase haben keine Dateierweiterung. Daher lassen sie sich nur anhand des jeweiligen Datentyps voneinander unterscheiden.

    Beschreiben Sie die boundary-Feature-Class.

  5. Speichern Sie das Skript, und führen Sie es aus.

    Ergebnis des Skripts zum Beschreiben von "boundary"

    Die zweite Eigenschaft ist die Dateierweiterung. Diese Eigenschaft ist zwar ein gültiger Schlüssel im Wörterbuch, der Wert ist jedoch leer. Da leere Dateierweiterungen bei Geodatabase-Elementen üblich sind, können Sie eine weitere if-Anweisung hinzufügen, sodass die Zeile für die Erweiterung nur ausgegeben wird, wenn eine vorhanden ist.

  6. Ersetzen Sie die Zeile print(f'extension: {desc["extension"]}') durch die folgenden beiden Zeilen:

    if desc["extension"] != "":
        print(f'extension: {desc["extension"]}')

    Zeilen für die bedingte Anzeige von Erweiterungen

    Der Vergleichsoperator != steht für "ungleich". Folgende Vergleichsoperatoren sind in Python gültig: == (gleich), != (ungleich), < (kleiner als), <= (kleiner oder gleich), > (größer als) und >= (größer oder gleich). Die Operatoren =! und <> erwecken den Eindruck, als würden sie auch funktionieren. Dies sind jedoch keine gültigen Vergleichsoperatoren. Sie erzeugen beim Ausführen einen Syntaxfehler.

    Mit der ersten dieser beiden Zeilen wird überprüft, ob der mit dem Schlüssel "extension" verknüpfte Wert einer leeren Zeichenfolge (zwei Anführungszeichen ohne Inhalt) entspricht. Wenn dies mit "True" ausgeführt wird, wird die Zeile zum Ausgeben der formatierten Zeichenfolge mit dem Namen des Schlüssels "extension" und dem mit dem Schlüssel verknüpften Wert ausgeführt.

  7. Speichern Sie das Skript, und führen Sie es aus.

    Ergebnisse für bedingten Erweiterungscode

    Der Code wird ausgeführt. Dabei wird überprüft, ob der Schlüssel "extension" einen leeren Wert enthält. Da er einen leeren Wert enthält, wird der Test mit "False" ausgewertet, sodass die eingerückte Code-Blockzeile nicht ausgeführt und diese Zeile vom Code nicht ausgegeben wird. Der Code wird weiter ausgeführt. Als Nächstes wird die nächste Zeile außerhalb des Code-Blocks ausgeführt, indem die Eigenschaften "dataType" und "shapeType" ausgegeben werden.

    Sie können die anderen Elemente in der Geodatabase auf ähnliche Weise einsehen, indem Sie den Namen des Elements in der da.Describe()-Funktion ändern.

  8. Ersetzen Sie in der Zeile desc = arcpy.da.Describe("boundary") den Teil boundary durch car_share_locations.

    desc = arcpy.da.Describe("car_share_locations")

  9. Speichern Sie das Skript, und führen Sie es aus.

    Tabelle zum Beschreiben von Carsharing-Standorten

    Beim Element "car_share_locations" handelt es sich um eine Geodatabase-Tabelle. Es weist keine Erweiterung auf und enthält keinen Eintrag für "shapeType". Daher werden diese Zeilen nicht ausgegeben.

  10. Ändern Sie die Zeile desc = arcpy.da.Describe("car_share_locations") so, dass damit das Element Transportation beschrieben wird.

    desc = arcpy.da.Describe("Transportation")

  11. Speichern Sie das Skript, und führen Sie es aus.

    Ergebnis der Beschreibung von "Transportation"

    Transportation ist ein Feature-Dataset in der Geodatabase. Ein Feature-Dataset enthält Datenelemente, bei denen dasselbe Koordinatensystem verwendet wird. Ein Feature-Dataset kann als Workspace verwendet werden.

  12. Ändern Sie die Zeile mypath = "C:/Lessons/PythonDesc/DC.gdb", indem Sie /Transportation hinzufügen.

    mypath = "C:/Lessons/PythonDesc/DC.gdb/Transportation"

    Sie können nun die Feature-Classes und andere Elemente im Feature-Dataset beschreiben.

  13. Ändern Sie die Zeile desc = arcpy.da.Describe("Transportation") so, dass damit das Element Traffic beschrieben wird.

    desc = arcpy.da.Describe("Traffic")

    Code zum Beschreiben des Netzwerks

  14. Speichern Sie das Skript, und führen Sie es aus.

    Beschreibung des Netzwerks "Traffic"

    Traffic ist ein Netzwerk-Dataset. Netzwerk-Datasets werden zum Modellieren von Verkehrsnetzen verwendet. Sie werden aus Quell-Features erstellt, die Simple Features (Linien und Punkte) sowie Kantenübergänge einschließen können, und sie speichern die Verbindungen zwischen den Quell-Features. Wenn Sie eine Netzwerkanalyse durchführen, erfolgt die Analyse immer für ein Netzwerk-Dataset.

    Es gibt noch andere Datentypen, die in da.Describe() verwendet werden können. Mit den Elementen, die Sie beschrieben haben, ist jedoch einen Großteil der typischen GIS-Datasets abgedeckt. Jedes Dataset einzeln zu beschreiben, kann recht mühselig sein. Daher ist es hilfreich, eine Liste der in einem Workspace verfügbaren Datasets erstellen zu können, ohne jeden Namen einzeln eingeben zu müssen.

Dateien in einem Workspace auflisten

Eine typische Aufgabe beim Erstellen von Skripts in Python ist die Arbeit mit mehreren Datasets. Die Eingabe des Namens jedes einzelnen Datasets ist jedoch mühsam und zeitaufwendig. ArcPy enthält verschiedene Funktionen zum Erstellen eines Dataset-Verzeichnisses. Diese Funktionen geben in der Regel die Datasets in Form einer Python-Liste zurück, die für die weitere Verarbeitung verwendet werden kann.

  1. Sie starten mit einem neuen Skript.
  2. Klicken Sie im Fenster des IDLE-Editors auf File und dann auf Save As.

    Der aktuelle Name der Skriptdatei lautet describe_data.py. Mit Save As erstellen Sie ein neues Skript, um Ihre Arbeit fortzusetzen, während Sie die bisher erledigte Arbeit in der Datei describe_data.py speichern, damit Sie sie für die zukünftige Verwendung verfügbar haben.

  3. Geben Sie im Dialogfeld Save As list_data.py ein, und klicken Sie auf Save.
  4. Wählen Sie im Skriptfenster "describe_data" bis auf die ersten drei Zeilen alle Zeilen aus, und drücken Sie die Entf-Taste.

    Löschen Sie alle Zeilen außer den ersten drei.

  5. Bearbeiten Sie die Zeile mypath =, indem Sie /DC.gdb/Transportation im Pfad entfernen.

    mypath = "C:/Lessons/PythonDesc"

    Damit bleibt der Pfad zum Basisordner für die Daten des Lernprogramms übrig.

  6. Fügen Sie nach der Zeile arcpy.env.workspace die folgenden zwei Zeilen hinzu:

    files = arcpy.ListFiles()
    print(files)

    Mit der ersten dieser Zeilen wird eine neue Variable mit dem Namen files erstellt und als Ergebnis des Aufrufs der Funktion ListFiles definiert. Auf Funktionen folgt eine Liste mit Parametern, die in Klammern stehen. Da für die Funktion ListFiles() in diesem Fall keine Eingabeparameter erforderlich sind, sind die Klammern leer.

    Mit der zweiten Zeile wird die Liste ausgegeben.

    Dateien werden aufgelistet und ausgegeben.

    Der Code sollte folgendermaßen aussehen:

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    files = arcpy.ListFiles()
    print(files)

  7. Speichern Sie das Skript, und führen Sie es aus.

    Erste Ergebnisse für "ListFiles" zum Auflisten von Daten

    Dies ist eine Liste mit Dateien im Ordner PythonDesc. Python-Listen stehen in eckigen Klammern.

    Die ListFiles-Funktion gibt die Dateien im aktuellen Workspace zurück. Das heißt, wenn der Workspace nicht mit "arcpy.env.workspace" festgelegt wurde, ist das Ergebnis eine leere Liste und mit dem Skript wird None ausgegeben.

    Für die Funktion sind keine Parameter erforderlich. Zudem wird für die Funktion automatisch der aktuelle Workspace verwendet. Die aufgelisteten Dateien sind dem in Explorer angezeigten sehr ähnlich. Es gibt jedoch eine Ausnahme. Eine Geodatabase ist eine Datei in Explorer, jedoch im Ergebnis von ListFiles() enthalten. Daher wird DC.gdb hier als Datei angezeigt, obwohl es sich technisch um ein Ordner handelt, der Dateien enthält.

    Begrenzen Sie die Suche, sodass nur bestimmte Dateitypen zurückgegeben werden.

  8. Bearbeiten Sie die Zeile files = arcpy.ListFiles(), indem Sie in den Klammern "*.csv" hinzufügen.

    files = arcpy.ListFiles("*.csv")

    Mit der Funktion ListFiles kann ein optionaler Parameter verwendet werden, der als wildcard bezeichnet wird und mit dem Sie eine Zeichenfolge angeben können, die in den Suchergebnissen enthalten sein muss. Das Sternchen steht für null oder mehr nicht angegebene Zeichen, sodass bei dieser Platzhaltersuche alle Dateinamen mit der Erweiterung .csv zurückgegeben werden.

  9. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird die Liste mit den passenden Ergebnissen ausgegeben. In diesem Fall ist dies eine Liste mit nur einem Element.

    ['bike_racks.csv']

    Diese Vorgehensweise funktioniert bei jeder beliebigen Anzahl von Dateien und eignet sich zum Abrufen aller Dateien eines Dateityps in Form einer Liste sowie zum Durchführen dieser Aufgabe bei allen Dateien.

    Sie können auch andere Dateitypen wie .xlsx, .dbf usw. auflisten oder andere Teile der Namenszeichenfolge zuordnen. Wenn Sie beispielsweise die Platzhalterzeichenfolge "*bike*" verwenden, wird eine Liste mit allen Dateinamen zurückgegeben, die bike enthalten: ['bike_racks.csv', 'bike_routes.dbf', 'bike_routes.prj', 'bike_routes.sbn', 'bike_routes.sbx', 'bike_routes.shp', 'bike_routes.shx']

  10. Ändern Sie die Zeile mypath = "C:/Lessons/PythonDesc", indem Sie DC.gdb einbinden.

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

  11. Entfernen Sie den Parameter "*.csv" in der Funktion ListFiles.

    files = arcpy.ListFiles()

  12. Speichern Sie das Skript, und führen Sie es aus.

    Die Ergebnisliste wird angezeigt.

    Hierbei handelt es sich um die Dateien, die in Explorer im Ordner "DC.gdb" angezeigt werden. Die Funktion ListFiles() ist nicht geeignet, den Inhalt einer Geodatabase anzuzeigen, da die Datasets nicht einzelnen Dateien entsprechen. Zum Glück gibt es eine Funktion zum Auflisten von Feature-Classes.

Feature-Classes in einem Workspace auflisten

Feature-Classes sind die mit am häufigsten verwendeten GIS-Dataset-Typen. Die ListFeatureClasses()-Funktion gibt eine Liste der Feature-Classes im aktuellen Workspace zurück.

  1. Bearbeiten Sie die Zeile mypath =, indem Sie /DC.gdb im Pfad entfernen.

    mypath = "C:/Lessons/PythonDesc"

    Damit bleibt der Pfad zum Basisordner für die Daten des Lernprogramms übrig.

  2. Bearbeiten Sie die Zeile files = arcpy.ListFiles(), indem Sie ListFeatureClasses verwenden.

    files = arcpy.ListFeatureClasses()

    Der Code sollte folgendermaßen aussehen:

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    files = arcpy.ListFeatureClasses()
    print(files)

  3. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird eine Liste mit zwei Feature-Classes ausgegeben.

    ['bike_routes.shp', 'watersheds.shp']

    Bei den Feature-Classes handelt es sich in diesem Fall um Shapefiles. Das kann manchmal zu Verwirrung führen. Der Begriff "Feature-Class" wird verwendet, um einen homogenen Bestand an Features zu beschreiben, die alle dieselbe räumliche Darstellung (z. B. Punkte, Linien oder Polygone) aufweisen und für die dieselben Attribute verwendet werden. Die beiden häufigsten Arten von Feature-Classes in ArcGIS Pro sind Shapefiles und Geodatabase-Feature-Classes.

    Die Funktion ListFeatureClasses() kann sowohl für Shapefiles als auch für Geodatabase-Feature-Classes verwendet werden. Bei einem Workspace gibt sie jedoch nur den einen oder den anderen Typ zurück. Wenn es sich beim Workspace um einen Ordner handelt, werden mit der Funktion Shapefiles aufgelistet. Wenn es sich beim Workspace um eine Geodatabase handelt, werden mit der Funktion Geodatabase-Feature-Classes aufgelistet.

  4. Bearbeiten Sie die Zeile mypath =, indem Sie /DC.gdb im Pfad hinzufügen.

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

    Dies ist der Pfad zur File-Geodatabase.

    Listen Sie Feature-Classes in der Geodatabase auf.

  5. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird eine Liste mit drei Feature-Classes ausgegeben.

    ['neighborhoods', 'boundary', 'public_schools']

    In der Liste sind die Feature-Classes im Feature-Dataset Transportation nicht enthalten, da es sich hierbei um einen anderen Workspace handelt.

    Sie können einen Platzhalter verwenden, um die Ergebnisse aus ListFeatureClasses() zu filtern. So können Sie beispielsweise alle Feature-Classes abrufen, die mit einem bestimmten Buchstaben beginnen. Darüber hinaus ermöglicht die Funktion auch das Filtern nach Feature-Typ. Die Syntax der Funktion ListFeatureClasses() lautet wie folgt:

    ListFeatureClasses ({wild_card}, {feature_type}, {feature_dataset})

    Mit dem Parameter feature_type der Funktion können Sie das Ergebnis je nach Feature-Class-Typ begrenzen.

  6. Bearbeiten Sie die Zeile files = arcpy.ListFeatureClasses(), indem Sie zwei ("", "POINT")-Parameter verwenden.

    files = arcpy.ListFeatureClasses("", "POINT")

    Der erste Parameter (wild_card) wird nicht verwendet. Da Parameter jedoch eine vorgeschriebene Reihenfolge haben, muss dieser Parameter übersprungen werden. Die leere Zeichenfolge "" dient als Platzhalter und gibt an, dass dieser Parameter nicht verwendet wird. Es ist auch möglich, das Python-Schlüsselwort None zu verwenden.

    Sie können auch Parameter angeben, die nach Name referenziert werden. In diesem Fall müssen Sie sich nicht an die ursprüngliche Reihenfolge halten. Zudem gibt es die folgenden beiden Möglichkeiten, die Zeile zu schreiben:

    files = arcpy.ListFeatureClasses(None, "POINT")

    files = arcpy.ListFeatureClasses(feature_type="POINT")

    Sie können auch ein Rautezeichen als Zeichenfolge ("#") verwenden, um einen Werkzeugparameter zu überspringen. Das funktioniert jedoch nur bei Werkzeugfunktionen von ArcPy.

    Bei Python wird weitgehend die Groß- und Kleinschreibung beachtet, bei Zeichenfolgen in ArcPy-Funktionen in der Regel jedoch nicht. Daher kann im Parameter auch "Point" oder "point" verwendet werden.

    Der dritte Parameter, der in der Funktion verwendet werden kann, feature_dataset, wird nicht verwendet und kann ganz weggelassen werden, da er am Ende der Parameterfolge steht.

  7. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird die eine Point-Feature-Class im Workspace ausgegeben.

    ['public_schools']

Tabellen und Datasets auflisten

Sie haben Dateien und Feature-Classes aufgelistet. Als Nächstes listen Sie Tabellen und Feature-Datasets auf.

  1. Bearbeiten Sie die Zeile mypath =, indem Sie /DC.gdb im Pfad entfernen.

    mypath = "C:/Lessons/PythonDesc"

    Damit bleibt der Pfad zum Basisordner für die Daten des Lernprogramms übrig.

  2. Bearbeiten Sie die Zeile files = arcpy.ListFeatureClasses(feature_type="POINT"), indem Sie sie in ListTables() ändern.

    files = arcpy.ListTables()

    Der Code sollte folgendermaßen aussehen:

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    files = arcpy.ListTables()
    print(files)

    Listen Sie Tabellen im Ordner auf.

  3. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird die Liste der beiden Tabellen im Workspace ausgegeben.

    ['gardens.dbf', 'bike_racks.csv']

  4. Bearbeiten Sie die Zeile mypath =, indem Sie /DC.gdb im Pfad hinzufügen.

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

    Damit wird der Pfad auf die Geodatabase festgelegt.

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb"
    arcpy.env.workspace = mypath
    files = arcpy.ListTables()
    print(files)

  5. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird die Liste mit der einen Tabelle in der Geodatabase ausgegeben.

    ['car_share_locations']

  6. Bearbeiten Sie die Zeile files = arcpy.ListTables(), indem Sie sie in ListDatasets() ändern.

    files = arcpy.ListDatasets()

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb"
    arcpy.env.workspace = mypath
    files = arcpy.ListDatasets()
    print(files)

  7. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird die Liste mit dem einen Feature-Dataset in der Geodatabase ausgegeben.

    ['Transportation']

  8. Bearbeiten Sie die Zeile mypath =, indem Sie /Transportation im Pfad hinzufügen.

    mypath = "C:/Lessons/PythonDesc/DC.gdb/Transportation"

    Damit wird der Pfad auf das Feature-Dataset "Transportation" festgelegt.

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb/Transportation"
    arcpy.env.workspace = mypath
    files = arcpy.ListDatasets()
    print(files)

  9. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript wird die Liste mit dem einen Netzwerk-Dataset im Dataset "Transportation" ausgegeben.

    ['traffic']

    Die Funktion ListDatasets() kann mit verschiedenen Datenelementen verwendet werden. Mögliche Datenelemente sind unter anderem Feature-Datasets, geometrische Netzwerke, Netzwerke, Parcel-Fabrics, Raster-Kataloge und Topologien.

Nachdem Sie wissen, wie mithilfe von list-Funktionen Datenverzeichnisse erstellt werden können, verwenden Sie nun die resultierende Liste, um die einzelnen Listenelemente zu beschreiben.

Eine Liste iterieren

Die Erstellung einer Liste mit Daten ist in der Regel der erste Schritt in einem größeren Workflow. Meist soll für jedes Dataset eine bestimmte Aufgabe durchgeführt werden. Im Folgenden verwenden Sie eine Python for-Schleife, um eine Liste wiederholt zu durchlaufen.

Sie starten mit einem neuen Skript.

  1. Klicken Sie auf Datei, und klicken Sie auf Speichern unter aus.
  2. Geben Sie der neuen Datei den Namen iterate_data.py.
  3. Bearbeiten Sie die Zeile mypath =, indem Sie /Transportation im Pfad entfernen.

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

  4. Bearbeiten Sie die Zeile files = arcpy.ListDatasets(), indem Sie die Funktion ListFeatureClasses verwenden.

    files = arcpy.ListFeatureClasses()

  5. Ersetzen Sie die Zeile print(files) durch for file in files:, und drücken Sie die Eingabetaste.

    Der Doppelpunkt am Ende der Zeile zeigt den Beginn eines Codeblocks an. Die for-Schleife durchläuft die Elemente in der Liste, und der eingerückte Code im Code-Block wird für jedes Element ausgeführt. Wenn Sie am Ende einer Codezeile, die mit einem Doppelpunkt endet, die Eingabetaste drücken, wird die nächste Codezeile automatisch eingerückt.

    In jedem Zyklus wird die temporäre Variable file einem Namen in der Liste der Dateien in der files-Variable zugewiesen.

  6. Fügen Sie in der eingerückten neuen Zeile Folgendes hinzu:

    desc = arcpy.da.Describe(file)

    Mit der Funktion da.Describe() wird ein Wörterbuch mit den Eigenschaften der Feature-Classes zurückgegeben. Diese Codezeile wird für jede Feature-Class in der Liste der Feature-Classes ausgeführt.

  7. Drücken Sie die Eingabetaste, und fügen Sie Folgendes hinzu:

    print(desc["baseName"])

    Diese Zeile muss entsprechend der Zeile darüber um vier Leerzeichen eingerückt werden. Sie ist Teil des Code-Blocks mit der for-Schleife und wird für jede Feature-Class in der Liste ausgeführt.

    Mit dieser Zeile wird der im desc-Wörterbuch gespeicherte Wert mithilfe des Schlüssels baseName abgerufen und ausgegeben.

    Der vollständige Code sieht wie folgt aus:

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb"
    arcpy.env.workspace = mypath
    files = arcpy.ListFeatureClasses()
    for file in files:
        desc = arcpy.da.Describe(file)
        print(desc["baseName"])

    Geben Sie die Beschreibungen aus.

  8. Speichern Sie das Skript, und führen Sie es aus.

    Mit diesem Skript wird der Name der drei Feature-Classes in drei neuen Zeilen ausgegeben.

    neighborhoods
    boundary
    public_schools

    Als Nächstes ändern Sie den Code, sodass die Ergebnisse aufschlussreicher werden.

  9. Bearbeiten Sie die Zeile print(desc["baseName"]), indem Sie sie in name = desc["baseName"] ändern.

    Mit dieser Zeile wird der Name nicht ausgegeben, sondern in der Variablen name gespeichert.

    Die Zeile muss dennoch entsprechend der im Code-Block darüber liegenden Zeile eingerückt werden, sodass sie in jedem Schleifenzyklus ausgeführt wird.

  10. Fügen Sie die folgenden drei Zeilen hinzu:

        data = desc["dataType"]
        shape = desc["shapeType"]
        print(f"{name} is a {data} with {shape} geometry")

    Mit diesem Code werden Datentyp und Geometriewerte in den Variablen data und shape gespeichert.

    Mit der letzten Zeile wird eine formatierte Zeichenfolge erstellt und ausgegeben, wobei der Inhalt der drei Variablen eingesetzt wird.

  11. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript werden die drei formatierten Zeichenfolgen ausgegeben:

    neighborhoods is a FeatureClass with Polygon geometry
    boundary is a FeatureClass with Polygon geometry
    public_schools is a FeatureClass with Point geometry

Sie haben die Feature-Classes in der Geodatabase aufgelistet, die Liste wiederholt durchlaufen und die jeweiligen Informationen ausgegeben. Als Nächstes fügen Sie Code hinzu, um zu ermitteln, wie viele Feature-Classes von jedem Typ vorhanden sind.

Die Anzahl der Feature-Class-Typen ermitteln

Sie können die Eigenschaften der einzelnen Feature-Classes ermitteln und mithilfe einer Bedingungslogik festlegen, was geschehen soll. In diesem Abschnitt verwenden Sie if-Anweisungen, um Feature-Classes nach Geometrietyp zu zählen.

  1. Fügen Sie vor der Zeile for file in files: eine neue Zeile ein.
  2. Fügen Sie vor der for-Schleife die folgenden drei Zeilen hinzu:

    count_point = 0
    count_line = 0
    count_poly = 0

    Mit diesen Zeilen werden für drei Variable NULL-Werte festgelegt. Verwenden Sie diese Variablen, um die Anzahl der einzelnen Feature-Classes zu ermitteln.

    Sie werden vor der for-Schleife auf Null gesetzt, sodass deren Anzahl je nach Feature-Class-Typ in der for-Schleife erhöht werden kann. Wenn Sie sie innerhalb der for-Schleife definieren und auf Null setzen würden, würden bei jeder Schleifenausführung die Daten aus dem vorherigen Zyklus verloren gehen.

  3. Löschen Sie die vier letzten Zeilen in der for-Schleife.

    Legen Sie die Zähler fest, und löschen Sie die Zeilen in der for-Schleife.

  4. Fügen Sie in der for-Schleife nach desc = arcpy.da.Describe(file) die folgenden Zeilen hinzu:

    if desc["shapeType"] == "Point":
        count_point += 1

    Zähler wird für Punkte erhöht.

    Die Zeile if muss gleich weit eingerückt werden wie die Zeile desc.

    Mit der Zeile if wird ermittelt, ob der im Wörterbuch desc im Schlüssel shapeType gespeicherte Wert der Zeichenfolge Point entspricht.

    In Python wird das doppelte Gleichheitszeichen (==) verwendet, um zu prüfen, ob zwei Elemente gleich sind, während mit dem einfachen Gleichheitszeichen Werte zu Variablen zugewiesen werden.

    Nach der Zeile folgt ein Doppelpunkt, und die nächste Zeile wird eingerückt, da es sich hierbei um einen neuen Code-Block handelt.

    Wenn die Anweisung mit "false" ausgewertet wird, geschieht nichts. Wenn die Anweisung mit "true" ausgewertet wird, wird der Code-Block nach der if-Anweisung ausgeführt.

    Mit dem Code-Block wird zu dem in der Variablen count_point gespeicherten Wert 1 addiert. Beim Ausführen der Schleife wird für jedes Element in der Liste der Feature-Classes ermittelt, ob es sich um eine Point-Feature-Class handelt. Ist dies der Fall, wird 1 addiert. Nach dem Ausführen der Schleife enthält die Zählervariable die Anzahl der Point-Feature-Classes.

    Fügen Sie zwei weitere if-Anweisungen hinzu, um zu ermitteln, ob weitere Geometrietypen vorhanden sind.

  5. Drücken Sie am Ende der letzten Codezeile die Eingabetaste.

    Die neue Zeile wird am vorhandenen Einzug im aktuellen Code-Block ausgerichtet. Die nächste if-Anweisung muss jedoch gleich weit eingerückt sein wie die vorherige if-Anweisung.

  6. Drücken Sie die Rücktaste.

    Damit wird der Einzug der neuen Zeile an der vorherigen if-Anweisung ausgerichtet.

  7. Fügen Sie die folgenden Codezeilen hinzu:

    if desc["shapeType"] == "Polyline":
        count_line += 1
    if desc["shapeType"] == "Polygon":
        count_poly += 1

    Die drei if-Anweisungen sind aneinander ausgerichtet.

    Sie können den Einzug anpassen, indem Sie mit der Rücktaste Leerzeichen entfernen, oder Sie können vier Leerzeichen hinzufügen, um eine Zeile weiter einzurücken.

    Nun wird jedes Element in der Dateiliste beschrieben, das Wörterbuch der describe-Ergebnisse wird in der Variablen desc gespeichert, und es wird überprüft, ob die im Schlüssel shapeType gespeicherten Daten den Zeichenfolgen Point, Polyline bzw. Polygon entsprechen. Bei einer Entsprechung wird zu der Zählervariablen für dieses Shape 1 addiert.

    Als Nächstes fügen Sie einige Zeilen hinzu, um die Informationen auszugeben.

  8. Fügen Sie am Ende des Skripts eine Codezeile hinzu, und drücken Sie die Rücktaste, um Einrückungen zu entfernen.
  9. Fügen Sie die folgenden Codezeilen hinzu:

    print(f"Count of Point feature classes: {count_point}")
    print(f"Count of Polyline feature classes: {count_line}")
    print(f"Count of Polygon feature classes: {count_poly}")

    Vollständiges Skript zum Zählen von Geometrien und zum Ausgeben der Ergebnisse

    Da die letzten drei Zeilen nicht eingerückt sind, sind sie nicht Teil des Code-Blocks der for-Schleife und werden erst nach Abschluss der Schleife und nach dem Speichern der Anzahl der einzelne Shape-Typen ausgeführt.

  10. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript werden die folgenden drei Zeilen ausgegeben:

    Count of Point feature classes: 1
    Count of Polyline feature classes: 0
    Count of Polygon feature classes: 2

    Dies ist eine Möglichkeit, Python zum Verarbeiten von Daten zu verwenden. Zunächst wird eine Liste mit Daten abgerufen. Dann werden diese Informationen verwendet, um mit den Daten etwas zu tun. In diesem Beispiel werden einfach Feature-Classes gezählt. Ein ähnliches Skript könnte jedoch für andere Aufgaben verwendet werden, z. B. zum Kopieren aller Polygon-Feature-Classes oder zum Überprüfen der Attribute aller Point-Feature-Classes.

Sie haben die Anzahl der Feature-Classes der drei Geometrien ausgegeben. Als Nächstes lernen Sie eine kompaktere Möglichkeit kennen, die dasselbe bewirkt.

Abrufen der Anzahl mithilfe eines Feature-Typ-Filters

Sie können die Anzahl der Feature-Classes in einem Workspace auch abrufen, indem Sie die Funktion ListFeatureClasses() mit einem Filter nach Feature-Typ verwenden.

  1. Klicken Sie auf Datei, und klicken Sie auf Speichern unter aus.
  2. Geben Sie der neuen Datei den Namen filter_by_type.py.
  3. Wählen Sie die Zeilen zwischen den ersten drei und den letzten drei Skriptzeilen aus, klicken Sie auf Formatund dann auf Comment Out Region.

    Damit wird der mittlere Skriptabschnitt auskommentiert.

  4. Fügen Sie nach dem auskommentierten Abschnitt und vor den print-Zeilen eine neue Zeile hinzu.
  5. Fügen Sie die folgenden Codezeilen hinzu:

    count_point = len(arcpy.ListFeatureClasses(feature_type="POINT"))
    count_line = len(arcpy.ListFeatureClasses(feature_type="POLYLINE"))
    count_poly = len(arcpy.ListFeatureClasses(feature_type="POLYGON"))

    Hinzugefügte Zeilen zum Zählen mithilfe des Filters "feature_type"

    Mit diesen drei Zeilen werden die Variablen count_point, count_line und count_poly auf neue Weise festgelegt.

    Statt sie auf Null zu setzen und deren Werte zu erhöhen, wir hier in jeder Zeile die Funktion ListFeatureClasses() mit dem optionalen Parameter feature_type verwendet. Mit dieser Funktion wird eine Liste mit Feature-Classes erstellt, die dem Filterparameter entsprechen. Mit der len-Funktion wird die Länge der resultierenden Liste bestimmt, bei der es sich um die Anzahl der Feature-Classes dieses Typs handelt.

  6. Speichern Sie das Skript, und führen Sie es aus.

    Mit dem Skript werden die folgenden drei Zeilen ausgegeben:

    Count of Point feature classes: 1
    Count of Polyline feature classes: 0
    Count of Polygon feature classes: 2

    Diese Codelösung, bei der Zeilen auskommentiert werden, ist kürzer als die vorhergehende Lösung, bei der da.Describe() verwendet wird, um den Geometrietyp zu bestimmen. Mit da.Describe() können Sie außer dem Geometrietyp jedoch auch andere Eigenschaften wie die Anzahl der Felder, die räumliche Ausdehnung und das Koordinatensystem einsehen.

  7. Schließen Sie das Skript und das Fenster der IDLE-Shell.

Sie haben zwei Verfahren zum Abrufen der Anzahl von Feature-Classes unterschiedlichen Typs sowie zum Ausgeben dieser Informationen an die IDLE-Shell kennengelernt. Im Folgenden finden Sie ein Beispiel für die Verwendung dieser beiden Verfahren in einem Skript, bei dem der Inhalt eines Workspace aufgelistet und beschrieben und die Ergebnisse in eine Textdatei geschrieben werden.

Bestandsinformationen in eine Textdatei schreiben

Die Ausgabe an das interaktive Fenster liefert zwar unmittelbares Feedback, aber manchmal ist es vorteilhafter, die Ergebnisse in eine Textdatei zu schreiben. Ein entsprechendes Skript finden Sie im Ordner PythonDesc.

  1. Wechseln Sie in File Explorer zu dem Ordner PythonDesc, in dem Sie die Daten extrahiert haben.
  2. Klicken Sie mit der rechten Maustaste auf write_inventory.py, und klicken Sie auf Edit with IDLE (ArcGIS Pro).

    Im Folgenden sehen Sie sich das Skript an, passen ggf. den Pfad an und führen das Skript aus, um zu sehen, wie es funktioniert. Das Skript enthält Kommentare und aus Gründen der besseren Lesbarkeit leere Zeilen. Diese haben jedoch keinen Einfluss auf die Ausführung des Codes.

    Das Skript beginnt mit Kommentaren, die den Ersteller, das Datum und den Zweck des Skripts enthalten. Es empfiehlt sich, Skripten Hinweise wie diese hinzuzufügen, um über den Zweck und das Erstellungsdatum des Skripts zu informieren. Wenn Sie das Skript freigeben, können sich andere anhand dieser Angaben über das Skript informieren, und erfahren, an wen sie sich wenden können, wenn sie Fragen haben.

    Mit den ersten Codezeilen, die im Skript ausgeführt werden, werden die Module arcpy und os importiert.

    import arcpy
    import os

    Mit dem Modul os erhalten Sie über Python Zugriff auf Funktionen auf Betriebssystemebene.

    Im nächsten Abschnitt werden einige Variablen für Pfade und den Workspace festgelegt.

    #Variables for paths and workspace
    root = "C:/Lessons/PythonDesc"
    gdb = "DC.gdb"
    textfile = "inventory.txt"
    arcpy.env.workspace = os.path.join (root, gdb)
    output = os.path.join(root, textfile)

    Der Abschnitt beginnt mit einem Kommentar, der angibt, was dieser Teil des Codes bewirkt. Dies ist eine weitere vorteilhafte Vorgehensweise beim Schreiben von Python-Code.

  3. Wenn Sie den Ordner PythonDesc nicht im Verzeichnis C:/Lessons/PythonDesc, sondern an einem anderen Speicherort extrahiert haben, bearbeiten Sie den Pfad in der Zeile root = "C:/Lessons/PythonDesc", sodass auf den Speicherort des Ordners auf Ihrem Computer verwiesen wird.

    Unabhängig vom Stammordner können der Name der File-Geodatabase und der Name der Textdatei sowie die Codezeile, mit der arcpy.env.workspace festgelegt wird, gleich bleiben. Wenn Sie für den Pfad des Stammordners eine Variable verwenden, müssen Sie diese nur an einer Stelle im Skript aktualisieren. Die Funktion os.path.join() wird verwendet, um aus der Variablen root und den Variablen gdb und textfile vollständige Pfade zu erstellen.

    Als Nächstes wird mithilfe der Funktion open() eine neue leere Textdatei erstellt, wobei der Schreibmodus mit "w" angegeben wird. Wenn bereits eine Datei mit diesem Namen vorhanden ist, wird diese überschrieben.

    #Create new textfile to write results                  
    f = open(output, "w")

    Im nächsten Skriptabschnitt wird die Funktion ListFeatureClasses() verwendet, um Listen mit den drei Geometrietypen abzurufen.

    #Create list of feature classes by geometry type
    points = arcpy.ListFeatureClasses("", "POINT")
    lines = arcpy.ListFeatureClasses("", "POLYLINE")
    polygons = arcpy.ListFeatureClasses("", "POLYGON")

    Mit dem nächsten Skriptabschnitt werden mithilfe von formatierten Zeichenfolgen Kontextinformationen in die Textdatei geschrieben. Mit dem Zeichen \n am Ende der einzelnen Zeilen wird ein Escape-Zeichen hinzugefügt, das bewirkt, dass eine neue Zeile eingefügt wird, sodass die Informationen in der Textdatei in drei Zeilen angezeigt werden.

    f.write(f"Workspace of interest: {arcpy.env.workspace}\n")
    f.write(f"This workspace contains the following feature classes:\n")
    f.write(f"Count of Point feature classes: {len(points)}\n")

    In der dritten dieser Zeilen wird len(points) verwendet, um die Länge der Punkteliste, also die Anzahl der Point-Feature-Classes im Workspace, in die Zeichenfolge einzufügen.

    Die nächste Zeile enthält eine if-Anweisung, mit der überprüft wird, ob sich in der Point-Feature-Class-Liste Elemente befinden. Wenn keine Punkte vorhanden sind, geschieht bis zur nächsten f.write-Zeile nichts. Wenn jedoch Point-Feature-Classes vorhanden sind, wird der Code-Block nach der Zeile ausgeführt und das Skript schreibt eine neue formatierte Zeichenfolge in die Textdatei.

    if len(points) != 0:
        f.write(f"The names of the Point feature classes are:\n")
        for point in points:
            desc = arcpy.da.Describe(point)
            f.write(f'\t{desc["baseName"]}\n')
    f.write(f"Count of Polyline feature classes: {len(lines)}\n")

    Als Nächstes werden im Rahmen einer for-Schleife die einzelnen Point-Feature-Classes in der Liste verarbeitet.

    In der Schleife wird festgelegt, dass die Variable desc das Wörterbuch der Beschreibung arcpy.da.Describe der Feature-Class enthält.

    Mit der nächsten Zeile wird eine formatierte Zeichenfolge mit dem Namen der Feature-Class geschrieben, der mithilfe des Schlüssels baseName im Wörterbuch abgerufen wurde. Die Zeile wird mit dem Escape-Zeichen \t um eine Tabulatorlänge eingerückt, dann wird mit dem Zeichen \n eine neue Zeile hinzugefügt. Anschließend wird die Schleife für alle anderen Point-Feature-Classes wiederholt. Wenn keine mehr übrig sind, wird die f.write-Zeile ausgeführt. Dabei wird der Text hinzugefügt, der die Anzahl der Polyline-Feature-Classes in der Textdatei beschreibt, und mit \n wird eine neue Zeile eingefügt.

    Im Rahmen des restlichen Abschnitts werden die Polyline- und Polygon-Feature-Classes auf dieselbe Weise verarbeitet.

    
    if len(lines) != 0:
        f.write(f"The names of the Polyline feature classes are:\n")
        for line in lines:
            desc = arcpy.da.Describe(line)
            f.write(f'\t{desc["baseName"]}\n')
    f.write(f"Count of Polygon feature classes: {len(polygons)}\n")
    if len(polygons) != 0:
        f.write(f"The names of the Polygon feature classes are:\n")
        for polygon in polygons:
            desc = arcpy.da.Describe(polygon)
            f.write(f'\t{desc["baseName"]}\n')

    Nach Abschluss der Schleife, mit der die Polygon-Feature-Classes verarbeitet werden, wird mit der nächsten Zeile die Textdatei geschlossen.

    f.close()

    Im letzten Abschnitt wird die os-Funktion des startfile-Moduls verwendet, um die Textdatei mit dem Bericht zu öffnen.

    #Open the resulting output file
    os.startfile(output)

  4. Speichern Sie das Skript, und führen Sie es aus.

    Die Textdatei wird in Notepad geöffnet.

    Die Textdatei wird mit den Ergebnissen in Notepad geöffnet.

    Die Ergebnisse werden mithilfe der Methode file write() in die Textdatei geschrieben. Das Zeichen \n für eine neue Zeile wird verwendet, um eine ordnungsgemäße Formatierung zu gewährleisten, bei der jedes Ergebnis in einer neuen Zeile steht. Das Tabulatorzeichen \t wird zur besseren Lesbarkeit verwendet, indem die Namen der Feature-Classes eingerückt werden. Für diese Sonderzeichen wird ein umgekehrter Schrägstrich verwendet.

    Statt die Ergebnisse in eine Textdatei zu schreiben, können Sie sie auch an das interaktive Fenster ausgeben, indem Sie alle Vorkommen von f.write durch print ersetzen. Wenn Sie das Skript in ArcGIS Pro als Skriptwerkzeug ausführen möchten, können Sie die Informationen in Geoverarbeitungswerkzeug-Meldungen schreiben, indem Sie f.write durch arcpy.AddMessage ersetzen.

Überprüfen

  • Python-Code kann verwendet werden, um die Eigenschaften von GIS-Datasets wie den Datentyp, die Dateierweiterung und die Geometrie zu beschreiben.
  • ArcPy enthält verschiedene Funktionen zum Erstellen von Dataset-Listen. Zum Erstellen von Listen mit Dateien, Datasets, Tabellen und Feature-Classes sind bestimmte Funktionen verfügbar.
  • Indem Sie Datasets mithilfe von Python-Code auflisten und beschreiben, können Sie ein ausführliches Verzeichnis mit GIS-Datasets in einem Workspace erstellen. Danach können Sie die einzelnen Datasets je nach Merkmalen unterschiedlich verarbeiten.
  • Python-Code kann verwendet werden, um Informationen in Textdateien zu schreiben. Das ist nützlich zum Melden und Protokollieren von Fehlern.

Auch die Bücher Python Scripting for ArcGIS Pro und Advanced Python Scripting for ArcGIS Pro von Dr. Paul A. Zandbergen, veröffentlicht von Esri Press sind für Sie möglicherweise von Interesse.