Gdal Dataset.ReadAsArray () crash Python

12

Saya menggunakan Python 2.6.5 (32bit) dengan Numpy 1.3 dan Gdal 1.9.1 diinstal pada Windows 7 64bit. Saya mencoba membaca dataset raster 800 MB Imagine (.img) menjadi array Numpy untuk melakukan beberapa aljabar raster, tetapi segera setelah saya menjalankan kode berikut, Python.exe lumpuh.

from osgeo import gdal

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

Python.exe lumpuh saat b.ReadAsArray()dipanggil. Saya melakukan beberapa pencarian Google dan menemukan artikel bertanggal dari Gdal 1.6 yang menyebutkan masalah ini dengan Windows 7 64bit, tetapi mereka juga menyebutkan bahwa itu telah diperbaiki dalam versi pengembangan terbaru pada waktu itu.

Adakah orang lain yang mengalami masalah ini? Ada solusi?

MEMPERBARUI:

Saya memutuskan untuk men-debug kode di PyDev untuk mencoba menentukan di mana ia gagal. Dari apa yang saya tahu (masih belum mendapatkan pesan kesalahan) gagal pada baris 22 dari gdal_array.py.

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

Ketika saya melangkah ke baris kode di atas, ia membawa saya ke modul init .py dari numpy. Saat aku mencapai ujung numpy. __ init __ .py module, ia melangkah mundur ke baris kode di atas. Kemudian, ketika saya menekan tombol step to, yang seharusnya membawa saya ke baris berikutnya dalam gdal_array.py, skrip berakhir dengan tidak ada pesan kesalahan atau apa pun.

PEMBARUAN # 2:

Saya menghapus GDAL 1.9.1 dan menginstal GDAL 1.6.1 dari Python Cheeseshop dan OSGeo's Windows Binaries. Masih memiliki masalah yang sama.

Brian
sumber
Saya mengalami masalah ini. Apakah Anda menggunakan binding python gdal dari Tamas di gis.internals? Jika demikian, pindahkan penambahan Anda ke PATH ke depan. Beberapa perpustakaan lain menyebabkan masalah bagi saya.
Jay Laura
Saya yakin saya sudah mengunduh dari internalnya. Saya akan mencoba menyesuaikan jalur saya ketika saya tiba di kantor besok. Terima kasih atas sarannya.
Brian
1
Jika itu tidak berhasil, saya baru-baru ini beralih menggunakan paket-paket ini - lfd.uci.edu/~gohlke/pythonlibs
Jay Laura
Saya mencoba memindahkan barang-barang di System Path saya (variabel lingkungan PATH di Windows) tanpa hasil. Saya juga mencopot versi GDAL saya dan menginstal versi GDAL pada tautan yang Anda berikan dan masih memiliki masalah yang sama.
Brian
Hmmm .... versi yang saya tautkan hanya binding, jadi Anda masih perlu memiliki inti GDAL dari Tamas. Jika panggilan lain berfungsi, itu berfungsi dengan baik. Tiga hal yang harus dicoba adalah tembakan panjang (dalam urutan 'panjangnya'. 1) Perbarui versi Numpy Anda. 2) gdal_translate ke gtiff dan coba kode pada gambar itu. 3) tambahkan ReadAsArray () dengan .astype (numpy.float32). Apakah gambar itu publik? Saya bisa mengujinya di mesin saya. Bisakah Anda memposting jejak tumpukan jika tidak ada yang berfungsi?
Jay Laura

Jawaban:

5

Seperti yang diduga oleh banyak komentator, ini adalah masalah dengan instalasi saya. Rupanya, saya tidak cukup memperhatikan ketika menginstal GDAL dan Python Bindings.

Saya menginstal GDAL Core dan plugin (dll) dari gisinternals.com, tetapi entah bagaimana saya tidak berpikir untuk menginstal Python Bindings dari sana juga. Binding Python yang saya instal berasal dari situs yang berbeda (tidak dapat mengingat yang mana pada saat ini).

Ketika saya menginstal ulang GDAL dan Python Bindings semuanya dari gisinternals.com, saya berhasil membaca ReadAsArray.

Terima kasih untuk semua yang berkomentar dan menjawab dan saya minta maaf atas ketidaktahuan saya.

Brian
sumber
3

Mungkin ini masalah memori. Saat Anda menggunakan ReadAsArray, ia membawa data ke dalam memori, dan sementara 800mb tidak besar, itu juga tidak kecil. Sudahkah Anda mencoba membaca array dalam potongan?

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

Anda harus dapat mengulang-ulang array dan memprosesnya sekaligus, meskipun tergantung pada proses yang Anda lakukan, Anda mungkin harus membaca di area dengan tumpang tindih untuk menghindari efek tepi.

om_henners
sumber
Saya memang mencoba menggunakan potongan. Saya mencoba data = b.ReadAsArray(0,0, 500, 500)dengan hasil yang sama.
Brian
Hmm. Saya berasumsi Anda sudah mencoba format gambar lain? Juga, apakah ada pesan kesalahan khusus?
om_henners
Saya belum mencoba format lain. tidak ada pesan kesalahan, hanya sembulan yang mengatakan "python.exe telah berhenti bekerja".
Brian
Saya mengonversi file .img ke GeoTIFF pagi ini dan mencoba lagi. Tidak berhasil
Brian
Apakah ada cara untuk memetakan file memori dari gdal?
CMCDragonkai
1

Maaf saya terlambat ke pesta ini, tetapi masalah dasar Anda adalah bahwa 32-bit Python tidak dapat menyimpan raster yang sangat besar dalam memori. Anda dapat membaca raster besar Anda ke memori dalam potongan ukuran gigitan, tetapi kemudian Anda cukup terbatas dalam hal apa yang dapat Anda proses secara efisien tanpa sangat tidak efisien / sering membaca / menulis ke disk.

Apa yang saya lakukan sebagai gantinya (yang mengorbankan efisiensi karena disk baca / tulis) adalah memanggil ( melalui pembungkus EXE ) versi gisinternals.com 64-bit dari metode gdal apa pun yang Anda butuhkan. Berhati-hatilah dengan menggunakan modul subproses python dalam satu lingkaran (yaitu Anda mungkin ingin / perlu memanggil subproses secara berurutan ) karena Anda mungkin secara tidak sengaja menghasilkan terlalu banyak utas terbuka untuk kotak jendela Anda dan mendapatkan peringatan sistem yang tidak menyenangkan. Anda mengorbankan sedikit cara untuk disk baca / tulis dengan pendekatan gdal ini, tetapi efisiensi pemrosesan Anda hanya turun (yaitu relatif terhadap perhitungan cepat dalam memori cepat , jika kotak / perpustakaan Anda dapat mendukungnya) sekitar faktor atau 10.

ksed
sumber