Schwerer Fehler in der ArcGIS Zonal-Statistik?

25

Update: Der Fehler wurde in ArcGIS 10.4 behoben

Ich verwende ArcGIS 10.2.2, um Zonenstatistiken für eine Reihe von Zonen zu ermitteln. Wenn das Wert-Raster NoData enthält, sollen die Zonenergebnisse "NoData" lauten, genau wie in der Beschreibung der Tools angegeben. Diese Werkzeugbeschreibung lautet:

DATEN - In einer bestimmten Zone werden nur Zellen mit einem Wert im Eingabewert-Raster zur Bestimmung des Ausgabewerts für diese Zone verwendet. NoData-Zellen im Wert-Raster werden in der Statistikberechnung ignoriert.

NODATA - Wenn in einer bestimmten Zone NoData-Zellen im Wert-Raster vorhanden sind, wird davon ausgegangen, dass nicht genügend Informationen vorhanden sind, um statistische Berechnungen für alle Zellen in dieser Zone durchzuführen. Daher erhält die gesamte Zone den NoData-Wert im Ausgabe-Raster.

Bitte schauen Sie sich mein Setup in diesem Bild an: Bildbeschreibung hier eingeben

Ich verwende die Option NODATA mit einem Werteraster mit einem NoData-Pixel und erwarte daher, dass der resultierende Zonenwert (Zone 61154) 'NoData' ist. Stattdessen erhalte ich einen Wert von 12,74 (im Bild auf 13 gerundet), was mich auf zwei Ebenen verwirrt: Erstens habe ich 'NoData' erwartet, und zweitens ist der resultierende Wert von 12,74 mathematisch unmöglich, da der Mittelwert nicht größer sein kann als der Maximalwert im Werteraster, in diesem Fall 10.

Wenn ich die Option DATA verwende, erhalte ich einen Wert von ungefähr 9,1, was sinnvoll ist. Wir haben dies auf verschiedenen Datasets, Computern und ArcGIS-Versionen getestet.

Was vermisse ich hier?

Bearbeiten / Zusätzlicher Kommentar: Ich habe gerade bemerkt, dass das Attribut 'Count' auch für diese bestimmte Zone falsch ist. Es gibt tatsächlich 421 Zellen in dieser Zone, aber das Werkzeug hat nur 297 gezählt. Die Berechnung von 421 minus 297 ergibt 124 - seltsamerweise ist dies die "Position", an der sich das NoData-Pixel befindet, wenn man die Pixel von oben links nach unten zählt direkt in der Zone. Das Tool zeigt möglicherweise eine falsche (zu niedrige) Zellenzahl an, was den Anstieg des Durchschnitts erklären kann.

Bearbeiten: Hier ist ein Link zu den Daten, die ich verwende.

Edit: Dan Patterson und ich haben hier im ESRI-Forum ein weiteres Debugging durchgeführt .

G-Wizard
quelle
1
Ja, es produziert etwas Verrücktes. In meinem Fall MEAN = 537 für Raster in Range (16,86). Nicht lustig
FelixIP
Welcher Wert wird zur Darstellung von NoData in diesem Raster verwendet?
Jezibelle,
@Jezibelle: Gute Frage, wo finde ich eine verlässliche Antwort? Wenn ich als ASCII exportiere, ist es -9999. Wenn ich die Exportfunktion aus dem Kontextmenü verwende, wird das Feld "NoData as:" des Exportdialogs mit 2147483647 vorbelegt. Hebt das ein Flag?
G-Wizard
Es würde als Zeile in der Attributtabelle erscheinen
Jezibelle
1
Ich habe am Ende meines Beitrags eine weitere Bearbeitung vorgenommen, bei der ich auf einen ähnlichen Beitrag im ESRI-Forum verweise. Fehler bestätigt (mit einem Twist). Die Berechnung von "MEAN" liefert nur andere / schlechtere Ergebnisse als die Berechnung von "ALL" -Statistiken.
G-Wizard

Antworten:

9

Es gibt einen Fehler, der dem zu entsprechen scheint, was Sie gerade erleben. Er ist als BUG-000084883 registriert. Die Option "NoData in Berechnungen ignorieren" in Zonal Statistics als Tabellen-Tool {und Zonal Statistics-Tool} wird nicht berücksichtigt, wenn das Kontrollkästchen deaktiviert ist falsche Ergebnisse.

Es tritt mit 10.3 und 10.2.2 auf, aber nicht mit 10.1. Hast du das Tool mit dieser Version ausprobiert?

GISGe
quelle
Das klingt nach einem guten Ansatz, obwohl ich persönlich nicht weiß, wie man ältere Versionen des Tools ausführt. Weiß jemand, wohin ich zeigen soll, um diese Arbeit zu versuchen?
UdderlyAstray
Danke @GISGe. Wo hast du das gefunden? Gibt es einen Link, in dem dieser Fehler dokumentiert ist?
G-Wizard
1
@ G-Wizard - Ich habe den Link in meine Antwort eingefügt. Als Mitarbeiter von Esri International habe ich Zugriff auf eine detailliertere Beschreibung, als Sie sehen können. Auf diese Weise kann ich Ihnen mitteilen, dass der Fehler auch für das Zonal Statistics-Tool gilt und nicht in 10.1 enthalten ist.
GISGe
@UdderlyAstray - Wenn Sie eine ältere Version des Tools ausführen möchten, müssen Sie diese ältere Version von ArcGIS installieren.
GISGe
1
Nochmals vielen Dank, @GISGe, da dies das ist, wonach ich suche (Fehler offiziell bestätigt), markiere ich diese Antwort als die richtige, obwohl andere dies auch durch Tests bestätigt haben.
G-Wizard
9

Es ist ein Fehler. Irgendetwas stimmt nicht mit der Zellenzählung.

Das richtige Mittel (9.0452380952381) multipliziert mit der richtigen Anzahl nicht leerer Zellen (420) geteilt durch 297 (dies ist eine vom Tool gemeldete Zellenzahl) ergibt 12.7912457912458. Das ist ein falscher Durchschnitt, der vom Tool gemeldet wird.

Ergebnisse meines eigenen Spielzeuggrößentests:

Bildbeschreibung hier eingeben

FelixIP
quelle
1
Ich bestätige, dass ich das gleiche Problem mit 10.3, NODATA und "MEAN" habe
radouxju
Vielen Dank für die Bestätigung. Aber abgesehen von Unterschieden beim Mittelwert irre ich mich, wenn ich annehme, dass das Ergebnis eigentlich kein Wert sein sollte, sondern 'NODATA'? Die Beschreibung des Tools lässt mich das glauben. Sagt: "NODATA - Wenn in einer bestimmten Zone NoData-Zellen im Wert-Raster vorhanden sind, wird davon ausgegangen, dass nicht genügend Informationen vorhanden sind, um statistische Berechnungen für alle Zellen in dieser Zone durchzuführen. Daher erhält die gesamte Zone den NoData-Wert auf dem Ausgabe-Raster. " Da es ein Pixel mit "NODATA" gibt, sollten die zonalen Statistiken auch "NODATA" sein. Richtig?
G-Wizard
2
@ G-Wizard, Sie sind korrekt, wie in der Werkzeugbeschreibung angegeben. etwas analog zum # DIV / 0! in Excel.
c0ba1t
1

Verschieben Sie ähnlich wie bei einer anderen Antwort die Rasterdaten in NumPy-maskierte Arrays , um Ihre Statistiken zu berechnen. Angenommen, zwei überlagernde Raster mit derselben Form sind ganz einfach:

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

Zeigt an:

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
quelle