Grande erro nas estatísticas zonais do ArcGIS?

25

Atualização: O bug foi corrigido na versão do ArcGIS 10.4

Estou usando o ArcGIS 10.2.2 para determinar estatísticas zonais para várias zonas. Se houver algum NoData na varredura de valor, quero que os resultados da zona sejam "NoData", exatamente como anunciado pela descrição das ferramentas. Esta descrição da ferramenta declara:

DADOS - Dentro de qualquer zona específica, apenas as células que possuem um valor na varredura Value de entrada serão usadas para determinar o valor de saída para essa zona. As células NoData na varredura Value serão ignoradas no cálculo estatístico.

NODATA - Dentro de qualquer zona específica, se existir alguma célula NoData na varredura Value, considera-se que há informações insuficientes para executar cálculos estatísticos para todas as células nessa zona; portanto, a zona inteira receberá o valor NoData na varredura de saída.

Por favor, dê uma olhada na minha configuração nesta imagem: insira a descrição da imagem aqui

Estou usando a opção NODATA com uma varredura de valor que possui um pixel NoData e, portanto, espero que o valor da zona resultante (zona 61154) seja 'NoData'. Em vez disso, recebo um valor de 12,74 (arredondado para 13 na imagem), o que me confunde em dois níveis: primeiro, eu esperava 'NoData' e, segundo, o valor resultante de 12,74 é matematicamente impossível, porque a média não pode ser maior que o valor máximo na varredura de valor, que é 10 neste caso.

Se eu estiver usando a opção DADOS, recebo um valor de cerca de 9,1, o que faz sentido. Testamos isso em diferentes conjuntos de dados, computadores e versões do ArcGIS.

O que estou perdendo aqui?

Editar / Comentário adicional: Acabei de notar que o atributo 'Count' também está errado para essa zona específica. De fato, existem 421 células nessa zona, mas a ferramenta contava apenas 297. O cálculo de 421 menos 297 resulta em 124 - curiosamente, essa é a "posição" em que o pixel NoData está localizado, se contarmos os pixels do canto superior esquerdo para o inferior bem na zona. A ferramenta pode estar com erros na contagem de células (muito baixa), o que pode explicar o aumento da média.

Edit: Aqui está um link para os dados que estou usando.

Edit: Dan Patterson e eu fizemos algumas depurações adicionais aqui no fórum da ESRI.

G-wizard
fonte
1
Sim, produz algo louco. No meu caso, MEAN = 537 para raster no intervalo (16,86). Não é engraçado
FelixIP
Qual valor é usado para representar o NoData nesta varredura?
precisa saber é o seguinte
@Jezibelle: Boa pergunta, onde encontro uma resposta confiável? Se eu exportar como Ascii, é -9999. Se eu usar a função de exportação no menu de contexto, o campo "NoData as:" - da caixa de diálogo de exportação será pré-preenchido com 2147483647. Isso gera um sinalizador?
G-bruxo
Ele iria mostrar-se como uma linha na tabela de atributos
Jezibelle
1
Fiz outra edição no final do meu post, onde faço o link para um post semelhante no fórum da ESRI. Erro confirmado (com um toque). O cálculo de "MEAN" produz apenas resultados diferentes / piores do que o cálculo de estatísticas de "ALL".
G-wizard

Respostas:

9

Existe um erro que parece corresponder ao que você está enfrentando - ele está registrado como BUG-000084883 - A opção 'Ignorar dados não calculados nos cálculos' no Zonal Statistics como ferramenta de tabela {e Zonal Statistics tool} não é respeitada quando desmarcada, produzindo resultados incorretos.

Ocorre com 10.3 e 10.2.2, mas não com 10.1. Você tentou a ferramenta com esta versão?

GISGe
fonte
Parece uma boa abordagem, embora eu pessoalmente não saiba como executar versões mais antigas da ferramenta. Alguém sabe para onde me apontar para tentar esse trabalho?
UdderlyAstray
Obrigado @GISGe. Onde você achou isso? Existe um link onde este bug está documentado?
G-wizard
1
@ G-wizard - adicionei o link na minha resposta. Como equipe internacional da Esri, tenho acesso a uma descrição mais detalhada do que você pode ver, é assim que posso dizer que o bug também se aplica à ferramenta Zonal Statistics e não é encontrado na versão 10.1.
precisa saber é
@UdderlyAstray - se você deseja executar uma versão mais antiga da ferramenta, é necessário instalar essa versão mais antiga do ArcGIS.
GISGe
1
Mais uma vez obrigado, @GISGe, como é isso que estou procurando (bug oficialmente confirmado), estou marcando essa resposta como a correta, embora outros também tenham confirmado isso fazendo testes.
G-wizard
9

Isso é um bug. Algo terrivelmente errado com a contagem de células.

A média correta (9,0452380952381) vezes o número correto de células não vazias (420) dividido por 297 (que é uma contagem de células relatada pela ferramenta ) resulta em 12.7912457912458. Essa é uma média incorreta relatada pela ferramenta.

Resultados do meu próprio teste de grades de tamanho de brinquedo:

insira a descrição da imagem aqui

FelixIP
fonte
1
Confirmo que tenho o mesmo problema com 10.3, NODATA e "MEAN"
radouxju 17/08/2015
Obrigado a ambos por confirmar isso. Mas as diferenças no valor médio à parte, estou errado ao supor que o resultado não deve realmente ter nenhum valor, mas 'NODATA'? A descrição da ferramenta me leva a acreditar nisso. Diz: "NODATA - Dentro de qualquer zona específica, se existir alguma célula NoData na varredura Value, considera-se que há informações insuficientes para executar cálculos estatísticos para todas as células nessa zona; portanto, toda a zona receberá o valor NoData na varredura de saída ". Como existe um pixel com "NODATA", as estatísticas das zonas também devem ser "NODATA '. Correto?
G-wizard
2
@ G-wizard, você está correto, como indicado na Descrição da Ferramenta. um pouco análogo ao # DIV / 0! no excel.
C0ba1t 17/08/2015
1

Semelhante a outra resposta , mova os dados de varredura para as matrizes mascaradas do NumPy para calcular suas estatísticas. Supondo duas rasters sobrepostas com a mesma forma, isso é simples:

import numpy as np
zones = arcpy.RasterToNumPyArray("zones")
value = np.ma.masked_equal(arcpy.RasterToNumPyArray("value"),
                           arcpy.Raster("value").noDataValue)
print("Zone\tCount\tNoData\tMean")
for z in np.unique(zones):
    sel = (zones == z)
    print z, sel.sum(), value.mask[sel].sum(), value[sel].mean()

Shows:

Zone    Count   NoData  Mean
61131   53   0   8.92452830189
61154   421   1   9.04523809524
61207   1   0   8.0
61317   35   0   7.2
61644   644   0   7.90838509317
61677   12   0   7.41666666667
61789   7   0   9.0
61871   193   0   7.98445595855
187472   349   0   8.5787965616
Mike T
fonte