Ich frage mich, ob es eine Möglichkeit gibt, den Mindestbegrenzungsumfang für ein Raster mit einem bestimmten Wert zu ermitteln. Ich habe ein Raster aus einem globalen Bild ausgeschnitten und die Ausdehnung wird als globale Ausdehnung mit viel NoData-Bereich festgelegt. Ich möchte den NoData-Bereich aus diesem Raster entfernen und nur den Bereich beibehalten, der die Pixel des jeweiligen Werts enthält. Wie kann ich das machen?
Hier ist mein Beispiel: Ich möchte den Wert = 1 (blauer Bereich) extrahieren und die Ausdehnung des blauen Bereichs anstelle der ganzen Welt für die weitere Verarbeitung verwenden.
arcgis-desktop
raster
extents
Gesehen
quelle
quelle
Antworten:
WENN ich die Frage richtig verstanden habe, klingt es so, als ob Sie den minimalen Begrenzungsrahmen der Werte kennen möchten, die nicht null sind. Möglicherweise können Sie das Raster in Polygone konvertieren, die gewünschten Polygone auswählen und sie dann wieder in ein Raster konvertieren. Sie können sich dann die Eigenschaftswerte ansehen, die Ihnen den Minium-Begrenzungsrahmen geben sollen.
quelle
Der Trick besteht darin, die Grenzen der Daten mit Werten zu berechnen. Der vielleicht schnellste, natürlichste und allgemeinste Weg, diese zu erhalten, sind zonale Zusammenfassungen: Wenn Sie alle Nicht-NoData-Zellen für die Zone verwenden, liefern die zonalen Min- und Max-Werte der Gitter, die die X- und Y-Koordinaten enthalten, die volle Ausdehnung.
ESRI ändert ständig die Art und Weise, wie diese Berechnungen durchgeführt werden können. Beispielsweise wurden integrierte Ausdrücke für die Koordinatengitter mit ArcGIS 8 gelöscht und scheinen nicht zurückgekehrt zu sein. Nur zum Spaß, hier ist eine Reihe von schnellen, einfachen Berechnungen, die die Arbeit erledigen, egal was passiert.
Konvertieren Sie das Raster in eine einzelne Zone, indem Sie es wie in sich selbst mit sich selbst gleichsetzen
"Mein Gitter" == "Mein Gitter"
Erstellen Sie ein Spaltenindexgitter, indem Sie ein konstantes Gitter mit dem Wert 1 im Fluss akkumulieren. (Die Indizes beginnen mit 0.) Wenn gewünscht, multiplizieren Sie dies mit der Zellengröße und addieren Sie die x-Koordinate des Ursprungs, um ein x-Koordinatengitter zu erhalten. " X "(unten gezeigt).
Erstellen Sie auf ähnliche Weise ein Zeilenindexgitter ( und dann ein y-Koordinatengitter "Y"), indem Sie ein konstantes Gitter mit dem Wert 64 im Fluss akkumulieren.
Verwenden Sie das Zonenraster aus Schritt (1), um die zonalen Min und Max von "X" und "Y" zu berechnen : Sie haben jetzt die gewünschte Ausdehnung.
(Das Ausmaß, wie in den beiden Tabellen der Zonenstatistik gezeigt, ist in dieser Figur durch einen rechteckigen Umriss dargestellt. Das Gitter "I" ist das in Schritt (1) erhaltene Zonenraster.)
Um weiter zu gehen, müssen Sie diese vier Zahlen aus ihren Ausgabetabellen extrahieren und sie verwenden, um den Analyseumfang zu begrenzen. Das Kopieren des ursprünglichen Rasters mit dem eingeschränkten Analyseumfang schließt die Aufgabe ab.
quelle
Hier ist eine Version der @ whubers-Methode für ArcGIS 10.1+ als Python-Toolbox (.pyt).
quelle
Ich habe eine gdal- und numpy-basierte Lösung entwickelt. Es zerlegt die Rastermatrix in Zeilen und Spalten und löscht alle leeren Zeilen / Spalten. In dieser Implementierung ist "leer" weniger als 1, und nur einzelne Bandraster werden berücksichtigt.
(Während ich schreibe, wird mir klar, dass dieser Scanline-Ansatz nur für Bilder mit Nodata-Halsbändern geeignet ist. Wenn Ihre Daten Inseln in Meeren von Nullen sind, wird auch der Abstand zwischen den Inseln fallen gelassen, wodurch alles zusammengedrückt wird und die Georeferenzierung völlig durcheinander gebracht wird .)
Die Geschäftsteile (müssen ausgearbeitet werden, funktionieren nicht so wie sie sind):
In einem vollständigen Skript:
Das Skript befindet sich in meinem Code-Stash auf Github, wenn der Link ein bisschen herumjagt; Diese Ordner sind reif für eine Neuorganisation.
quelle
MemoryError
Source raster (geo units): Origin (top left): 2519950.0001220703, 5520150.00012207 Pixel size (x,-y): 100.0, -100.0 Columns, rows : 42000, 43200 Traceback (most recent call last): File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 72, in <module> cropped_raster, cropped_transform = main(src_raster) File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 22, in main data = np.array(raster.ReadAsArray()) MemoryError
Bei aller analytischen Leistungsfähigkeit fehlen in ArcGIS grundlegende Rastermanipulationen, die Sie mit herkömmlichen Desktop-Bildeditoren wie GIMP finden können . Er erwartet , dass Sie die gleiche Analyse Umfang für Ihre Ausgabe - Raster als Eingabe - Raster verwendet werden soll, es sei denn , Sie manuell die außer Kraft setzen Ausgabeausdehnung Umgebungseinstellung. Da dies genau das ist, was Sie suchen und nicht festlegen möchten, steht die ArcGIS-Vorgehensweise im Weg.
Trotz meiner Bemühungen und ohne auf die Programmierung zurückzugreifen, konnte ich keine Möglichkeit finden, das Ausmaß Ihrer gewünschten Teilmenge des Bildes zu ermitteln (ohne die rechnerisch verschwenderische Konvertierung von Raster in Vektor).
Stattdessen habe ich GIMP verwendet, um den blauen Bereich mit dem Farbauswahlwerkzeug auszuwählen, und dann die Auswahl invertiert, auf Löschen geklickt, um die restlichen Pixel zu entfernen, die Auswahl erneut invertiert, das Bild auf Auswahl zugeschnitten und es schließlich wieder exportiert PNG. GIMP hat es als 1-Bit-Tiefenbild gespeichert. Das Ergebnis ist unten:
Da Ihrem Beispielbild eine räumliche Referenzkomponente fehlte und GIMP räumlich nicht bekannt ist, ist das Ausgabebild natürlich ungefähr so nützlich wie Ihre Beispieleingabe. Sie müssen es georeferenzieren, damit es für eine räumliche Analyse von Nutzen ist.
quelle
Hier ist eine Möglichkeit, SAGA GIS zu verwenden: http://permalink.gmane.org/gmane.comp.gis.gdal.devel/33021
Eine weitere Möglichkeit nur ArcGIS GP - Tools wäre einen TIN von Ihrem Raster mit bauen Raster zu TIN berechne seine Grenze mit TIN - Domäne , und Clip durch die Grenze (oder dessen Umschlag mit Raster - Funktion Umschlag zu Polygon ).
quelle