Mais

O script ArcGIS 10.0 Python não funciona com ArcGIS 10.2.1. Loop por meio de SelectLayerByLocations

O script ArcGIS 10.0 Python não funciona com ArcGIS 10.2.1. Loop por meio de SelectLayerByLocations


No ano passado, recebi ajuda do StackExchange para escrever um script Python para ArcGIS 10.0 que faz um loop por SelectLayerByLocation com buffer até que não retorne nenhuma nova linha. Em seguida, ele usa a seleção para outros processos.

Acabamos de atualizar para ArcGIS 10.2.1 e descobri que o script não funciona mais :(

Posso ver na janela do Python que SelectLayerByLocation está em execução e a contagem aumenta, mas o processo para assim que nenhuma nova linha for retornada. Por exemplo, com os dados fictícios abaixo, obtenho ... Contagem de linhas = 16 ... Contagem de linhas = 18 ... Contagem de linhas = 18 ... Os pontos selecionados são destacados na tela, mas o processo trava nesse ponto. O script será concluído se o SelectByLocation não detectar nenhum outro site na distância (inDis2) do site selecionado (fcFarmInterest), portanto, suspeito que o problema seja o loop.

## Title: Autozone ## Function: Expandindo a seleção de sites de um determinado site. ## Versão: ArcGIS 10.0 ## Autor: Liam Mason, com assistência de dklassen @ GIS StackExchange ## Data: 5 de agosto de 2014 #Import ArcPy site package import arcpy # Substituir arquivos arcpy.env.overwriteOutput = True # Parâmetros # Workspace setting workSpace = r "C:  GIS  Autozone" # Site ID as string inSite = 'FS0501' # Distance as string inDis = '800' # Nome da camada de recurso de dados agrícolas farmData = "farms" # Localização do recorte shape shapefile clipShape = " ClippingShape "# Localização do buffer a ser salvo em outBuffer = r" C:  GIS  Autozone  Outputs  buffer.shp "# Adicione metros ao valor de distância inDis1 = inDis +" metros "# Converta o valor da distância em inteiro, multiplique por dois e, em seguida, remova uma única unidade. Converta de volta para string e adicione metros. inDis2 = str ((int (inDis) * 2) -1) + "metros" # Onde consulta, adicionando a string inSite como critério. where = '"Site_No" =' + "'% s'"% inSite # Defina a configuração do ambiente de trabalho arcpy.env.workspace = workSpace try: # Faça uma camada de feição com todas as fazendas fcFarmsAll = farmData #Selecione apenas fazendas marinhas, crie a saída e, em seguida, desmarque a seleção. fcFarmsMarine = arcpy.SelectLayerByLocation_management (fcFarmsAll, "dentro", clipShape) fcFarmsMarineOut = arcpy.CopyFeatures_management (fcFarmsMarine, r " Working  marineFarms.shp") arcpy.SelectLayerByAttribute_management (fcFarmsAll, "CLEAR_SELECTION") # Faça uma camada recurso com toda a fazendas marinhas fcFarms = arcpy.MakeFeatureLayer_management (r " Working  marineFarms.shp", "MarineFarms") #Selecione o local de interesse e crie shapefile fcFarmInterest = arcpy.Select_analysis (fcFarms, r " Working  farms_Select.shp") #Aplicar uma seleção para a camada de fazendas fcFarms1 = arcpy.SelectLayerByLocation_management (fcFarms, "WITHIN_A_DISTANCE", fcFarmInterest, inDis2) #Aplicar uma seleção adicional para a camada de fazendas fcFarms2 = arcpy.SelectLayerByLocation1, "fcFarms_DLECTO_A_DISTÊNCIA", fcFarmInterest, inDis2 " ) #Count selection initial_getCount = int (arcpy.GetCount_management (fcFarms2) .getOutput (0)) #Add one to selection count getCount = initial_getCount + 1 #Loop por meio de seleção enquanto getCo unt> initial_getCount: fcFarms3 = arcpy.SelectLayerByLocation_management (fcFarms, "WITHIN_A_DISTANCE", fcFarms2, inDis2, "ADD_TO_SELECTION") initial_getCount = getCount getCount = int (arcpy.GetCount_management (fcFarms3) .getOutput (0)) #Buffer selecção arcpy.Buffer_analysis ( fcFarms3, r " Working  farms_buffer.shp", inDis1, "FULL", "ROUND", "ALL") #Clip buffer arcpy.Clip_analysis (r " Working  farms_buffer.shp", clipShape, r " Working  buffer_clip.shp ") #Break clipped buffer into multiparts arcpy.MultipartToSinglepart_management (r"  Working  buffer_clip.shp ", r"  Working  buffer_multi.shp ") #Make uma camada de recurso para multipart buffer fcBuffer = arcpy.MakeFeatureLayer_management (r"  Working  buffer_clip.shp ") " Working  buffer_multi.shp", "BufferTemp") #Selecione a parte do buffer com o site de interesse fcBufferSelect = arcpy.SelectLayerByLocation_management (fcBuffer, "INTERSECT", fcFarmInterest) #Exportar buffer para arquivo, selecionar novamente os sites dentro deste buffer fcBuffer. CopyFeatures_management (fcBufferSelect, r " Working  buffer_sites.shp") fcBuf ferSites1 = arcpy.SelectLayerByLocation_management (fcFarms, "INTERSECT", fcBufferSites) #Buffer nova seleção, recortar, quebrar em multipartes, selecionar e extrair parte do buffer com sites arcpy.Buffer_analysis (fcBufferSites1, r ", in  WorkingDissh1_buffer1." "FULL", "ROUND", "ALL") arcpy.Clip_analysis (r " Working  farms_buffer1.shp", clipShape, r " Working  buffer_clip1.shp") arcpy.MultipartToSinglepart_management (r " Working  buffer_clip1.shp ", r"  Working  buffer_multi1.shp ") fcBuffer1 = arcpy.MakeFeatureLayer_management (r"  Working  buffer_multi1.shp "," BufferTemp ") fcBufferSelect1 = arcpy.SelectLayerByLocation_management" r "Working_segment" INTERESSE " .shp ") # Verifique a existência de buffer antigo no ArcMap antes de excluir ## if arcpy.Exists (outBuffer): ## arcpy.Delete_management (outBuffer) #Exportar o buffer final para o arquivo fcFinal = arcpy.CopyFeatures_management (fcBufferSelect1, outBuffer) # Selecione sites no buffer fcFarmsFinal = arcpy.SelectLayerByLocation_management (fcFarmsAll, "INTERSECT", o utBuffer) #Excluir arquivos de trabalho arcpy.Delete_management (r " Working  farms_buffer.shp") arcpy.Delete_management (r " Working  farms_buffer1.shp") arcpy.Delete_management (r " Working  buffer_clip.shp") arcpy. Delete_management (r " Working  buffer_clip1.shp") arcpy.Delete_management (r " Working  buffer_multi.shp") arcpy.Delete_management (r " Working  buffer_multi1.shp") arcpy.Delete_management (r " Working  farms_Select .shp ") arcpy.Delete_management (r"  Working  buffer_sites.shp ") arcpy.Delete_management (r"  Working  marineFarms.shp ") exceto: print arcpy.GetMessages ()

Por meio de testes e tentativa e erro, descobri que não é o loop, mas a função de dissolução dentro do buffer - se você remover ALL dos buffers, funciona.

Preciso que os buffers se dissolvam, então levantarei como um problema separado.


Assista o vídeo: Mastering ArcGIS Expressions with Python, Arcade, and SQL