Python-Skripte, die in ArcMap ausgeführt werden, und solche, die außerhalb von ArcMap ausgeführt werden?

10

Ich fange gerade an, mich mit Python-Skripten für die Arbeit zu beschäftigen.

Ich erstelle gerade ein Skript, um einen Prozess zu automatisieren.

Grundsätzlich wird der Benutzer nach dem Client-Namen gefragt, eine Projektion abgerufen, falls verfügbar, ein Verzeichnis auf Laufwerk C: für Client erstellt, eine für den Client spezifische Geodatabase für Dateien erstellt, das erforderliche Dataset erstellt und für Client-Daten spezifische Feature-Classes erstellt. Schließlich werden auch die erforderlichen Felder zu jeder Feature-Class und wahrscheinlich einige andere Dinge hinzugefügt.

Ich habe damit begonnen, die richtige Etikette für Python-Skripte für ArcMap nicht wirklich zu kennen. Aber was ich bisher erstellt habe, läuft meiner Meinung nach nur außerhalb von ArcMap.

Ist das akzeptabel?

Anstatt Benutzereingaben über arcpy.getparamaterastext () zu erhalten, von denen ich gerade erfahren habe, verwende ich raw_input ().

Ist das okay?

Es funktioniert, ich bin mir nur nicht sicher, ob dies der richtige Weg ist, um Skripte zu erstellen.

Hier ist der Code, den ich bisher habe.

import sys
import arcpy
import os

#Records name of the client
client = raw_input("Enter the name of the client: (letters and underscores only) \n")

#Records filepath of client to be created
clientpath = "C:/" + client

#Inquires if projection file exists
projection = raw_input("Is there a .prj or .shp available with correct projection? Y or N \n")

#Records the projection location if available
if projection.upper() == "Y":
    spatialr = raw_input("Drag the .prj or .shp here to record the filepath \n")
    nspatialr = spatialr.replace('"', "")
elif projection.upper() == "N":
    alert = raw_input("You must add the spatial reference manually, hit enter to continue. \n")
elif projection.upper() != "N" or "Y":
    exit = raw_input("That is not a valid response. Try again. \n")
    sys.exit()

#Checks if client folder exists; if not, creates one
if not os.path.exists(clientpath):
    os.makedirs(clientpath)

#Variable for file geodatabase location
FGBpath = clientpath + "/" + client + ".gdb"

#Checks if client file geodatabase exists; if not, creates one
if not arcpy.Exists(FGBpath):
    arcpy.CreateFileGDB_management(clientpath, client)

#Variable for dataset location
FDatasetpath = clientpath + "/" + client + ".gdb" + "/Network"

#Checks if dataset exists; if not, creates one
if not arcpy.Exists(FDatasetpath):
    if projection.upper() == "Y":
        arcpy.CreateFeatureDataset_management(FGBpath, "Network", nspatialr)
    elif projection.upper() == "N":
        arcpy.CreateFeatureDataset_management(FGBpath, "Network")

#Variable for cable feature class location
FCcablepath = clientpath + "/" + client + ".gdb" + "/Network" + "/cable"

#Checks if cable feature class exists; if not, creates one
if not arcpy.Exists(FCcablepath):
    if projection.upper() == "Y":
        arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE", "", "", "", nspatialr)
    elif projection.upper() == "N":
        arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE")

#Variable for splice point feature class location
FCsplicepath = clientpath + "/" + client + ".gdb" + "/Network" + "/splice_point"

#Checks if splice point feature class exists; if not, creates one
if not arcpy.Exists(FCsplicepath):
    if projection == 'Y' or projection == 'y':
        arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT", "", "", "", nspatialr)
    elif projection == 'N' or projection == 'n':
        arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT")

exit = raw_input("\n\n File geodatabase, dataset, and the cable \n and splice point feature classes successfully created. \n\n Hit enter to exit.")

Ich habe noch einige Arbeiten zu erledigen, beispielsweise das Hinzufügen der erforderlichen Felder.

ianbroad
quelle

Antworten:

18

Wie Sie Ihre Eingaben erhalten, hängt zu 100% davon ab, wer der Endbenutzer sein wird. Sie haben jedoch Recht, dass Sie raw_input in ArcMap überhaupt nicht verwenden können. Wenn Sie der einzige sind, der das Skript verwendet, ist es nichts Falsches, wenn Sie Ihre Eingaben über raw_input oder harte Codierungspfade als Variablen in Ihr Skript übertragen. Wenn jedoch jemand anderes das Skript verwendet, das möglicherweise über Skripterfahrung verfügt oder nicht, verwenden Sie am besten getParameterAsText () und implementieren Sie Ihr Skript als Skriptwerkzeug in ArcMap. Durch das Erstellen eines Skript-Tools erhält der Benutzer eine Oberfläche, die der von den meisten ESRI-Tools verwendeten ähnelt (z. B. Standard-Tools wie Puffer usw.).

