Mais

Qual é o ciclo de vida do script ArcPy no ArcGIS?

Qual é o ciclo de vida do script ArcPy no ArcGIS?


No código abaixo, antes dearcpy.AddMessage ("Concluído!")declaração Eu usei uma consulta de seleção. O problema é que o arquivo de forma Testing1 recém-criado, no qual estou disparando a consulta, não consegue localizar Testing1.

O motivo pelo qual não foi possível localizar Testing1 é que ele não estava presente no índice analítico. Mas quando eu removo a consulta de seleção, o código funciona bem e Testing1 é mostrado no índice analítico.

Por quê então?

Existe um ciclo de vida após o final do script que permite que o shapefile Testing1 seja exibido no índice?

Se houver, como posso anexar isso para fazer minha consulta de seleção funcionar?

############################################################### ################################### ## Nome da ferramenta: BetterBusBuffers - Contagem de viagens nas paradas ## Criado por: Melinda Morang, Esri, mmorang @ esri .com ## Última atualização: 4 de abril de 2014 ############################################### ################################################ "BetterBusBuffers - Contagem de viagens nas paradas BetterBusBuffers fornece uma medida quantitativa de acesso para o transporte público em sua cidade contando a frequência de viagem de transporte público em vários locais. A ferramenta Contar viagens nas paradas cria uma classe de recurso de suas paradas GTFS e conta o número de viagens que visitam cada uma durante uma janela de tempo, bem como o número de viagens por hora e o tempo máximo entre viagens subsequentes durante essa janela de tempo. "import arcpy import BBB_SharedFunctions class CustomError (Exception): pass try: # ------ Obtenha os parâmetros de entrada e configure as coisas. ----- try: # Caminho para classe de recurso de saída de paradas GTFS. # Deve ser uma classe de recurso de banco de dados geográfico de arquivo, não um arquivo de forma. outStops = arcpy.GetParameterAsText (0) # GTFS SQL dbase - deve ser criado com antecedência. SQLDbase = "C: /Users/Gurminder/Desktop/sir/temp.sql" # arcpy.GetParameterAsText (1) BBB_SharedFunctions.ConnectToSQLDatabase (SQLDbase) # Janela de dia e hora para analisar DayOfWeek = arcpy.GetParameterAsText (2) # Lower end of janela de tempo (HH: MM em formato de 24 horas) start_time = arcpy.GetParameterAsText (3) # A hora de início padrão é meia-noite se for deixada em branco. if start_time == "": start_time = "00:00" # Converter em segundos start_sec = BBB_SharedFunctions.parse_time (start_time + ": 00") # Fim superior da janela de tempo (HH: MM em 24 horas) end_time = arcpy .GetParameterAsText (4) # O horário de término padrão é 23:59 se eles deixarem em branco. if end_time == "": end_time = "23:59" # Converter para segundos end_sec = BBB_SharedFunctions.parse_time (end_time + ": 00") # Iremos calcular o tempo máximo de espera? Isso retarda o cálculo, portanto, deixe-o opcional. CalcWaitTime = arcpy.GetParameterAsText (5) # O usuário deseja contar as chegadas ou partidas nas paradas? DepOrArrChoice = arcpy.GetParameterAsText (6) if DepOrArrChoice == "Chegadas": DepOrArr = "Arrival_time" elif DepOrArrChoice == "Partidas": DepOrArr = "departure_time" # Descobrir qual versão do ArcGIS eles estão executando ArcVersionInfo = arcpy.GetInfo = arcpy.Get ("desktop") ArcVersion = ArcVersionInfo ['Version'] exceto: arcpy.AddError ("Erro ao obter entradas do usuário.") raise # ----- Criar uma classe de recurso de paradas e adicionar campos para contagens de viagens de transporte público --- --- #TODO itteração pode ser feita aqui, tente: arcpy.AddMessage ("Criando classe de recurso de paradas GTFS…") # Crie uma classe de recurso de paradas de trânsito outStops, StopIDList = BBB_SharedFunctions.MakeStopsFeatureClass (outStops) # Adicione um campo ao arquivo de saída para número de viagens, número de viagens / hora e tempo máximo de espera se ".shp" em outStops: # Shapefiles não podem ter nomes de campo longos 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") exceto: arcpy.AddError ("Erro ao criar classe de recurso de paradas GTFS.") raise # ----- Consultar os dados GTFS para contar as viagens em cada parada ----- try: arcpy.AddMessage ("Calculating the number de viagens de transporte público disponíveis durante a janela de tempo… ") # Obtenha um dicionário de {stop_id: [[trip_id, stop_time]]} para nossa janela de tempo stoptimedict = BBB_SharedFunctions.CountTripsAtStops (DayOfWeek, start_sec, end_sec, DepOrArr) # TODO executado 24 vezes para criar 24 shapefile para segunda-feira, sábado, domingo # Solução criar 24 variáveis ​​stoptimedict com diferentes parâmetros start_sec e end_sec, exceto: arcpy.AddError ("Erro ao contar chegadas ou partidas na parada durante a janela de tempo.") raise # ----- Gravar na saída ----- try: arcpy.AddMessage ("Writing output data…") # Crie um cursor de atualização para adicionar numtrips, trips / hr e maxwaittime para parar se ArcVersion == "10.0": if ".shp" em outStops: ucursor = arcpy.UpdateCursor (outStops, "", "", "stop_id; NumTrips; TripsPerHr; MaxWaitTm ") #TODO todos os shapefiles devem itterar aqui para a linha em ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedFunctions.RetrieveStatsForSetOfStops ([str (row.gettimValue, start_secict," stop_id) ("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" (ucursor = arcpy.UpdateCursor " , "stop_id; NumTrips; NumTripsPerHr; MaxWaitTime") para a linha em ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime = \_SharedFunctions.RetrieveStatsForSetOfStops ([str (row.get_devalor_de_interrupção) ) row.NumTrips = NumTrips row.NumTripsPerHr = NumTripsPerHr row.MaxWaitTime = MaxWaitTime ucursor.updateRow (row) else: # Para tudo 10.1 e para a frente se ".shp" em outStops: ucursor = arcops.da.UpdateCursor ( stop_id "," NumTrips "," TripsPerHr "," MaxWaitTm "]) else: ucu rsor = arcpy.da.UpdateCursor (outStops, ["stop_id", "NumTrips", "NumTripsPerHr", "MaxWaitTime"]) para linha em ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBBStorSharedFunctions [strops._SoretOfunctions [0])], stoptimedict, CalcWaitTime, start_sec, end_sec) row [1] = NumTrips row [2] = NumTripsPerHr if ".shp" em outStops e MaxWaitTime == None: row [3] = -1 else: row [ 3] = MaxWaitTime ucursor.updateRow (row) exceto: arcpy.AddError ("Erro ao gravar na saída.") Raise arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("Concluído! ") arcpy.AddMessage (" Sua saída está localizada em "+ outStops), exceto CustomError: arcpy.AddError (" Falha ao contar viagens nas paradas. ") passar exceto: arcpy.AddError (" Falha ao contar viagens nas paradas. ") raise arcpy.AddMessage ("Checking curosr")

