Gdal Dataset.ReadAsArray () stürzt Python ab

12

Ich verwende Python 2.6.5 (32 Bit) mit Numpy 1.3 und Gdal 1.9.1, die auf Windows 7 64 Bit installiert sind. Ich versuche, ein 800 MB großes Imagine-Raster-Dataset (.img) in ein Numpy-Array zu lesen, um eine Raster-Algebra durchzuführen. Sobald ich den folgenden Code ausführe, stürzt Python.exe ab.

from osgeo import gdal

g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()

Python.exe stürzt beim b.ReadAsArray()Aufruf ab. Ich habe einige Google-Suchen durchgeführt und Artikel aus Gdal 1.6 gefunden, in denen dieses Problem mit Windows 7 64-Bit erwähnt wurde, aber es wurde auch erwähnt, dass es zu diesem Zeitpunkt in den neuesten Entwicklungsversionen behoben wurde.

Hat jemand anderes dieses Problem gehabt? Irgendwelche Workarounds?

AKTUALISIEREN:

Ich entschied mich, den Code in PyDev zu debuggen, um festzustellen, wo es fehlschlägt. Nach allem, was ich sagen kann (es werden immer noch keine Fehlermeldungen angezeigt), schlägt es in Zeile 22 von gdal_array.py fehl.

_mod = imp.load_module('_gdal_array', fp, pathname, description)

Wenn ich in die obige Codezeile gehe, komme ich in das Modul init .py von numpy. Wenn ich das Ende der Zahl erreicht habe. Mit dem Modul __ init __ .py kehren Sie zur obigen Codezeile zurück. Wenn ich dann auf die Schaltfläche "Einstieg" drücke, die mich in die nächste Zeile in "gdal_array.py" bringen soll, wird das Skript ohne Fehlermeldungen oder ähnliches beendet.

UPDATE 2:

Ich habe GDAL 1.9.1 deinstalliert und GDAL 1.6.1 aus den Windows-Binaries von Python Cheeseshop und OSGeo installiert. Hatte immer noch das gleiche Problem.

Brian
quelle
Ich hatte dieses Problem. Verwenden Sie die GDAL-Python-Bindungen von Tamas unter gis.internals? Wenn ja, verschieben Sie Ihre Ergänzungen zu Ihrem PFAD nach vorne. Eine andere Bibliothek hat mir Probleme bereitet.
Jay Laura
Ich glaube, ich habe von seinen Interna heruntergeladen. Ich werde versuchen, meinen Weg anzupassen, wenn ich morgen im Büro bin. Danke für den Hinweis.
Brian
1
Wenn das nicht funktioniert, habe ich kürzlich auf die Verwendung dieser Pakete umgestellt
Jay Laura
Ich habe versucht, Dinge in meinem Systempfad (PATH-Umgebungsvariable in Windows) zu verschieben, ohne Erfolg. Ich habe auch meine Version von GDAL deinstalliert und die Version von GDAL auf dem von Ihnen bereitgestellten Link installiert und hatte immer noch das gleiche Problem.
Brian
Hmmm ... die Version, zu der ich verlinkt habe, waren nur die Bindings. Sie müssen also noch den GDAL-Core von Tamas haben. Wenn die anderen Anrufe jedoch geklappt haben, funktioniert das einwandfrei. Drei Dinge, die Sie ausprobieren sollten, sind lange Einstellungen (in der Reihenfolge der Länge). 1) Aktualisieren Sie Ihre Version von Numpy. 2) gdal_translate to gtiff und probiere den Code auf diesem Bild. 3) Hängen Sie ReadAsArray () mit .astype (numpy.float32) an. Ist das Bild öffentlich? Ich kann es auf meinem Rechner testen. Können Sie den Stack-Trace veröffentlichen, wenn keiner von diesen funktioniert?
Jay Laura

Antworten:

5

Wie von vielen Kommentatoren vermutet, war dies ein Problem mit meiner Installation. Anscheinend habe ich bei der Installation von GDAL und den Python Bindings nicht genau genug aufgepasst.

Ich habe GDAL Core und Plugins (dll's) von gisinternals.com installiert, aber irgendwie habe ich nicht daran gedacht, die Python Bindings auch von dort zu installieren. Die von mir installierten Python-Bindungen stammen von einer anderen Site (ich kann mich an dieser Stelle nicht erinnern, welche).

Als ich GDAL und Python Bindings von gisinternals.com neu installierte, konnte ich ReadAsArray erfolgreich lesen.

Vielen Dank an alle, die kommentiert und geantwortet haben und ich entschuldige mich für meine Unwissenheit.

Brian
quelle
3

Möglicherweise handelt es sich um ein Speicherproblem. Wenn Sie ReadAsArray verwenden, werden die Daten in den Speicher geladen, und obwohl 800 MB nicht massiv sind, sind sie auch nicht winzig. Haben Sie versucht, das Array in Stücken zu lesen?

data = b.ReadAsArray(x_offset, y_offset, x_size, y_size)

Sie sollten in der Lage sein, das Array zu durchlaufen und es stückweise zu verarbeiten. Abhängig von der von Ihnen ausgeführten Verarbeitung sollten Sie jedoch Bereiche mit Überlappung einlesen, um Kanteneffekte zu vermeiden.

om_henners
quelle
Ich habe versucht, Stücke zu verwenden. Ich habe es data = b.ReadAsArray(0,0, 500, 500)mit dem gleichen Ergebnis versucht .
Brian
Hmm. Ich gehe davon aus, dass Sie andere Bildformate ausprobiert haben? Gab es auch eine bestimmte Fehlermeldung?
om_henners
Ich habe noch keine anderen Formate ausprobiert. Es gab keine Fehlermeldung, nur ein Popup mit der Meldung "python.exe funktioniert nicht mehr".
Brian
Ich habe die IMG-Datei heute Morgen in ein GeoTIFF konvertiert und es erneut versucht. Kein Glück.
Brian
Gibt es eine Möglichkeit, die Datei aus GDAL zu speichern?
CMCDragonkai
1

Tut mir leid, dass ich zu spät zu dieser Party komme, aber Ihr grundlegendes Problem ist, dass 32-Bit-Python keine sehr großen Raster im Speicher speichern kann. Sie können Ihr großes Raster in mundgerechten Blöcken in den Speicher einlesen, sind jedoch in Bezug auf die effiziente Verarbeitung ohne extrem ineffiziente / häufige Lese- / Schreibvorgänge auf der Festplatte ziemlich eingeschränkt.

Ich benutze stattdessen die 64-Bit-Version von gisinternals.com, um die von Ihnen benötigte gdal-Methode ( über EXE-Wrapping ) aufzurufen (was die Effizienz aufgrund von Lese- / Schreibvorgängen auf der Festplatte einschränkt). Seien Sie vorsichtig, wenn Sie das Python-Subprozessmodul in einer Schleife verwenden (dh, Sie möchten / müssen den Subprozess möglicherweise nacheinander aufrufen ), da Sie möglicherweise versehentlich zu viele offene Threads für Ihre Windows-Box generieren und ominöse Systemwarnungen erhalten. Sie opfern mit diesem gdal-Ansatz ein wenig beim Lesen / Schreiben von Datenträgern, aber Ihre Verarbeitungseffizienz sinkt (dh im Vergleich zu einer blitzschnellen In-Memory-Berechnung , wenn Ihre Box / Bibliothek dies unterstützen könnte) nur um einen Faktor oder 10.

ksed
quelle