Eine Sache, die Sie hervorheben sollten, ist, dass die Art und Weise, wie Sie Ihre raw_inputs entworfen haben, eine schrittweise Interaktion zwischen dem Benutzer und dem Skript erzeugt. Wenn dies mit getParameterAsText () in ArcMap ausgeführt wird, wird die schrittweise Anleitung ausgeblendet, und es handelt sich lediglich um eine Reihe von Einstellungen, die vor dem Ausführen des Skripts eingegeben werden.

Einer der Hauptzwecke für Skripte ist die Automatisierung. Wenn Sie dies für mehrere Datasets ausführen möchten, sollten Sie Schleifen auschecken . Wenn Sie so weit gekommen sind, haben Sie wahrscheinlich zumindest darüber gelesen, aber als Beispiel dafür, wie Sie sie verwenden könnten: Angenommen, Sie haben mehrere Datensätze, für die Sie denselben Vorgang ausführen müssen. Sie können den Code für die Prozesse schreiben, die einmal ausgeführt werden müssen, und dann eine 'for'-Schleife einfügen, die eine Liste von Datensätzen erstellt und die Operation für jeden von ihnen ausführt.

Für Dinge wie Raumbezug können Sie mit arcpy.Describe () einen Raumbezug aus einem vorhandenen Shapefile 'stehlen' oder mit getParameterAsText () eine Raumbezugseingabe abrufen (sofern Sie den Parameter als Raumbezugseingabe definieren beim Einrichten des Skript-Tools). Die Verwendung von raw_input zum Abrufen von Pfadnamen ist etwas umständlich.

Bluefoot
quelle
4
+1, ich würde definitiv auf Parameter vs. raw_input umstellen. Nicht viele Endbenutzer möchten eine Befehlszeilenschnittstelle im Vergleich zu einer grafischen Benutzeroberfläche verwenden, insbesondere wenn sie an die Geoverarbeitungswerkzeuge von ArcGIS gewöhnt sind.
blah238
10

Zusätzlich zu den großartigen Vorschlägen von @ egdetti können Sie Ihr Skript erheblich vereinfachen, indem Sie einige Annahmen treffen , anstatt für jede kleine Bedingung eine if / else-Logik zu schreiben.

Zum Beispiel:

  • Anstatt vorher zu prüfen, ob jedes Element vorhanden ist, nehmen Sie einfach an, dass dies der Fall ist, und überschreiben Sie es durch Festlegen arcpy.env.overwriteOutput = True. Jetzt haben Sie vielleicht einen Grund, warum Sie vorher prüfen müssen, aber meistens ist das Überschreiben in Ordnung.

  • Anstatt zu überprüfen, ob die räumliche Referenzoption festgelegt wurde, und denselben Befehl auf zwei verschiedene Arten aufzurufen, übergeben Sie die räumliche Referenzvariable einfach einmal an den Befehl und lassen Sie ihn null oder leere Zeichenfolgen verarbeiten (was in Ordnung ist).

  • Verwenden Sie os.path.joindiese Option , um Dateipfadelemente zu verknüpfen, anstatt die mit Gefahren behaftete Zeichenfolgenverkettung zu verwenden.

    ZB statt:

    FGBpath = clientpath + "/" + client + ".gdb"

    Benutzen:

    FGBpath = os.path.join(clientpath, client + ".gdb")
blah238
quelle
Genial! Genau die Tipps, nach denen ich gesucht habe, danke! Kennen Sie eine Liste, die die am häufigsten verwendeten Funktionen / Bibliotheken enthält? Wie der os.path.join? Es gibt so viele, dass es überwältigend ist. Ich würde dich +1, wenn ich könnte. Sie sollten mir erlauben, Fragen zu bewerten, nur nicht zu bewerten!
Ianbroad
2
Ich nehme an, Sie haben das offizielle Python-Tutorial bereits durchlaufen . Es enthält praktische Abschnitte ( 1 , 2 ) in der Standardbibliothek. Eine weitere gute Ressource ist Doug Hellmanns Liste "Modul der Woche": teigellmann.com/PyMOTW/contents.html
blah238
Auch besser überwältigt als unterfordert zu sein, sage ich!
blah238
Nun, ich gebe es nur ungern zu, aber ich habe das Tutorial noch nicht durchgearbeitet. Ich bin einfach hineingesprungen. Ich habe vor Jahren einen C ++ - Kurs besucht, daher kenne ich die Grundlagen, aber ich muss das Tutorial unbedingt gründlich durchsehen. Ich war schon immer ein Kopf-an-Kopf-Mensch. Danke für die Links.
Ianbroad
Vielleicht gefällt dir auch diveintopython.net :)
blah238