Suite

Quel est le cycle de vie du script ArcPy dans ArcGIS ?

Quel est le cycle de vie du script ArcPy dans ArcGIS ?


Dans le code ci-dessous juste avant learcpy.AddMessage("Terminé !")déclaration J'ai utilisé une requête de sélection. Le problème est que le fichier de formes récemment créé Testing1 dans lequel je lance la requête est incapable de localiser Testing1.

La raison pour laquelle il n'a pas pu localiser Testing1 était qu'il n'était pas présent dans la table des matières. Mais lorsque je supprime la requête de sélection, le code fonctionne correctement et Testing1 est affiché dans la table des matières.

Pourquoi donc ?

Y a-t-il un cycle de vie après la fin du script qui permet au fichier de formes Testing1 d'être affiché sur la table des matières ?

Si tel est le cas, comment puis-je l'ajouter pour que ma requête de sélection fonctionne ?

##################################################### ############################ ## Nom de l'outil : BetterBusBuffers - Compter les trajets aux arrêts ## Créé par : Melinda Morang, Esri, [email protected] .com ## Dernière mise à jour : 4 avril 2014 ######################################## ######################################"BetterBusBuffers - Compter les trajets aux arrêts BetterBusBuffers fournit une mesure quantitative de l'accès aux transports en commun dans votre ville en comptant la fréquence des trajets en transports en commun à divers endroits. L'outil Compter les trajets aux arrêts crée une classe d'entités de vos arrêts GTFS et compte le nombre de trajets qui visitent chacun d'eux au cours d'une fenêtre de temps ainsi que le nombre de trajets par heure et le temps maximum entre les trajets suivants au cours de cette fenêtre de temps."import arcpy import BBB_SharedFunctions class CustomError(Exception): pass try: # ------ Obtenez les paramètres d'entrée et configurez les choses. ----- essayez : # Chemin de la classe d'entités en sortie des arrêts GTFS. # Doit être une classe d'entités de géodatabase fichier, pas un fichier de formes. outStops = arcpy.GetParameterAsText(0) # Base de données SQL GTFS - doit être créée à l'avance. SQLDbase = "C:/Users/Gurminder/Desktop/sir/temp.sql" #arcpy.GetParameterAsText(1) BBB_SharedFunctions.ConnectToSQLDatabase(SQLDbase) # Fenêtre de jour et d'heure à analyser DayOfWeek = arcpy.GetParameterAsText(2) # Fin inférieure de fenêtre de temps (HH:MM en 24 heures) start_time = arcpy.GetParameterAsText(3) # L'heure de début par défaut est minuit s'ils la laissent vide. if start_time == "": start_time = "00:00" # Convertir en secondes start_sec = BBB_SharedFunctions.parse_time(start_time + ":00") # Fin supérieure de la fenêtre de temps (HH:MM en 24 heures) end_time = arcpy .GetParameterAsText(4) # L'heure de fin par défaut est 23h59 s'ils la laissent vide. if end_time == "": end_time = "23:59" # Convertir en secondes end_sec = BBB_SharedFunctions.parse_time(end_time + ":00") # Calculerons-nous le temps d'attente max ? Cela ralentit le calcul, alors laissez-le facultatif. CalcWaitTime = arcpy.GetParameterAsText(5) # L'utilisateur souhaite-t-il compter les arrivées ou les départs aux arrêts ? DepOrArrChoice = arcpy.GetParameterAsText(6) if DepOrArrChoice == "Arrivals": DepOrArr = "arrival_time" elif DepOrArrChoice == "Departures": DepOrArr = "departure_time" # Déterminez quelle version d'ArcGIS ils exécutent ArcGetInfoInfo = arcpy ("desktop") ArcVersion = ArcVersionInfo['Version'] except: arcpy.AddError("Error getting user input.") raise # ----- Créer une classe d'entités d'arrêts et ajouter des champs pour le nombre de trajets en transport en commun --- --- L'itération #TODO peut être effectuée ici, essayez : arcpy.AddMessage("Création d'une classe d'entités d'arrêts GTFS… ") # Créez une classe d'entités d'arrêts de transport en commun outStops, StopIDList = BBB_SharedFunctions.MakeStopsFeatureClass(outStops) # Ajoutez un champ au fichier de sortie pour le nombre de trajets, le nombre de trajets / heure et le temps d'attente maximal si ".shp" dans outStops : # Les fichiers de formes ne peuvent pas avoir de noms de champ longs arcpy.management.AddField(outStops, "NumTrips", "SHORT") arcpy .management.AddField(outStops, "TripsPerHr", "DOUBLE") arcpy.management.AddField(outStops, "MaxWaitTm", "SHORT") el se: arcpy.management.AddField(outStops, "NumTrips", "SHORT") arcpy.management.AddField(outStops, "NumTripsPerHr", "DOUBLE") arcpy.management.AddField(outStops, "MaxWaitTime", "SHORT") sauf : arcpy.AddError("Erreur lors de la création de la classe d'entités des arrêts GTFS.") raise #----- Interrogez les données GTFS pour compter les trajets à chaque arrêt ----- essayez : arcpy.AddMessage("Calcul du nombre des trajets en transit disponibles pendant la fenêtre de temps… ") # Obtenez un dictionnaire de {stop_id: [[trip_id, stop_time]]} pour notre fenêtre de temps stoptimedict = BBB_SharedFunctions.CountTripsAtStops(DayOfWeek, start_sec, end_sec, DepOrArr) # TODO exécuter 24 fois pour créer 24 fichiers de formes pour lundi samedi dimanche # Solution créer 24 variables stoptimedict avec différents paramètres start_sec et end_sec sauf : arcpy.AddError("Erreur de comptage des arrivées ou des départs à l'arrêt pendant la fenêtre de temps.") raise # ----- Écrire dans la sortie ----- essayez: arcpy.AddMessage("Writing output data… ") # Créez un curseur de mise à jour pour ajouter numtrips, trips/hr et maxwaittime pour s'arrêter si ArcVersion == "10.0": si ".shp" dans outStops : ucursor = arcpy.UpdateCursor(outStops, "", "", "stop_id; Nombre de voyages ; Trajets par heure ; MaxWaitTm") #TODO tous les fichiers de formes doivent itérer ici pour la ligne dans ucursor : NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedFunctions.RetrieveStatsForSetOfStops( [str(row.getValue("sec enddict_), Calm)], stoptime row.NumTrips = NumTrips row.TripsPerHr = NumTripsPerHr if MaxWaitTime == None : row.MaxWaitTm = -1 else : row.MaxWaitTm = MaxWaitTime ucursor.updateRow(row) else : ucursor = arcpy.UpdateCursor(outStops, "", " , "stop_id; NumTrips; NumTripsPerHr; MaxWaitTime") pour la ligne dans ucursor : NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedFunctions.RetrieveStatsForSetOfStops( [str (sec(row.getdict")], stoptime_id, Cal ("stop_id,) ) row.NumTrips = NumTrips row.NumTripsPerHr = NumTripsPerHr row.MaxWaitTime = MaxWaitTime ucursor.updateRow(row) else : # Pour tout 10.1 et en avant si ".shp" dans outStops : ucursor = arcpy.da.UpdateCursor [(outStops, stop_id", "NumTrips", "TripsPerHr", "MaxWaitTm"]) else : ucu rsor = arcpy.da.UpdateCursor(outStops, ["stop_id", "NumTrips", "NumTripsPerHr", "MaxWaitTime"]) pour la ligne dans ucursor : NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedOstrrows. [0])], stoptimedict, CalcWaitTime, start_sec, end_sec) row[1] = NumTrips row[2] = NumTripsPerHr if ".shp" dans outStops et MaxWaitTime == None : row[3] = -1 else : row[ 3] = MaxWaitTime ucursor.updateRow(ligne) sauf : arcpy.AddError("Erreur d'écriture dans la sortie.") raise arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", " NumTrips > 0 ") arcpy.AddMessage("Terminé ! ") arcpy.AddMessage("Votre sortie est située à " + outStops) sauf CustomError : arcpy.AddError("Impossible de compter les trajets aux arrêts.") pass sauf : arcpy.AddError("Impossible de compter les trajets aux arrêts.") raise arcpy.AddMessage("Vérification du curseur")

