Více

Jaký je životní cyklus skriptu ArcPy v ArcGIS?

Jaký je životní cyklus skriptu ArcPy v ArcGIS?


V níže uvedeném kódu těsně předarcpy.AddMessage („Hotovo!“)prohlášení Použil jsem výběrový dotaz. Problém je v tom, že nově vytvořený shapefile Testing1, ve kterém spouštím dotaz, nemůže najít Testing1.

Důvodem, proč nebyl schopen najít Testing1, bylo to, že nebyl uveden v obsahu. Ale když odstraním výběrový dotaz, kód funguje dobře a Testing1 je uveden v obsahu.

Proč?

Existuje po skončení skriptu životní cyklus, který umožňuje zobrazení souboru tvaru Testing1 v obsahu?

Pokud existuje, jak to mohu připojit, aby můj výběrový dotaz fungoval?

############################################################################ ################################# Název nástroje: BetterBusBuffers - počet výjezdů na zastávkách ## Vytvořila: Melinda Morang, Esri, [email protected] .com ## Poslední aktualizace: 4. dubna 2014 ############################################### ########################################## "BetterBusBuffers - Count Trips at Stops BetterBusBuffers poskytuje kvantitativní měřítko přístupu na veřejnou dopravu ve vašem městě počítáním četnosti jízd tranzitu na různých místech. Nástroj Count Trips at Stops vytvoří třídu funkcí vašich zastávek GTFS a spočítá počet cest, které každou navštíví během časového okna, stejně jako počet cesty za hodinu a maximální čas mezi následujícími cestami během toho časového okna. "import arcpy import BBB_SharedFunctions třída CustomError (Exception): pass try: # ------ Získejte vstupní parametry a nastavte věci. ----- zkus: # Cesta pro třídu výstupních funkcí zastávek GTFS. # Musí to být třída funkcí geodatabáze souborů, nikoli soubor tvaru. outStops = arcpy.GetParameterAsText (0) # GTFS SQL dbase - musí být vytvořeno předem. SQLDbase = "C: /Users/Gurminder/Desktop/sir/temp.sql" # arcpy.GetParameterAsText (1) BBB_SharedFunctions.ConnectToSQLDatabase (SQLDbase) # okno dne a času pro analýzu DayOfWeek = endcet.Get časové okno (HH: MM v 24hodinovém čase) start_time = arcpy.GetParameterAsText (3) # Výchozí čas zahájení je půlnoc, pokud ho ponechají prázdné. if start_time == "": start_time = "00:00" # Převést na sekundy start_sec = BBB_SharedFunctions.parse_time (start_time + ": 00") # Horní konec časového okna (HH: MM za 24 hodin) end_time = arcpy .GetParameterAsText (4) # Výchozí čas ukončení je 23:59, pokud ho ponechají prázdné. if end_time == "": end_time = "23:59" # Převést na sekundy end_sec = BBB_SharedFunctions.parse_time (end_time + ": 00") # Vypočítáme maximální dobu čekání? Tím se výpočet zpomalí, takže ho nechte nepovinný. CalcWaitTime = arcpy.GetParameterAsText (5) # Chce uživatel počítat příchody nebo odjezdy na zastávkách? DepOrArrChoice = arcpy.GetParameterAsText (6) if DepOrArrChoice == "Arrivals": DepOrArr = "coming_time" elif DepOrArrChoice == "Departures": DepOrArr = "odchod_čas" ArIncpy = ArInpy ("desktop") ArcVersion = ArcVersionInfo ['Verze'] kromě: arcpy.AddError ("Chyba při získávání uživatelských vstupů.") zvýšit # ----- Vytvořte třídu funkcí zastávek a přidejte pole pro počty jízd tranzitu --- --- #TODO iteraci lze provést zde: arcpy.AddMessage („Vytváření třídy funkcí zastávek GTFS…“) # Vytvořte třídu funkcí tranzitu, která zastaví outStops, StopIDList = BBB_SharedFunctions.MakeStopsFeatureClass (outStops) # Přidejte pole do výstupní soubor pro počet cest, počet výletů za hodinu a maximální dobu čekání, pokud „.shp“ v outStops: # Shapefiles nemohou mít dlouhé názvy polí arcpy.management.AddField (outStops, „NumTrips“, „SHORT“) arcpy .management.AddField (outStops, "TripsPerHr", "DOUBLE") arcpy.management.AddField (outStops, "MaxWaitTm", "SHORT") el viz: arcpy.management.AddField (outStops, "NumTrips", "SHORT") arcpy.management.AddField (outStops, "NumTripsPerHr", "DOUBLE") arcpy.management.AddField (outStops, "MaxWaitTime", "SHORT") kromě: arcpy.AddError („Chyba při vytváření třídy funkcí zastávek GTFS.“) zvyšte #----- Dotazujte data GTFS, aby počítala jízdy při každé zastávce ----- try: arcpy.AddMessage („Výpočet čísla dostupných tranzitních jízd během časového okna ... ") # Získejte slovník {stop_id: [[trip_id, stop_time]]} pro naše časové okno stoptimedict = BBB_SharedFunctions.CountTripsAtStops (DayOfWeek, start_sec, end_sec, DepOrArr) # TODO spustit 24krát vytvořit 24 shapefile pro pondělí sobota neděle # řešení vytvořit 24 stoptimedict proměnných s různými parametry start_sec a end_sec kromě: arcpy.AddError („Chyba při počítání příchodů nebo odchodů při zastavení během časového okna.“) zvýšit # ----- Zapsat na výstup ----- try: arcpy.AddMessage ("Zápis výstupních dat ...") # Vytvořte aktualizační kurzor pro přidání numtripsů, výletů za hodinu a maxwaittime k zastavení, pokud ArcVersion == "10.0": if ".shp" v outStops: ucursor = arcpy.UpdateCursor (outStops, "", "", "stop_id; NumTrips; TripsPerHr; MaxWaitTm ") #TODO všechny tvarové soubory by se zde měly iterovat pro řádek v ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedFunctions.RetrieveStatsForSetOfStops ([str (row.getVimeue,] stop_id row.NumTrips = NumTrips row.TripsPerHr = NumTripsPerHr if MaxWaitTime == None: row.MaxWaitTm = -1 else: row.MaxWaitTm = MaxWaitTime ucursor.updateRow (row) else: ucursor = arcpy.UpdateCursor (" "" stop_id; NumTrips; NumTripsPerHr; MaxWaitTime ") pro řádek v ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedFunctions.RetrieveStatsForSetOfStops ([str (řádek) ) row.NumTrips = NumTrips row.NumTripsPerHr = NumTripsPerHr row.MaxWaitTime = MaxWaitTime ucursor.updateRow (řádek) else: # Pro všechno 10.1 a vpřed, pokud ".shp" v outStops: ucursor = arcpy.da.UpdateC stop_id "," NumTrips "," TripsPerHr "," MaxWaitTm "]) else: ucu rsor = arcpy.da.UpdateCursor (outStops, ["stop_id", "NumTrips", "NumTripsPerHr", "MaxWaitTime"] pro řádek v ucursor: NumTrips [NumTripsPerHr], [0])], stoptimedict, CalcWaitTime, start_sec, end_sec) řádek [1] = NumTrips řádek [2] = NumTripsPerHr pokud ".shp" v outStops a MaxWaitTime == Žádný: řádek [3] = -1 else: řádek [ 3] = MaxWaitTime ucursor.updateRow (řádek) kromě: arcpy.AddError ("Chyba při zápisu na výstup.") Zvýší arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("Dokončeno!" ") arcpy.AddMessage (" Váš výstup je umístěn na " + outStops) kromě CustomError: arcpy.AddError (" Nepodařilo se počítat jízdy na zastávkách. ") projít kromě: arcpy.AddError (" Nepodařilo se počítat výlety na zastávkách. ") zvýšit arcpy.AddMessage ("Kontrola curosr")

