Bug principali nelle statistiche di ArcGIS Zonal?


25

Aggiornamento: il bug è stato corretto nella versione ArcGIS 10.4

Sto usando ArcGIS 10.2.2 per determinare le statistiche zonali per un numero di zone. Se ci sono dei NoData nel valore raster, voglio che i risultati della zona siano "NoData", esattamente come pubblicizzato dalla descrizione degli strumenti. La descrizione di questo strumento indica:

DATI - All'interno di una determinata zona, solo le celle che hanno un valore nel valore raster di input verranno utilizzate per determinare il valore di output per quella zona. Le celle NoData nel raster Value verranno ignorate nel calcolo statistico.

NODATA - All'interno di una determinata zona, se nel raster Value sono presenti celle NoData, si ritiene che non vi siano informazioni sufficienti per eseguire calcoli statistici per tutte le celle in quella zona; pertanto, l'intera zona riceverà il valore NoData sul raster di output.

Dai un'occhiata al mio setup in questa immagine: inserisci qui la descrizione dell'immagine

Sto usando l'opzione NODATA con un valore raster che ha un pixel NoData e quindi mi aspetto che il valore della zona risultante (zona 61154) sia 'NoData'. Invece, ottengo un valore di 12,74 (arrotondato a 13 nell'immagine), il che mi confonde su due livelli: in primo luogo, mi aspettavo "NoData", e in secondo luogo, il valore risultante di 12,74 è matematicamente impossibile, perché la media non può essere maggiore rispetto al valore massimo nel valore raster, che in questo caso è 10.

Se sto usando l'opzione DATA, ottengo un valore di circa 9.1, il che ha senso. Lo abbiamo testato su diversi set di dati, computer e versioni ArcGIS.

Cosa mi sto perdendo qui?

Modifica / Commento aggiuntivo: ho appena notato che l'attributo 'Count' è sbagliato anche per quella particolare zona. Esistono effettivamente 421 celle in quella zona, ma lo strumento ha contato solo 297. Calcolando 421 meno 297 si ottiene 124 - stranamente, questa è la "posizione" in cui si trova il pixel NoData, se si contano i pixel dalla parte superiore sinistra a quella inferiore proprio nella zona. Lo strumento potrebbe sbagliare il conteggio delle celle (troppo basso), il che potrebbe spiegare l'aumento della media.

Modifica: ecco un link ai dati che sto usando.

Modifica: Dan Patterson e io abbiamo fatto qualche altro debug qui sul forum ESRI.


1
Sì, produce qualcosa di folle. Nel mio caso MEAN = 537 per raster nel range (16,86). Non divertente
FelixIP

Quale valore viene utilizzato per rappresentare NoData in questo raster?
Jezibelle,

@Jezibelle: bella domanda, dove trovo una risposta affidabile? Se esporto come Ascii, è -9999. Se uso la funzione di esportazione dal menu di scelta rapida, il campo "NoData as:" - della finestra di dialogo di esportazione viene prepopolato con 2147483647. Viene generato un flag?
G-wizard

Si presenterebbe come una riga nella tabella degli attributi
Jezibelle,

1
Ho fatto un'altra modifica alla fine del mio post, dove mi collego a un post simile sul forum ESRI. Errore confermato (con una svolta). Il calcolo di "MEAN" produce solo risultati diversi / peggiori rispetto al calcolo di statistiche "ALL".
G-wizard

Risposte:


9

Esiste un bug che sembra corrispondere a quello che stai riscontrando - è registrato come BUG-000084883 - L'opzione 'Ignora NoData nei calcoli' in Zonal Statistics come strumento Table {e Zonal Statistics} non viene onorata quando spuntata, producendo risultati errati.

Si verifica con 10.3 e 10.2.2 ma non 10.1. Hai provato lo strumento con questa versione?


Sembra un buon approccio, anche se personalmente non so come eseguire versioni precedenti dello strumento. Qualcuno sa dove indicarmi di tentare questo lavoro in giro?
UdderlyAstray,

Grazie @GISGe. dove lo hai trovato? Esiste un collegamento in cui questo bug è documentato?
G-wizard

1
@ G-wizard - Ho aggiunto il link nella mia risposta. Come staff internazionale di Esri ho accesso a una descrizione più dettagliata di quella che puoi vedere, ecco come posso dirti che il bug si applica anche allo strumento Zonal Statistics e non si trova in 10.1.
GISGe

@UdderlyAstray: se si desidera eseguire una versione precedente dello strumento, è necessario installare quella versione precedente di ArcGIS.
GISGe

1
Grazie ancora, @GISGe, poiché questo è quello che sto cercando (bug ufficialmente confermato), sto contrassegnando questa risposta come quella corretta, anche se altri lo hanno confermato facendo dei test.
G-wizard

9

È un bug. Qualcosa di terribilmente sbagliato nel conteggio delle cellule.

La media corretta (9.0452380952381) volte il numero corretto di celle non vuote (420) diviso per 297 (ovvero un conteggio di celle riportato dallo strumento ) risulta in 12.7912457912458. Questa è una media errata riportata dallo strumento.

Risultati del mio test sulle griglie delle dimensioni dei giocattoli:

inserisci qui la descrizione dell'immagine


1
Confermo di avere lo stesso problema con 10.3, NODATA e "MEAN"
radouxju

Grazie ad entrambi per averlo confermato. Ma a parte le differenze nel valore medio, sbaglio nel ritenere che il risultato non dovrebbe in realtà essere un valore, ma "NODATA"? La descrizione dello strumento mi porta a crederci. Dice: "NODATA - All'interno di una determinata zona, se nel raster Value sono presenti celle NoData, si ritiene che non vi siano informazioni sufficienti per eseguire calcoli statistici per tutte le celle in quella zona; pertanto, l'intera zona riceverà il valore NoData sul raster di output ". Dato che esiste un pixel con "NODATA", anche le statistiche zonali dovrebbero essere "NODATA". Corretto?
G-wizard

2
@ G-wizard, hai ragione, come indicato nella descrizione dello strumento. un po 'analogo al # DIV / 0! in Excel.
c0ba1t,

1

Simile a un'altra risposta , sposta i dati raster in array mascherati NumPy per calcolare le tue statistiche. Supponendo due raster sovrapposti con la stessa forma, questo è semplice:

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()

Spettacoli:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.