Ich bin ein Neuling in Python und möchte wissen, ob es in ArcGIS 10 eine schnelle Methode gibt, um die Zellwerte eines Rasters Pixel für Pixel und die Koordinaten (XY-Koordinate der Pixelmitte zuordnen) mit Python abzurufen.
Um dies weiter zu beschreiben, muss ich die Karte X, die Karte Y und den Zellenwert des ersten Pixels abrufen und diese drei Werte drei Variablen zuweisen und diesen Schritt für den Rest der anderen Pixel wiederholen (Schleife durch das gesamte Raster).
Ich denke, ich muss meine Frage genauer beschreiben. Das Problem ist, dass ich die XY-Position eines Pixels des ersten Rasters und die Zellenwerte mehrerer anderer Raster abrufen muss, die dieser XY-Position entsprechen. Dieser Vorgang sollte durch jedes Pixel des ersten Rasters geschleift werden, ohne dass ein Zwischenpunkt-Shapefile erstellt wird, da er wirklich sehr zeitaufwendig ist, da ich ein Raster mit fast 8 Milliarden Pixeln verarbeiten muss. Ich muss dies auch mit Python in ArcGIS 10 tun.
@ JamesS: Vielen Dank für Ihren Vorschlag. Ja, dies würde für ein Raster funktionieren, aber ich muss die Zellenwerte auch für mehrere andere Raster erfassen. Das Problem besteht darin, dass ich nach dem Abrufen der X- und Y-Koordinate des ersten Pixels des ersten Rasters den Zellenwert des zweiten Rasters abrufen muss, der der X-, Y-Position des ersten Rasters, dann des dritten Rasters usw. entspricht. Wenn Sie also das erste Raster durchlaufen, sollten Sie die X- und Y-Position eines Pixels und die Zellwerte des anderen Rasters, die dieser Position entsprechen, gleichzeitig ermitteln, aber ich bin mir nicht sicher. Dies kann erreicht werden, indem das erste Raster in ein Punkt-Shapefile konvertiert und die Funktion "Mehrfachwerte in Punkt extrahieren" in ArcGIS 10 ausgeführt wird.
@hmfly: Danke, ja, diese Methode (RastertoNumpyarray) funktioniert, wenn ich die Koordinate eines bekannten Zeilen- und Spaltenwerts des Arrays ermitteln kann.
@whuber: Ich möchte keine Berechnungen durchführen, ich muss nur XY-Koordinaten und Zellenwerte in eine Textdatei schreiben und das ist alles
quelle
Antworten:
Nach der Idee von @ Dango habe ich den folgenden Code erstellt und getestet (auf kleinen Rastern mit demselben Umfang und derselben Zellengröße):
Basierend auf dem @ hmfly-Code können Sie auf die gewünschten Werte zugreifen:
Leider gibt es ein "aber" - der Code ist richtig für NumPy-Arrays, die vom Systemspeicher verarbeitet werden können. Für mein System (8 GB) betrug das größte Array etwa 9000.9000.
Da ich aufgrund meiner Erfahrung keine weitere Hilfe geben kann, können Sie einige Vorschläge zum Umgang mit großen Arrays berücksichtigen: /programming/1053928/python-numpy-very-large-matrices
arcpy.RasterToNumPyArray
Mit dieser Methode können Sie die Teilmenge des in ein NumPy-Array konvertierten Rasters angeben ( ArcGIS10-Hilfeseite ). Dies kann hilfreich sein, wenn Sie große Datasets in Teilmatrizen aufteilen .quelle
Wenn Sie nur die Pixelwerte durch (Zeile, Spalte) erhalten möchten, können Sie ein Arcpy-Skript wie folgt schreiben:
Wenn Sie jedoch die Pixelkoordinate ermitteln möchten, kann Ihnen NumPyArray nicht weiterhelfen. Sie können das Raster mit dem RasterToPoint-Tool in einen Punkt konvertieren und anschließend die Koordinate nach Formfeld abrufen.
quelle
Die einfachste Methode zum Ausgeben von Koordinaten und Zellenwerten in eine Textdatei in ArcGIS 10 ist die Beispielfunktion , bei der kein Code und insbesondere keine Schleife über jede Zelle erforderlich ist. In ArcGIS <= 9.3x war es früher so einfach,
outfile.csv = sample(someraster)
eine Textdatei mit allen (nicht null) Zellenwerten und Koordinaten (im Format z, x, y) auszugeben. In ArcGIS 10 scheint das Argument "in_location_data" jetzt obligatorisch zu sein, sodass Sie die Syntax verwenden müssenSample(someraster, someraster, outcsvfile)
.Edit: Sie können auch mehrere Raster angeben:
Sample([someraster, anotherraster, etc], someraster, outcsvfile)
. Ob das mit 8 Milliarden Zellen funktionieren würde, habe ich keine Ahnung ...Bearbeiten: Beachten Sie, dass ich dies in ArcGIS 10 nicht getestet habe, aber die Beispielfunktion seit Jahren in <= 9.3 (und Workstation) verwendet habe.
Bearbeiten: Ich habe es jetzt in ArcGIS 10 getestet und es wird nicht in eine Textdatei ausgegeben. Das Tool ändert die Dateierweiterung automatisch in ".dbf". Der folgende Python-Code funktioniert jedoch als SOMA- und MOMA- Map-Algebra-Anweisungen, die in ArcGIS 10 weiterhin unterstützt werden:
quelle
Eine Möglichkeit hierfür ist die Verwendung des Tools Raster_To_Point , gefolgt vom Tool Add_XY_Coordinates . Am Ende erhalten Sie ein Shapefile, in dem jede Zeile in der Attributtabelle ein Pixel aus Ihrem Raster mit Spalten für X_Coord , Y_Coord und Cell_Value darstellt . Sie können diese Tabelle dann mit einem Cursor durchlaufen (oder nach Belieben nach Excel exportieren).
Wenn Sie nur ein Raster verarbeiten müssen, lohnt es sich wahrscheinlich nicht, ein Skript zu erstellen. Verwenden Sie einfach die Tools von ArcToolbox. Wenn Sie dies für viele Raster ausführen müssen, können Sie Folgendes versuchen:
[ Hinweis: Ich habe kein ArcGIS 10 und bin nicht mit ArcPy vertraut. Dies ist also nur eine sehr grobe Darstellung. Es ist ungetestet und wird mit ziemlicher Sicherheit eine Feinabstimmung benötigen, um es zum Laufen zu bringen.]
Sie können dann Schleife über die Shape - Datei Attributtabellen mit Hilfe eines Such Cursor oder (möglicherweise einfacher) mit dbfpy . Auf diese Weise können Sie die Daten aus Ihrem Raster (jetzt in einer Shapefile-DBF-Tabelle gespeichert) in Python-Variablen lesen.
quelle
Möglicherweise können Sie eine Weltdatei für das Raster erstellen und das Raster in ein numpy-Array konvertieren. Wenn Sie das Array durchlaufen, werden die Zellenwerte abgerufen, und wenn Sie in zunehmendem Maße das x, y aus der Weltdatei aktualisieren, erhalten Sie auch die Koordinaten für jeden Zellenwert. hoffe das ist nützlich.
quelle
Marcins Code funktionierte einwandfrei, außer dass ein Problem in den Funktionen rasCentrX und rasCentrY dazu führte, dass die Ausgabekoordinaten mit einer anderen Auflösung angezeigt wurden (wie Grazia beobachtete). Mein Fix war es, sich zu ändern
zu
und
zu
Ich habe den Code verwendet, um ein ESRI-Grid in eine CSV-Datei zu konvertieren. Dies wurde erreicht, indem der Verweis auf inRaster2 entfernt und anschließend mit einem csv.writer die Koordinaten und Werte ausgegeben wurden:
Ich fand auch nicht, dass die Transponierung in gebraucht wurde
so umgewandelt, dass zu
quelle
Hässlich aber hochwirksam:
quelle
Eine einfache Lösung mit Open Source-Python-Paketen:
Fiona ist praktisch, da Sie ein Shapefile öffnen, die Features durchlaufen und (wie ich es getan habe) an ein
dict
Objekt anhängen können . In der Tat ist die Fionafeature
selbst wie einedict
ebenso, so dass es einfach ist, auf Eigenschaften zuzugreifen. Wenn meine Punkte Attribute hätten, würden sie zusammen mit den Koordinaten, der ID usw. in diesem Diktat erscheinen.Rasterio ist praktisch, da es sich im Raster leicht als Numpy-Array, als leichter und schneller Datentyp, lesen lässt. Wir haben auch Zugriff auf eine
dict
von Rastereigenschaften, einschließlich deraffine
, die alle Daten sind, die wir zum Konvertieren der Raster-XY-Koordinaten in Array-Zeilen-Spalten-Koordinaten benötigen. Siehe @perrygeos ausgezeichnete Erklärung hier .Am Ende haben wir einen
pt_data
Typ,dict
der Daten für jeden Punkt und den extrahierten enthältraster_value
. Wir könnten das Shapefile auch leicht mit den extrahierten Daten umschreiben, wenn wir wollten.quelle