O problema aqui é que esta é uma ferramenta de script. "Testing1" é adicionado ao seu documento de mapa porque é a saída da ferramenta de script e você tem o ArcGIS Desktop configurado para adicionar a saída da ferramenta de script ao mapa.

O próprio script não adiciona sua saída ao mapa. Por causa disso, quando você lê a linha 176 e tenta acessar a camada "Testing1", ela não existe. Ele não existirá até que o script termine de ser executado e o ArcGIS Desktop adicione a saída da ferramenta de script ao seu documento de mapa. Novamente, esta é uma operação separada que ocorre fora do seu script.

Nesse ínterim, Testing1.shp existe (ou melhor,outStopsexiste) assim que você alcançar a linha 81. As linhas 84-92 criam os campos para a classe de feição enquanto os dados são carregados nela no final doexperimentarbloquear na linha 173.

Então ... como consertar isso ...
Você terá que usararcpy.mappingpara contornar o fato de que sua classe de feição não é adicionada ao mapa até que você saia do script.arcpy.mappingé bastante dependente da versão, então vou escrever um exemplo que se encaixa para 10.1-10.3.1. Essas linhas giram em torno da linha 174, pouco antes de suaarcpy.SelectLayerByAttribute_managementdemonstração.

mxd = arcpy.mapping.MapDocument (r "CURRENT") #Referência ao documento de mapa atual. Só funciona se o ArcGIS Desktop estiver aberto! df = arcpy.mapping.ListDataFrames (mxd) [0] #Primeiro dataframe no documento. Tenha cuidado se você tiver vários dataframes arcpy.RefreshCatalog () # Certifique-se de que outStops esteja disponível para criar a camada addLayer = arcpy.mapping.Layer (outStops) #Isso não adiciona a camada ao mapa ainda arcpy.mapping.AddLayer (df, addLayer) #Isso adiciona a camada ao mapa arcpy.RefreshTOC () #Atualiza o TOC para que a camada esteja definitivamente disponível para selecionar arcpy.RefreshActiveView () #Atualiza a visualização do mapa também

Para o seudeclaração arcpy.SelectLayerByAttribute_management, altere-o para fazer referência a sua nova camada:
arcpy.SelectLayerByAttribute_management (addLayer, "NEW_SELECTION", "NumTrips> 0")


Pelo que eu sei, não há ciclo de vida ou qualquer outra coisa. Normalmente, isso acontece se a função de criação não estiver totalmente concluída.

EDITAR:

veja a resposta correta de @blord-castillo


1ª tentativa

Talvez uma atualização do catálogo um pouco antes doarcpy.SelectLayerByAttribute_management ()ajuda:

# Atualize a janela do Catálogo para o novo diretório arcpy.RefreshCatalog (target_folder)

2ª tentativa

Tente colocar a função no final. Talvez oexperimentar:tem que terminar:

[…] # Arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("Finished!") Arcpy.AddMessage ("Sua saída está localizada em" + outStops) exceto CustomError: arcpy. AddError ("Falha ao contar viagens nas paradas.") Passar exceto: arcpy.AddError ("Falha ao contar viagens nas paradas.") Raise arcpy.AddMessage ("Checking curosr") # insira-o aqui se arcpy.Exists (outStops) : arcpy.SelectLayerByAttribute_management (outStops, "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("NumTrips> 0 está selecionado") else: arcpy.AddError ("Coundn't find" + outStops + ".")

3ª tentativa

Tente usar com-declarações à medida que procura e atualiza os cursores. Exemplo:

com arcpy.da.UpdateCursor (fc, ['fieldA', 'fieldB']) como cursor: para linha no cursor: imprimir (linha)

Mais informações aqui.


Assista o vídeo: Just how easy is Python programming in ArcGIS Pro? You only need 7+2 commands for this tool!