Frage zur Arbeitsweise von FocalStatistics

Hi,
Stelle ich mich nur dusselig an, oder ist das wirklich so?
Wenn man bei
"ArcToolbox - SpartialAnalystTools - Neighborhood - FocalStatistics"

bei den Neighborhood settings
height = 1 und width = 5 eingibt,
dann kommt das gleiche raus, wie wenn man
heigt=5 und width = 1 eingibt?

Ist es nicht so, daß bei height = 1 / widthz = 5 eine "Maske" verwendet wird, die 1 Zelle hoch und 5 Zellen breit ist und
bei height=5 / width=1 eine Maske, die 5 Zellen hoch und eine Zelle breit ist?
Das sollte im allgemeinen doch ein unterschiedliches Ergebnis herauskommen?
(units immer CELL)

Kann mich diesbezüglich bitte jemand aufklären?

Ciao,
Andi
Hallo Andreas,

ich kenne nur die Arbeit mit einem "Rundumfeld" für Focal Statistics und kann dir nicht genau sagen, wie die Maskengröße interpretiert wird.
Aber arbeite doch nochmal die ArcGIS-Hilfe zu Fokal Statistics durch, da gibts Erläuterungen für die Nutzung eines""Kernel File (Irregular)", ein ASCII-File, mit dem man unregelmäßige Umfelder definieren kann. Einfach nur Neighborhood 1 zu 5 angeben reicht wohl nicht.
Grüße
Rena
Hi,
sorry für die Verzögerung, war auswärts unterwegs.

Wie ich darauf komme, daß man einfach die Maskengröße unterschiedlich angeben kann, ist zunächst der untenstehende Beispielcode von
http://webhelp.esri.com/arcgisdesktop/9.3/index.cf m?id=6369&pid=6354&topicname=Focal_Statistics

Da taucht jeweils die Zeile auf:
InNeighborhood = "Rectangle 5 6 Map"

Außerdem gibt es auf der gleichen Seite im Abschnitt "Scripting Syntax" die Beschreibung zum Parameter "neighborhood (Optional)":
RECTANGLE, {width}, {height}, {CELL | MAP} — A rectangular neighborhood with the given {height} and {width}. The default rectangle is a square of width 3 and height 3, in units of cells. If only one of {width} or {height} is specified, the result is a square.

Außerdem steht auf
http://resources.esri.com/help/9.3/ArcGISDesktop/c om/Gp_ToolRef/spatial_analyst_tools/how_focal_stat istics_works.htm :
Rectangular ... The x,y position for the processing cell within the neighborhood, with respect to the upper-left corner of the neighborhood, is determined by the following equations: x = (width of the neighborhood + 1)/2 y = (height of the neighborhood + 1)/2

Demnach müßte man "the given {height} and {width}" ja einfach wie von mir gedacht eingeben können ?

Hinzu kommt, daß man im Werkzeug "SpatialAnalystTools - Neighbourhood - FocalStatistics" unter "neighbourhood settings" ebenfalls "width" und "height" für rechtwinklige Masken angeben kann. Weitere Einstellungen habe ich in dem Benutzerdialog nicht gefunden. Auch die Beschreibung in diesem Dialog zu "Neigthborhood settings" lautet:
"Rectangle Height Width Units - A rectangular neighborhood defined by the height and width. The default is a square....."

Also wenn ich mich hier nicht ständig verlese, ist die Standardmaske zwar ein Quadrat, man kann jedoch ein allgemeines Rechteck als Maskenform mit Höhe und Breite angeben.
Dennoch kriege ich für eine 1x5-Maske das gleiche Ergebnis wie bei einer 5x1-Maske, obwohl die Eingangswerte eindeutig nicht gleich sind (Habe hier ein nettes bewegtes Geländemodell als Graustufenbild, das alles andere als "symmetrisch" ist.)

Bei Einsatz des Parameters "Irregular" wird es, soweit ich es verstandan habe, möglich, einen irregulären Filterkern zu benutzen, also die Operationen auf den einzelnen Umgebungszellen der Maske "uneinheitlich" zu verändern (ebenfalls http://resources.esri.com/help/9.3/ArcGISDesktop/c om/Gp_ToolRef/spatial_analyst_tools/how_focal_stat istics_works.htm) aber das brauche ich ja nicht.

Interessiert mich wirklich sehr, wo hier mein Denkfehler liegt!

Hier noch die Beispiele von den ESRI-Seiten.
Script example
# FocalStatistics_sample.py
# Description:
# Calculates a statistic on a raster over a specified neighborhood.
# Requirements: None
# Author: ESRI
# Date: Sept 6, 2005
# Import system modules
import arcgisscripting

# Create the Geoprocessor object
gp = arcgisscripting.create()

try:
# Set local variables
InRaster = "C:/data/raster1"
OutRaster = "C:/data/focalstat"
InNeighborhood = "Rectangle 5 6 Map" <---- hier steht's ?
InNoDataOption = "DATA"

# Check out Spatial Analyst extension license
gp.CheckOutExtension("Spatial")

# Process: FocalStatistics
gp.FocalStatistics_sa(InRaster, OutRaster, InNeighborhood, "", InNoDataOption)

except:
# If an error occurred while running a tool, then print the messages.
print gp.GetMessages()


edit: tippfehler ;)
Ich habe mal versucht, den Fehler "nachzuspielen", aber ich bekomm's nicht hin.

