Bộ dữ liệu Gdal.ReadAsArray () gặp sự cố với Python


12

Tôi đang sử dụng Python 2.6.5 (32 bit) với Numpy 1.3 và Gdal 1.9.1 được cài đặt trên Windows 7 64bit. Tôi đang cố gắng đọc bộ dữ liệu raster Tưởng tượng (.img) 800 MB vào một mảng Numpy để thực hiện một số đại số raster, nhưng ngay khi tôi chạy đoạn mã sau, Python.exe gặp sự cố.

from osgeo import gdal

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

Python.exe gặp sự cố trong b.ReadAsArray()cuộc gọi. Tôi đã thực hiện một số tìm kiếm trên Google và tìm thấy các bài viết có niên đại từ Gdal 1.6 có đề cập đến vấn đề này với Windows 7 64bit, nhưng họ cũng đề cập rằng nó đã được sửa trong các phiên bản phát triển mới nhất tại thời điểm đó.

Có ai khác có vấn đề này? Bất kỳ cách giải quyết?

CẬP NHẬT:

Tôi quyết định gỡ lỗi mã trong PyDev để cố gắng xác định nơi nó bị lỗi. Từ những gì tôi có thể nói (vẫn không nhận được bất kỳ thông báo lỗi nào), nó không thành công trên dòng 22 của gdal_array.py.

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

Khi tôi bước vào dòng mã ở trên, nó đưa tôi vào mô-đun init .py của numpy. Khi tôi đạt đến cuối của numpy. __ init __ .py mô-đun, nó bước trở lại dòng mã trên. Sau đó, khi tôi nhấn nút bước vào, nút này sẽ đưa tôi đến dòng tiếp theo trong gdal_array.py, tập lệnh chỉ chấm dứt mà không có thông báo lỗi hoặc bất cứ điều gì.

CẬP NHẬT # 2:

Tôi đã gỡ cài đặt GDAL 1.9.1 và cài đặt GDAL 1.6.1 từ Python Cheeseshop và Windows Binaries của OSGeo. Vẫn có vấn đề tương tự.


Tôi đã có vấn đề này. Bạn có đang sử dụng các ràng buộc trăn gdal từ Tamas tại gis.iternals không? Nếu vậy, hãy di chuyển các bổ sung của bạn vào ĐƯỜNG của bạn lên phía trước. Một số thư viện khác đã gây ra một số vấn đề cho tôi.
Jay Laura

Tôi tin rằng tôi đã tải về từ nội bộ của mình. Tôi sẽ cố gắng điều chỉnh con đường của mình khi tôi đến văn phòng vào ngày mai. Cảm ơn vì lời khuyên.
Brian

1
Nếu điều đó không hiệu quả, gần đây tôi đã chuyển sang sử dụng các gói này - lfd.uci.edu/~gohlke/pythonlibs
Jay Laura

Tôi đã thử di chuyển mọi thứ xung quanh trong Đường dẫn hệ thống (biến môi trường PATH trong Windows) mà không gặp may. Tôi cũng đã gỡ cài đặt phiên bản GDAL của mình và cài đặt phiên bản GDAL trên liên kết bạn cung cấp và vẫn gặp vấn đề tương tự.
Brian

Hmmm .... phiên bản mà tôi liên kết chỉ là các ràng buộc, vì vậy bạn vẫn cần phải có lõi GDAL từ Tamas. Nếu các cuộc gọi khác làm việc mặc dù, đó là hoạt động tốt. Ba điều cần thử đó là những cú đánh dài (theo thứ tự 'độ dài'. 1) Cập nhật phiên bản Numpy của bạn. 2) gdal_translate để gtiff và thử mã trên hình ảnh đó. 3) nối thêm ReadAsArray () với .astype (numpy.float32). Là hình ảnh công khai? Tôi có thể kiểm tra nó trên máy của tôi. Bạn có thể đăng theo dõi ngăn xếp nếu không ai trong số đó làm việc?
Jay Laura

Câu trả lời:


5

Như nghi ngờ của nhiều người bình luận, đây là một vấn đề với cài đặt của tôi. Rõ ràng, tôi đã không chú ý đúng mức khi cài đặt GDAL và Python Bindings.

Tôi đã cài đặt GDAL Core và các plugin (dll's) từ gisi INTERNals.com, nhưng bằng cách nào đó tôi không nghĩ sẽ cài đặt Bindings Python từ đó. Các ràng buộc Python tôi đã cài đặt là từ một trang web khác (không thể nhớ cái nào vào thời điểm này).

Khi tôi cài đặt lại GDAL và Python Bindings từ gisi INTERNals.com, tôi đã có thể đọc thành công ReadAsArray.

Cảm ơn tất cả những người đã bình luận và trả lời và tôi xin lỗi vì sự thiếu hiểu biết của tôi.


3

Có thể đó là vấn đề về trí nhớ. Khi bạn sử dụng ReadAsArray, nó mang dữ liệu vào bộ nhớ và trong khi 800mb không lớn, nó cũng không nhỏ. Bạn đã thử đọc các mảng trong chunk?

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

Bạn sẽ có thể lặp qua mảng và xử lý từng mảng một, mặc dù tùy thuộc vào quá trình xử lý mà bạn có thể nên tìm đọc ở các khu vực có chồng chéo để tránh hiệu ứng cạnh.


Tôi đã thử sử dụng chunk. Tôi đã thử data = b.ReadAsArray(0,0, 500, 500)với kết quả tương tự.
Brian

Hừm. Tôi cho rằng bạn đã thử các định dạng hình ảnh khác? Ngoài ra, có một thông báo lỗi cụ thể?
om_henners

Tôi chưa thử bất kỳ định dạng nào khác. không có thông báo lỗi, chỉ có một cửa sổ bật lên cho biết "python.exe đã ngừng hoạt động".
Brian

Tôi đã chuyển đổi tệp .img thành GeoTIFF sáng nay và thử lại. Không may mắn.
Brian

Có cách nào để bộ nhớ ánh xạ tập tin từ gdal?
CMCDragonkai

1

Xin lỗi tôi đến bữa tiệc muộn này, nhưng vấn đề cơ bản của bạn là Python 32 bit không thể lưu trữ các trình quét rất lớn trong bộ nhớ. Bạn có thể đọc raster lớn của mình vào bộ nhớ trong các đoạn có kích thước vừa phải, nhưng sau đó bạn khá hạn chế về những gì bạn có thể xử lý hiệu quả mà không cần đọc / ghi thường xuyên không hiệu quả / thường xuyên vào đĩa.

Thay vào đó, những gì tôi làm (hy sinh một số hiệu quả do đọc / ghi đĩa) là gọi ( thông qua EXE-quấn ) phiên bản gisi INTERNals.com 64 bit của bất kỳ phương thức gdal nào bạn cần. Hãy cẩn thận với việc sử dụng mô đun quy trình con của python trong một vòng lặp (nghĩa là bạn có thể muốn / cần gọi tuần tự quy trình con ) vì bạn có thể vô tình tạo quá nhiều luồng mở cho hộp cửa sổ của mình và nhận được cảnh báo hệ thống đáng ngại. Bạn hy sinh một chút để đọc / ghi đĩa theo cách tiếp cận gdal này, nhưng hiệu quả xử lý của bạn chỉ giảm (nghĩa là liên quan đến tính toán trong bộ nhớ nhanh , nếu hộp / thư viện của bạn có thể hỗ trợ nó) theo một yếu tố hoặc 10.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.