Script Python eseguiti all'interno di ArcMap rispetto a quelli eseguiti all'esterno?


10

Sto appena iniziando ad entrare nello scripting Python per lavoro.

Attualmente sto creando uno script per automatizzare un processo.

Fondamentalmente, chiede all'utente il nome del client, ottiene una proiezione se disponibile, crea directory su C: drive per client, crea file geodatabase specifico per client, crea set di dati richiesti e crea classi di caratteristiche specifiche per i dati dei client. Alla fine, aggiungerà anche i campi richiesti per ogni classe di funzionalità e probabilmente altre cose.

Ho iniziato questo non conoscendo davvero l'etichetta corretta dello scripting Python per ArcMap. Ma quello che ho creato finora funzionerà solo al di fuori di ArcMap, credo.

È accettabile?

Invece di ottenere l'input dell'utente tramite arcpy.getparamaterastext (), di cui ho appena scoperto, sto usando raw_input ().

Va bene?

Funziona, non sono sicuro che questo sia un modo corretto di fare script.

Ecco il codice che ho finora.

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.")

Ho ancora del lavoro da fare, come aggiungere i campi necessari.

Risposte:


18

Il modo in cui ottieni i tuoi input dipende al 100% da chi sarà l'utente finale, ma hai ragione, non sarai in grado di usare raw_input in ArcMap. Se sarai l'unico ad usare lo script, non c'è niente di sbagliato nel portare i tuoi input attraverso raw_input o percorsi di codifica rigida come variabili nel tuo script. Tuttavia, se qualcun altro utilizzerà lo script che potrebbe o meno avere un'esperienza di scripting, è meglio utilizzare getParameterAsText () e implementare lo script come strumento di script in ArcMap. La creazione di uno strumento di script fornirà all'utente un'interfaccia simile a quella utilizzata dalla maggior parte degli strumenti ESRI (come strumenti standard come buffer, ecc ...).

Una cosa da sottolineare è che il modo in cui hai progettato raw_inputs crea un'interazione graduale tra l'utente e lo script. Se questo viene eseguito usando getParameterAsText () in ArcMap, il passo dopo passo sparirà e saranno solo una serie di impostazioni che verranno inserite prima dell'esecuzione dello script.

Uno degli scopi principali per lo scripting è l'automazione. Se si esegue questo su più set di dati, è necessario controllare i loop . Se sei arrivato così lontano, probabilmente ne hai letto almeno su di loro, ma come esempio per come usarli: supponi di avere più set di dati su cui devi eseguire la stessa operazione. È possibile scrivere il codice per i processi che devono essere eseguiti una volta, quindi includere un ciclo 'for' che prende un elenco di set di dati ed esegue l'operazione su ciascuno di essi.

Per cose come il riferimento spaziale, puoi "rubare" un riferimento spaziale da un file di forma esistente usando arcpy.Describe () oppure puoi ottenere un input di riferimento spaziale usando getParameterAsText () (purché tu definisca il parametro come input di riferimento spaziale durante l'impostazione dello strumento di script). L'uso di raw_input per ottenere i nomi dei percorsi è un po 'complicato.


4
+1, passerei sicuramente a prendere parametri vs. raw_input. Non molti utenti finali vorranno utilizzare un'interfaccia della riga di comando rispetto a una GUI, specialmente quando sono abituati a qualcosa come gli strumenti di geoprocessing di ArcGIS.
blah238,

10

Oltre ai fantastici suggerimenti di @ egdetti , puoi semplificare notevolmente il tuo script facendo alcune ipotesi invece di scrivere la logica if / else per ogni piccola condizione.

Per esempio:

  • Invece di verificare se ogni elemento esiste in anticipo, basta supporre che lo faccia e sovrascriverlo impostando arcpy.env.overwriteOutput = True. Ora potresti avere qualche motivo per cui devi controllare in anticipo, ma il più delle volte la sovrascrittura va bene.

  • Invece di verificare se è stata impostata l'opzione di riferimento spaziale e chiamare lo stesso comando in due modi diversi, basta passare una volta la variabile di riferimento spaziale al comando e lasciare che gestisca stringhe nulle o vuote (che andrà bene).

  • Utilizzare os.path.joinper unire gli elementi del percorso del file invece di utilizzare la concatenazione di stringhe, che è piena di pericoli.

    Ad esempio invece di:

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

    Uso:

    FGBpath = os.path.join(clientpath, client + ".gdb")

Eccezionale! Proprio il tipo di consigli che stavo cercando, grazie! Conosci qualche tipo di elenco che mostra le funzioni / librerie più comuni che le persone usano? Come os.path.join? Ce ne sono così tanti che è abbastanza travolgente. Ti farei +1 se potessi. Dovrebbero permettermi di votare le domande, ma non di ridurle!
ianbroad,

2
Presumo tu abbia già passato il tutorial ufficiale di Python ? Ha sezioni utili ( 1 , 2 ) sulla libreria standard. Un'altra buona risorsa è la lista del modulo della settimana di Doug Hellmann: doughellmann.com/PyMOTW/contents.html
blah238

Inoltre, meglio essere sopraffatti che sopraffatti, dico!
blah238,

Beh, odio ammetterlo, ma non ho ancora seguito il tutorial. Ho appena saltato dentro. Ho seguito un corso di C ++ anni fa, quindi conosco le basi, ma devo assolutamente esaminare attentamente il tutorial. Sono sempre stato un tuffo nel primo tipo di persona. Grazie per i collegamenti.
ianbroad,

Potrebbe piacerti anche diveintopython.net , quindi :)
blah238
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.