Problém je v tom, že se jedná o skriptový nástroj. "Testing1" je přidán do vašeho mapového dokumentu, protože je výstupem skriptovacího nástroje a máte ArcGIS Desktop nakonfigurovaný pro přidání výstupu skriptového nástroje do mapy.

Skript sám nepřidá váš výstup na mapu. Z tohoto důvodu při čtení řádku 176 a pokusu o přístup k vrstvě „Testing1“ neexistuje. Nebude existovat, dokud se skript nedokončí a ArcGIS Desktop nepřidá výstup nástroje skriptu do dokumentu mapy. Opět se jedná o samostatnou operaci, která se děje mimo váš skript.

Do té doby Testing1.shp existuje (nebo spíšeoutStopsexistuje), jakmile dosáhnete řádku 81. Řádky 84–92 vytvoří pole pro třídu prvků, zatímco do něj budou načtena data do konceSnaž seblok na řádku 173.

Takže ... jak to opravit ...
Budete muset použítarcpy.mappingobejít skutečnost, že vaše třída funkcí není přidána na mapu, dokud skript neopustíte.arcpy.mappingzávisí na verzi, takže napíšu ukázku, která se hodí pro 10.1-10.3.1. Tyto linky objíždějí linku 174, těsně před vašíarcpy.SelectLayerByAttribute_managementprohlášení.