Le problème ici est qu'il s'agit d'un outil de script. "Testing1" est ajouté à votre carte car il s'agit de la sortie de l'outil de script et vous avez configuré ArcGIS Desktop pour ajouter la sortie de l'outil de script à la carte.

Le script lui-même n'ajoute pas votre sortie à la carte. Pour cette raison, lorsque vous lisez la ligne 176 et essayez d'accéder à la couche "Testing1", elle n'existe pas. Il n'existera pas tant que le script n'aura pas terminé son exécution et qu'ArcGIS Desktop ajoute la sortie de l'outil de script à votre carte. Encore une fois, il s'agit d'une opération distincte qui se produit en dehors de votre script.

En attendant, Testing1.shp existe (ou plutôtles arrêtsexiste) une fois que vous atteignez la ligne 81. Les lignes 84-92 créent les champs pour la classe d'entités tandis que les données y sont chargées à la fin de laessayerbloc à la ligne 173.

Alors… comment y remédier…
Vous devrez utiliserarcpy.mappingpour contourner le fait que votre classe d'entités n'est pas ajoutée à la carte tant que vous n'avez pas quitté le script.arcpy.mappingest assez dépendant de la version, je vais donc écrire un exemple qui convient à 10.1-10.3.1. Ces lignes contournent la ligne 174, juste avant votrearcpy.SelectLayerByAttribute_managementdéclaration.