Bei unterschiedlicher Definition der Nachbarschaft (1x5 | 5x1) bekomme ich auch eindeutig unterschiedliche Ergebnisse.

Habe ebenfalls ein DGM verwendet und es mit ArcGIS 9.2 SP6 sowie ArcGIS 9.3.1 ausprobiert.
Hallo Andreas,

habe im Moment leider nicht die Zeit, dein Problem im Detail nachzuvollziehen und verschiedene Wege auszuprobieren, aber ich würd an deiner Stelle von der "Rectangel Neighborhood" abgehen, und es mit dem "Irregular Kernel File" versuchen. Da kannst du eindeutig festlegen, welche Zellen betrachtet werden sollen.
Auch wenn das Kernel File eigentlich für wirklich ganz unregelmäßige Umfelder gedacht ist, spricht ja nix dagegen, es für dieses 1x5-Umfeld zu nutzen, wenns anders nicht funktioniert...
Grüße
Rena
Noch zwei PS.:

1. Welche ArcGIS-Version verwendest du?

2. Die Unterschiede bei einer so kleinen Nachbarschaft und einem recht hoch aufgelöstem DGM sind nur zu sehen, wenn man recht weit hineinzoomt - in der Gesamtansicht fallen sie kaum auf. Icch nehme an, das hast du beachtet?
Hm,
Rumbasteln tue ich hier mit ArcGis 9.3 (Build 1770) (voll das dolle Deutsch der Satz, sorry ;) )

Zunächst mal gehe ich davon aus, daß die Einstellung CELL bedeutet, daß Rasterzellen gezählt werden. Dann wäre beispielsweise 5x1 von der Form 5 Rasterzellen mal 1 Rasterzelle. Und die Einstellung CELL verwende ich auch.
Als Operator nehme ich den RANGE-Operator
Außerdem ein Haken vor "Ignore NoData ..."
Das Bild hat eine Zellgröße von 25x25 Metern.

Ähm, Leute, jetzt hakt's. Habe das mit dem focal-statistics-Werkzeug in der letzten Zeit bestimmt drei Dutzend mal ausprobiert, und immer kam bei 1x5 genau das gleiche draus wie mit 5x1.
Doch nachdem das bei Maxilla mit der ArcToolbox aber funktioniert hat, bin ich vorher nochmal drangegengen....

Und oh Wunder.......Jetzt auf einmal funktioniert das mit dem Tool aus der Toolbox einwandfrei!
Verstehe ich allerdings nicht, denn was gibt's da schon groß falsch zu machen?

