Skrypty Pythona działające w ArcMap w porównaniu ze skryptami działającymi na zewnątrz?

10

Zaczynam dopiero zaczynać pracę w skryptach Python.

Obecnie tworzę skrypt do automatyzacji procesu.

Zasadniczo pyta użytkownika o nazwę klienta, wyświetla projekcję, jeśli jest dostępna, tworzy katalog na dysku C: dla klienta, tworzy geobazę plików specyficzną dla klienta, tworzy wymagany zestaw danych i tworzy klasy funkcji specyficzne dla danych klientów. W końcu doda również wymagane pola do każdej klasy elementów i prawdopodobnie kilka innych rzeczy.

Zacząłem od tego, nie bardzo znając właściwą etykietę skryptów Python dla ArcMap. Ale to, co do tej pory stworzyłem, będzie działało poza ArcMap.

Czy to jest dopuszczalne?

Zamiast uzyskiwania informacji od użytkownika za pośrednictwem arcpy.getparamaterastext (), o czym właśnie się dowiedziałem, używam raw_input ().

Czy to w porządku?

Działa, po prostu nie jestem pewien, czy jest to właściwy sposób wykonywania skryptów.

Oto kod, który mam do tej pory.

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

Nadal mam trochę do zrobienia, na przykład dodanie potrzebnych pól.

ianbroad
źródło

Odpowiedzi:

18

To, jak zdobędziesz swoje dane wejściowe, zależy w 100% od tego, kim będzie użytkownik końcowy, ale masz rację, w ogóle nie będziesz w stanie używać raw_input w ArcMap. Jeśli będziesz jedynym, który używa skryptu, nie ma nic złego w wprowadzaniu danych wejściowych poprzez raw_input lub ścieżkach kodowania na stałe jako zmiennych do skryptu. Jednakże, jeśli ktokolwiek będzie używał skryptu, który może mieć lub nie mieć żadnego doświadczenia ze skryptami, najlepiej użyć getParameterAsText () i zaimplementować skrypt jako narzędzie skryptowe w ArcMap. Utworzenie narzędzia skryptowego da użytkownikowi interfejs podobny do interfejsu używanego przez większość narzędzi ESRI (takich jak standardowe narzędzia, takie jak bufor itp.).

Jedną z rzeczy, na które należy zwrócić uwagę, jest to, że sposób zaprojektowania raw_inputs tworzy krok po kroku interakcję między użytkownikiem a skryptem. Jeśli zostanie to uruchomione przy użyciu getParameterAsText () w ArcMap, krok po kroku zniknie i będzie to po prostu szereg ustawień, które zostaną wprowadzone przed uruchomieniem skryptu.

Jednym z głównych celów skryptów jest automatyzacja. Jeśli zamierzasz uruchomić to na wielu zestawach danych, powinieneś sprawdzić pętle . Jeśli zaszedłeś tak daleko, prawdopodobnie przeczytałeś o nich przynajmniej, ale jako przykład tego, jak możesz ich użyć: powiedz, że masz wiele zestawów danych, na których musisz wykonać tę samą operację. Możesz napisać kod dla procesów, które należy wykonać raz, a następnie dołączyć pętlę „for”, która pobiera listę zestawów danych i wykonuje operację na każdym z nich.

W przypadku np. Odniesienia przestrzennego można „ukraść” odniesienie przestrzenne z istniejącego pliku kształtu za pomocą arcpy.Describe () lub można uzyskać wejście odniesienia przestrzennego za pomocą getParameterAsText () (pod warunkiem, że parametr zostanie zdefiniowany jako wejście odniesienia przestrzennego podczas konfigurowania narzędzia skryptowego). Używanie raw_input w celu uzyskania nazw ścieżek jest nieco kłopotliwe.

bluefoot
źródło
4
+1, zdecydowanie przestawiłbym się na przyjmowanie parametrów vs. raw_input. Niewielu użytkowników końcowych będzie chciało korzystać z interfejsu wiersza poleceń w porównaniu z GUI, zwłaszcza gdy są przyzwyczajeni do czegoś takiego jak narzędzia geoprzetwarzania ArcGIS.
blah238,
10

Oprócz świetnych sugestii @ egdetti , możesz znacznie uprościć skrypt, przyjmując pewne założenia zamiast pisać logikę if / else dla każdego małego warunku.

Na przykład:

  • Zamiast sprawdzać, czy każdy element istnieje wcześniej, po prostu załóż, że tak, i zastąp go, ustawiając arcpy.env.overwriteOutput = True. Teraz możesz mieć jakiś powód, dla którego musisz sprawdzić wcześniej, ale częściej nadpisywanie jest w porządku.

  • Zamiast sprawdzać, czy ustawiono opcję odwołania przestrzennego i wywoływać to samo polecenie na dwa różne sposoby, wystarczy raz przekazać zmienną odwołania przestrzennego do polecenia i pozwolić mu obsługiwać ciągi zerowe lub puste (co będzie dobrze).

  • Służy os.path.joindo łączenia elementów ścieżki pliku zamiast łączenia łańcuchów, które jest pełne niebezpieczeństw.

    Np. Zamiast:

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

    Posługiwać się:

    FGBpath = os.path.join(clientpath, client + ".gdb")
blah238
źródło
Niesamowite! Właśnie takie wskazówki, których szukałem, dzięki! Czy znasz jakąkolwiek listę, która pokazuje najczęściej używane funkcje / biblioteki, z których ludzie korzystają? Takich jak os.path.join? Jest ich tak wiele, że to trochę przytłaczające. Dałbym ci +1, gdybym mógł. Powinny pozwolić mi głosować na pytania, ale nie głosować na nie!
ianbroad
2
Zakładam, że już przeszedłeś oficjalny samouczek języka Python ? Ma przydatne sekcje ( 1 , 2 ) w standardowej bibliotece. Innym dobrym zasobem jest lista modułów tygodnia Douga Hellmanna: doughellmann.com/PyMOTW/contents.html
blah238
Mówię też, że lepiej być przytłoczonym niż niedocenionym!
blah238,
Nienawidzę tego przyznać, ale jeszcze nie przejrzałem tego samouczka. Właśnie w to wskoczyłem. Brałem lekcje języka C ++ wiele lat temu, więc znam trochę podstawy, ale zdecydowanie muszę dokładnie przejrzeć samouczek. Zawsze byłem nurkiem na pierwszym miejscu. Dzięki za linki.
ianbroad
Możesz też polubić diveintopython.net :)
blah238,