mxd = arcpy.mapping.MapDocument (r "CURRENT") #Odkaz na aktuální mapový dokument. Funguje pouze tehdy, je -li otevřen ArcGIS Desktop! df = arcpy.mapping.ListDataFrames (mxd) [0] #První datový rámec v dokumentu. Buďte opatrní, pokud máte více datových rámců arcpy.RefreshCatalog () #Make sure outStops is available to create Layer addLayer = arcpy.mapping.Layer (outStops) #This doesn't add the layer to the map yet arcpy.mapping.AddLayer (df, addLayer) #To přidá vrstvu do mapy arcpy.RefreshTOC () #Updates the TOC so that layer is now Určitě available for select arcpy.RefreshActiveView () #Updates the view of the map too

Pro tebearcpy.SelectLayerByAttribute_management prohlášení, změňte to na odkaz na vaši novou vrstvu:
arcpy.SelectLayerByAttribute_management (addLayer, "NEW_SELECTION", "NumTrips> 0")


Pokud vím, neexistuje žádný životní cyklus ani nic jiného. Obvykle se to stane, pokud funkce vytvoření není zcela dokončena.

UPRAVIT:

viz správnou odpověď od @blord-castillo


1. pokus

Možná aktualizace katalogu těsně předarcpy.SelectLayerByAttribute_management ()pomáhá:

# Obnovte okno Katalog pro nový adresář arcpy.RefreshCatalog (target_folder)

2. pokus

Zkuste funkci ukončit. MožnáSnaž se:musí dokončit:

[…] #Arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("Finished!") Arcpy.AddMessage ("Váš výstup je umístěn na" + outStops) kromě CustomError: arcpy. AddError („Nepodařilo se počítat jízdy na zastávkách.“) Projít kromě: arcpy.AddError („Nepodařilo se počítat jízdy na zastávkách.“) Zvýšit arcpy.AddMessage („Kontrola curosr“) # vložte jej sem, pokud arcpy.Exists (outStops) : arcpy.SelectLayerByAttribute_management (outStops, "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("NumTrips> 0 is selected") else: arcpy.AddError ("Coundn't find" + outStops + ".")

3. pokus

Zkuste použít s-prohlášení při vyhledávání a aktualizaci kurzorů. Příklad:

s arcpy.da.UpdateCursor (fc, ['fieldA', 'fieldB']) jako kurzor: pro řádek v kurzoru: print (řádek)

Více informací zde.


Podívejte se na video: An Absolute Beginners Guide to Python GeoPandas