Füllen Sie NoData-Lücken im Raster mit ArcGIS Desktop?

9

Ich habe ein Raster mit Lücken. Ich möchte diese mit ArcGIS 10.2 for Desktop mit Durchschnittswerten der umgebenden Zellen ausfüllen.

Ich habe "Focal Statistics" ausprobiert, aber es werden JEDE Zelle und nicht nur die Lücken gemittelt.

Ich habe versucht, [Mosaic] .IsNull.Con ([Average], [Mosaic]) hier zu finden. Patching , weiß aber nicht, wie ich es implementieren soll

Ich habe Map ALgebra ausprobiert, aber ich denke, sie haben Versionen vor 10.2 verwendet.

Was ich möchte. Erstellen Sie ein gefälschtes Raster mit ausgefüllten Lücken. Verwenden Sie das gefälschte Raster, um die Lücken des echten Rasters auszufüllen, ohne die Punkte durch tatsächliche Daten zu ersetzen.

Steven Crisp
quelle
Falsche Syntax, benutze ([Mosaik] .isnull) .Con ([Durchschnitt], [Mosaik])
FelixIP
1
Beachten Sie nur, dass Ihr Link "Patchen" 15 Jahre alt zu sein scheint (von 2000 bis 2001).
Phloem
2
In letzter Zeit hat sich bei den Rastern viel geändert, so dass viele ältere Beispiele die richtige Absicht haben, aber möglicherweise eine falsche Syntax für die aktuelle Version verwenden. @crmackey hat die richtige Übersetzung, obwohl ich einen Kreis und kein Rechteck verwenden würde; Bei kleineren Dimensionen gibt es kaum Unterschiede, bei (relativ) großen Nachbarschaftsbereichen gibt es signifikante Unterschiede zwischen Kreis und Rechteck.
Michael Stimson
1
Selbst wenn es 15 Jahre alt ist, ist es immer noch sehr relevant. Huber kannte und kennt das Thema sehr gut.
FelixIP
1
Genau. Die Operation ist dieselbe, nur die Syntax hat sich geändert.
Michael Stimson

Antworten:

9

Das funktioniert:

filled = arcpy.sa.Con(arcpy.sa.IsNull(in_raster),arcpy.sa.FocalStatistics(in_raster,
                        arcpy.sa.NbrRectangle(w, h),'MEAN'), in_raster)

Wobei "w" und "h" der Suchradius sind.

Dies führt nur Fokusstatistiken in den NoData-Bereichen durch. Ich habe dies überprüft, indem ich Daten aus einem DEM gelöscht und dann den Unterschied festgestellt habe. Sie müssen nur sicherstellen, dass der Suchradius ausreichend ist.

Crmackey
quelle
Füge ich all dies einfach zum Rasterrechner hinzu und ändere das "in_raster" und w und h? Ich kann es aus irgendeinem Grund nicht zum Laufen bringen, obwohl der Ablauf sinnvoll ist, da die manuelle Erstellung des Fokusrasters übersprungen wird und dies im laufenden Betrieb erfolgt.
Steven Crisp
Habe es zum Laufen gebracht! Ich danke dir sehr! Ich habe nur hinzugefügt, wo ich nicht sollte. Danke!
Steven Crisp
1
Kein Problem. Ein Haftungsausschluss, wie @ MichaelMiles-Stimson hervorhob, wäre besser, NbrCircle () zu verwenden.
Crmackey
Befindet sich wh in Karteneinheiten von Zellen?
Wenn Sie nicht wissen - nur GIS
Sie sollten besser verwenden, arcpy.sa.NbrCircle(radius, units)wo sich die Einheiten befinden können 'MAP'oder 'CELL'.
Crmackey
3

Verwenden Sie die von Ihnen beschriebene Fokusstatistikfunktion, um alle Zellen für das Raster zu mitteln. Verwenden Sie dann die Funktionen Con und IsNull im Rasterrechner, um nur die Zellen zu ersetzen, die null sind.

Con(IsNull(<inputRaster>), <focalRaster>, <inputRaster>)

Ein möglicher Nachteil dieser Lösung besteht darin, dass Sie möglicherweise einige unerwünschte zusätzliche gemittelte Zellenwerte um den Umfang Ihres Ausgabe-Rasters sehen

Ben Gosack
quelle
Ich kann aufgrund von Reputation oder W / E nicht upvoten, aber diese Methode funktioniert, wenn ich zuerst ein Fokusstatistik-Raster erstelle und dann den obigen Code anwende. Ich wünschte nur, ich könnte alles in einer Zeile wie im obigen Kommentar tun, um Zeit zu sparen. Ich habe ein paar hundert dieser Dinge ...
Steven Crisp
Es hängt nur davon ab, ob Sie Ihr Fokusstatistik-Raster beibehalten oder im laufenden Betrieb interpretieren möchten. Beide Methoden sind im Wesentlichen gleich (+1 für beide).
Michael Stimson
3

Sie sollten den Raster-Rechner verwenden. Auf der ESRI-Support-Seite finden Sie eine nützliche und relevante Codezeile. Vorgehensweise: Entfernen und ersetzen Sie keine Datenwerte innerhalb eines Rasters mithilfe statistischer Informationen aus den umgebenden Datenwerten . Aus Ihrer Frage geht hervor, dass dies genau das tun würde, was Sie versuchen, aber lassen Sie mich wissen, wenn ich falsch liege. Hier ist mein Screenshot von Raster Calculator, der eine bedingte Anweisung verwendet, um einen Durchschnittswert für Zellen ohne Daten aus umgebenden Zellen zu berechnen: Geben Sie hier die Bildbeschreibung ein

Wenn Sie Hunderte davon zu erledigen haben, empfehle ich die Verwendung des Raster-Iterators im Model Builder, der alle Ihre Raster wie folgt in das Raster-Rechner-Tool einspeist:

Geben Sie hier die Bildbeschreibung ein

Löwe
quelle
2

Ich habe die von LeonB verwendete Raster-Rechner-Methode ausprobiert, bin jedoch auf einen Speichermangel gestoßen, was angesichts meiner Systemspezifikationen überraschend ist. Schrieb ein kleines eigenständiges Python-Skript - von hier aus modifiziert - in IDLE, das für mich funktionierte ...

import arcpy
from arcpy import env
from arcpy.sa import *

env.workspace="D:/Watershed/"

inRaster="D:/Watershed/tamtr14_1m"

arcpy.CheckOutExtension ("Spatial")

outCon=Con(IsNull(inRaster), FocalStatistics (inRaster, NbrRectangle (5,5, "CELL"), "MEAN"), inRaster)

outCon.save ("D:/Watershed/outCon")
wiebe712
quelle