As estatísticas zonais 2 acabam causando um erro fatal. Existe uma alternativa?

Aug 19 2020

Eu mudei recentemente para usar a ferramenta suplementar "estatísticas zonais como tabela 2" em vez das "estatísticas zonais" regulares porque tenho polígonos sobrepostos com os quais as estatísticas zonais não lidam. No entanto, tentei executar as estatísticas zonais 2 algumas vezes e, depois de executá-las por muitas horas durante a noite, acabei encontrando um erro fatal e não foi concluído. Não tenho certeza de como melhorar esse problema. Estou tentando calcular a elevação média em mais de 100.000 polígonos de buffer e precisarei fazer isso várias vezes com outras camadas raster. Existe uma alternativa ou uma maneira de obter a ferramenta para concluir o comando?

Respostas

2 FelixIP Aug 19 2020 at 06:59

Para resolver isso, você precisará dividir seus polígonos em grupos sem sobreposição. É chamado de coloração de grafos .

Para fazer o script abaixo funcionar a) instale o pacote networkx e b) execute:

PolygonNeighbors("POLYGONS", "neighbours", area_overlap="AREA_OVERLAP")

Roteiro:

'''
creates non-adjacent groups of polygons
'''
import arcpy
import networkx as nx
infc = arcpy.GetParameterAsText(0)
table = arcpy.GetParameterAsText(1)

sourceList=[f.name for f in arcpy.ListFields(table)]
FTO=sourceList[1:3]
fromto=arcpy.da.TableToNumPyArray(table,FTO)
try:arcpy.AddField_management(infc, "COLOR","Short")
except:pass
G=nx.Graph()
G.add_edges_from(fromto)

allGroups=sorted(nx.connected_components(G), key = len, reverse=True)

arcpy.AddMessage("%i connected groups found" %len(allGroups))
D={}
for item in allGroups:
    arcpy.AddMessage(len(item))
    subG=G.subgraph(item)
    d = nx.coloring.greedy_color(subG, strategy=nx.coloring.strategy_largest_first)
    D.update(d)
    with arcpy.da.UpdateCursor(infc,("OID@","COLOR")) as cursor:
        for row in cursor:
            if row[0] not in item:continue
            row[1]=D[row[0]]+1
            cursor.updateRow(row)
arcpy.AddMessage("Done")

irá adicionar e preencher o campo "COLOR" com números no intervalo (1..4). Este é um intervalo teórico, espere algo maior, dependendo da extensão das sobreposições. Eu diria que o pior cenário é de 7 cores. Você pode codificar a classe de recurso de entrada (infc) e a tabela de adjacência (tabela) se não quiser atribuir script à ferramenta com 2 parâmetros.

Observe que o script ignora os polígonos da ilha, isso resultará em nenhum ou valor 0 no campo COLOR, dependendo da origem da classe de recurso:

Você tem algumas opções de como proceder:

  1. defina manualmente n camadas de POLÍGONOS usando consultas de definição, por exemplo, "COLOR" = 1, execute estatísticas zonais em cada uma. Mesclar resultados.
  2. Escreva um script ou desenvolva um modelo para automatizar as tarefas acima.

Eu suspeito que isso é exatamente o que as estatísticas zonais 2 fazem nos bastidores, não tenho certeza por que está falhando, a menos que você tenha bagunçado a extensão do processamento e as configurações do ambiente de tamanho da célula ou use projeções diferentes em raster e buffers.