Das ganze hatte ich auch als VBA-Skript/ArcObjects realisiert und hatte damit das gleiche Problem.
Auch hier das Wunder ... auch das funktioniert jetzt auf einmal !
Soll das einer verstehen, an dem Skript habe ich GAR NICHTS geändert. Gestern gings nicht, heute gehts.
Gibt es dafür eine Erklärung? (Außer, daß ich Urlaubsreif bin?
Nein, es wurde hier auch kein Update installiert - habe eben nachgefragt.

Ich weiß ja nicht, welchen Voodoo-Zauber da jemand angewendet hat, auf jeden Fall jedoch VIELEN DANK dafür.

Dadurch muß ich micht nicht weiter mit der Alternativmethode "irregular kernel" auseinandersetzen - Auf den Tip von Rena hätte ich mich als nächstes stürzen müssen.

Allerdings stürzt mein Skript immer noch ab, wenn ich bei den Parametern für focalStatistics "'ignoreData = True" einsetze.
(Fehlermeldung: Laufzeitfehler '-2147467259 (80004005) Automatisierungsfehler unbekannter Fehler)
Es läuft nur mit "'ignoreData = false"


Hier mal das Skript, vielleicht kann ja noch jemand auch dieses Problem weghexen?

Auf jeden Fall nochmal vielen Dank an die Unterstützung. Ich weiß zwar nicht wie, aber jetzt funktionierts.

Ciao
Andi

Private Sub UIButtonControl1_Click()

'Erzeuge Geoprocessor object
Dim pGeoprocessor_focal_1x7 As IGeoProcessor
Set pGeoprocessor_focal_1x7 = New GeoProcessor

'Array-Object für GeoProcessor
Dim parameter_focal_1x7 As IVariantArray
Set parameter_focal_1x7 = New VarArray

'Erzeuge Parameter für Filter-Werkzeug
Dim inraster_focal_1x7, outraster_focal_1x7 As String 'Pfade zu Eingabe- und Ausgabedatei
Dim neighborhood_focal_1x7 As String 'die Nachbarschaftsbeziehung.
Dim focal_statistictype_1x7 As String 'Art der Operation
Dim ignoreData_1x7 As Boolean 'Verhalten bei NoData-Werten in der Nachbarschaft

'Setze Variablen für Filter-Werkzeug
inraster_focal_1x7 = "c:\TEMP\in.img" 'Eingangsdate in.img
outraster_focal_1x7 = "c:\TEMP\1x7.img" 'Ausgabedateu aus.img
neighborhood_focal_1x7 = "RECTANGLE 1 7 CELL" 'Geometrie: 1 Pixel breit, 7 Pixel hoch, betrachtetes Pixel in der Mitte
focal_statistictype_1x7 = "RANGE"
'ignoreData_1x7 = True 'bei True stürzt es ab.
ignoreData_1x7 = False

'Füge Parameter zum Übergabe-Array zu
parameter_focal_1x7.Add (inraster_focal_1x7)
parameter_focal_1x7.Add (outraster_focal_1x7)
parameter_focal_1x7.Add (neighborhood_focal_1x7)
parameter_focal_1x7.Add (focal_statistictype_1x7)
parameter_focal_1x7.Add (ignoreData_1x7)

'starte das Filter-Werkzeug Filter_Sa
pGeoprocessor_focal_1x7.Execute "FocalStatistics_sa", parameter_focal_1x7, Nothing


' In 7x1-Richtung--------------------
'Erzeuge Geoprocessor object
Dim pGeoprocessor_focal_7x1 As IGeoProcessor
Set pGeoprocessor_focal_7x1 = New GeoProcessor

'Array-Object für GeoProcessor
Dim parameter_focal_7x1 As IVariantArray
Set parameter_focal_7x1 = New VarArray

'Erzeuge Parameter für Filter-Werkzeug
Dim inraster_focal_7x1, outraster_focal_7x1 As String 'Pfade zu Eingabe- und Ausgabedatei
Dim neighborhood_focal_7x1 As String 'die Nachbarschaftsbeziehung.
Dim focal_statistictype_7x1 As String 'Art der Operation
Dim ignoreData_7x1 As Boolean 'Verhalten bei NoData-Werten in der Nachbarschaft

'Setze Variablen für Filter-Werkzeug
inraster_focal__7x1 = "c:\TEMP\in.img" 'Eingangsdate in.img
outraster_focal_7x1 = "c:\TEMP\7x1.img" 'Ausgabedateu aus.img

neighborhood_focal_7x1 = "RECTANGLE 7 1 CELL" 'Geometrie: 7 Pixel breit, 1 Pixel hoch, betrachtetes Pixel in der Mitte
focal_statistictype_7x1 = "RANGE"
'ignoreData_7x1 = True 'bei True stürzt es ab.
ignoreData_7x1 = False

'Füge Parameter zum Übergabe-Array zu
parameter_focal_7x1.Add (inraster_focal_7x1)
parameter_focal_7x1.Add (outraster_focal_7x1)
parameter_focal_7x1.Add (neighborhood_focal_7x1)
parameter_focal_7x1.Add (focal_statistictype_7x1)
parameter_focal_7x1.Add (ignoreData_7x1)

'starte das Filter-Werkzeug Filter_Sa
pGeoprocessor_focal_7x1.Execute "FocalStatistics_sa", parameter_focal_7x1, Nothing

End Sub
Nachtrag
Habe noch im Quellcode rumgespielt.
Das Problem, daß beim VBA-Skript immer gleiche Ergebnisse für 1x7 und 7x1 herauskommen, taucht auch auf, wenn man in der Zeile
neighborhood_focal_7x1 = "RECTANGLE 7 1 CELL"

wirre Zeichen zwischen die Schlüsselworte einträgt, z.B. Kommas:
neighborhood_focal_7x1 = "RECTANGLE, 7, 1, CELL"

Kann es irgendwie passieren, daß sich Variableninhalte im Arbeitsspeicher überschreiben lassen und damit der Variableninhalt während/vor der Ausführung verändert wird?

Hintergrund meiner Überlegung: anscheinden wurde gestern abend ein Microsoft-Sicherheitsupdate installiert, daß irgendwas mit "Pufferüberlauf im Speicher" zu tun hat.

Ciao
Andi