mxd = arcpy.mapping.MapDocument(r"CURRENT") #Référence à la carte actuelle. Ne fonctionne que si ArcGIS Desktop est ouvert ! df = arcpy.mapping.ListDataFrames(mxd)[0] #Première trame de données dans le document. Soyez prudent si vous avez plusieurs dataframes arcpy.RefreshCatalog() #Assurez-vous que outStops est disponible pour créer Layer addLayer = arcpy.mapping.Layer(outStops) #Cela n'ajoute pas encore la couche à la carte arcpy.mapping.AddLayer(df, addLayer) #Cela ajoute la couche à la carte arcpy.RefreshTOC() #Mise à jour la table des matières afin que cette couche soit désormais définitivement disponible pour la sélection arcpy.RefreshActiveView() #Mise également à jour la vue de la carte

Pour votreinstruction arcpy.SelectLayerByAttribute_management, remplacez-le par celui-ci pour référencer votre nouveau calque :
arcpy.SelectLayerByAttribute_management(addLayer, "NEW_SELECTION", "NumTrips > 0")


Autant que je sache, il n'y a pas de cycle de vie ou quoi que ce soit d'autre. Cela se produit généralement si la fonction de création n'est pas totalement terminée.

ÉDITER:

voir la bonne réponse de @blord-castillo


1er essai

Peut-être un rafraîchissement du catalogue juste avant laarcpy.SelectLayerByAttribute_management()aide:

# Rafraîchir la fenêtre Catalogue pour le nouveau répertoire arcpy.RefreshCatalog(target_folder)

2ème essai

Essayez de mettre la fonction à la fin. Peut-être leessayer:doit finir :

[… ] #arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", " NumTrips > 0 ") arcpy.AddMessage("Finished!") arcpy.AddMessage("Votre sortie est située à " + outStops) sauf CustomError: arcpy. AddError("Impossible de compter les trajets aux arrêts.") pass except: arcpy.AddError("Impossible de compter les trajets aux arrêts.") raise arcpy.AddMessage("Vérification curosr") # l'insérer ici si 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ème essai

Essayez d'utiliser avec-instructions pendant qu'il recherche et met à jour les curseurs. Exemple:

avec arcpy.da.UpdateCursor(fc, ['fieldA', 'fieldB']) comme curseur : pour la ligne dans le curseur : print(row)

Plus d'informations ici.


Voir la vidéo: 1 - Intro - ArcGIS Pro Scripting with Python and Arcpy