ชุดข้อมูล Gdal.ReadAsArray () ขัดข้อง Python


12

ฉันใช้ Python 2.6.5 (32 บิต) กับ Numpy 1.3 และ Gdal 1.9.1 ติดตั้งบน Windows 7 64 บิต ฉันพยายามอ่านชุดข้อมูลแรสเตอร์ 800 MB Imagine (.img) ในอาร์เรย์ Numpy เพื่อทำพีชคณิตแบบแรสเตอร์ แต่ทันทีที่ฉันเรียกใช้รหัสต่อไปนี้ Python.exe จึงล้มเหลว

from osgeo import gdal

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

Python.exe ขัดข้องขณะb.ReadAsArray()โทร ฉันได้ทำการค้นหาโดย Google และพบบทความจาก Gdal 1.6 ที่กล่าวถึงปัญหานี้กับ Windows 7 64 บิต แต่พวกเขายังกล่าวว่ามันได้รับการแก้ไขในเวอร์ชันพัฒนาล่าสุดในเวลานั้น

มีคนอื่นที่มีปัญหานี้หรือไม่? วิธีแก้ปัญหาใด ๆ

UPDATE:

ฉันตัดสินใจที่จะแก้จุดบกพร่องรหัสใน PyDev เพื่อพยายามที่จะตรวจสอบว่ามันอยู่ที่ไหนความล้มเหลว จากสิ่งที่ฉันสามารถบอกได้ (ยังไม่ได้รับข้อความแสดงข้อผิดพลาด) มันล้มเหลวในบรรทัดที่ 22 ของ gdal_array.py

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

เมื่อฉันก้าวเข้าสู่บรรทัดโค้ดด้านบนมันจะนำฉันเข้าสู่โมดูลinit .py ของ numpy เมื่อฉันถึงจุดสิ้นสุดของ numpy __ init __ .py โมดูลมันก้าวถอยหลังกลับไปที่บรรทัดของโค้ดด้านบน จากนั้นเมื่อฉันกดปุ่มเข้าสู่ขั้นตอนซึ่งควรพาฉันไปที่บรรทัดถัดไปภายใน gdal_array.py สคริปต์เพิ่งจบโดยไม่มีข้อความแสดงข้อผิดพลาดหรืออะไรเลย

อัปเดต # 2:

ฉันถอนการติดตั้ง GDAL 1.9.1 และติดตั้ง GDAL 1.6.1 จาก Python Cheeseshop และ Windows Binaries ของ OSGeo ยังคงมีปัญหาเดียวกัน


ฉันกำลังมีปัญหานี้ คุณใช้การผูกงูหลาม gdal จาก Tamas ที่ gis.internals หรือไม่? หากเป็นเช่นนั้นให้ย้ายส่วนที่เพิ่มเติมไปยัง PATH ของคุณไปทางด้านหน้า ห้องสมุดอื่นบางแห่งทำให้ฉันมีปัญหา
Jay Laura

ฉันเชื่อว่าฉันดาวน์โหลดจากภายในของเขา ฉันจะพยายามปรับเส้นทางของฉันเมื่อฉันไปทำงานในวันพรุ่งนี้ ขอบคุณสำหรับคำแนะนำ.
Brian

1
หากไม่ได้ผลฉันเพิ่งเปลี่ยนไปใช้แพ็คเกจเหล่านี้ - lfd.uci.edu/~gohlke/pythonlibs
Jay Laura

ฉันพยายามย้ายสิ่งต่าง ๆ ใน System Path ของฉัน (ตัวแปรสภาวะแวดล้อม PATH ใน Windows) โดยไม่มีโชค ฉันยังถอนการติดตั้งรุ่น GDAL ของฉันและติดตั้งรุ่นของ GDAL ในลิงก์ที่คุณให้ไว้และยังคงมีปัญหาเดียวกัน
Brian

อืม .... รุ่นที่ฉันเชื่อมโยงเป็นเพียงการผูกดังนั้นคุณยังต้องมี GDAL core จาก Tamas หากการโทรอื่นใช้งานได้แสดงว่าทำงานได้ดี สามสิ่งที่ต้องลองนั่นคือช็อตยาว (เรียงตาม 'ความยาว' 1) อัปเดตเวอร์ชันของ Numpy 2) gdal_translate เป็น gtiff และลองใช้โค้ดบนภาพนั้น 3) ผนวก ReadAsArray () กับ .astype (numpy.float32) ภาพสาธารณะหรือไม่ ฉันสามารถทดสอบกับเครื่องของฉัน คุณสามารถโพสต์การติดตามสแต็กถ้าไม่มีงานเหล่านั้นหรือไม่
Jay Laura

คำตอบ:


5

เนื่องจากมีผู้วิจารณ์หลายคนสงสัยว่านี่เป็นปัญหากับการติดตั้งของฉัน เห็นได้ชัดว่าฉันไม่ได้ใส่ใจอย่างใกล้ชิดเมื่อติดตั้ง GDAL และ Python Bindings

ฉันติดตั้ง GDAL Core และปลั๊กอิน (dll) จาก gisinternals.com แต่อย่างใดฉันไม่คิดว่าจะติดตั้ง Python Bindings จากที่นั่นเช่นกัน การผูก Python ที่ฉันติดตั้งนั้นมาจากไซต์อื่น (จำไม่ได้ว่าตอนนี้อันไหน)

เมื่อฉันติดตั้ง GDAL และ Python Bindings ใหม่ทั้งหมดจาก gisinternals.com ฉันสามารถ ReadAsArray สำเร็จ

ขอบคุณทุกคนที่แสดงความคิดเห็นและตอบและฉันขอโทษสำหรับความไม่รู้ของฉัน


3

เป็นไปได้ว่ามันเป็นปัญหาหน่วยความจำ เมื่อคุณใช้ ReadAsArray ข้อมูลจะถูกนำไปไว้ในหน่วยความจำและในขณะที่ 800mb นั้นไม่ใหญ่มาก คุณได้ลองอ่านอาเรย์เป็นชิ้น ๆ แล้วหรือยัง?

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

คุณควรวนลูปผ่านอาร์เรย์และประมวลผลทีละชิ้นแม้ว่าขึ้นอยู่กับการประมวลผลที่คุณกำลังทำคุณอาจดูการอ่านในพื้นที่ที่มีการทับซ้อนเพื่อหลีกเลี่ยงเอฟเฟกต์ขอบ


ฉันลองใช้ชิ้น ฉันพยายามdata = b.ReadAsArray(0,0, 500, 500)ด้วยผลลัพธ์เดียวกัน
Brian

อืมมม ฉันสมมติว่าคุณได้ลองรูปแบบไฟล์อื่นแล้วใช่ไหม นอกจากนี้ยังมีข้อความข้อผิดพลาดเฉพาะหรือไม่?
om_henners

ฉันยังไม่ได้ลองรูปแบบอื่นเลย ไม่มีข้อความแสดงข้อผิดพลาดมีเพียงป๊อปอัปที่ระบุว่า "python.exe หยุดทำงาน"
Brian

ฉันแปลงไฟล์. img เป็น GeoTIFF เมื่อเช้านี้และลองอีกครั้ง ไม่มีโชค.
Brian

มีวิธีในการแมปหน่วยความจำไฟล์จาก gdal หรือไม่?
CMCDragonkai

1

ขออภัยฉันมางานปาร์ตี้สายนี้ แต่ปัญหาพื้นฐานของคุณคือ Python แบบ 32 บิตไม่สามารถเก็บ rasters ที่มีขนาดใหญ่มากในหน่วยความจำได้ คุณสามารถอ่านแรสเตอร์ขนาดใหญ่ของคุณลงในหน่วยความจำด้วยชิ้นขนาดกัด แต่จากนั้นคุณมีข้อ จำกัด ในแง่ของสิ่งที่คุณสามารถประมวลผลได้อย่างมีประสิทธิภาพโดยไม่ต้องอ่าน / เขียนลงดิสก์อย่างไม่มีประสิทธิภาพ

สิ่งที่ฉันทำแทน (ซึ่งเสียสละประสิทธิภาพเนื่องจากดิสก์อ่าน / เขียน) คือการเรียก ( ผ่านการตัด EXE ) gisinternals.com รุ่น 64 บิตของวิธี gdal ใดก็ตามที่คุณต้องการ ระวังการใช้โมดูลย่อยของ python ในลูป (เช่นคุณอาจต้องการ / จำเป็นต้องเรียก subprocess ตามลำดับ ) เนื่องจากคุณอาจสร้างเธรดที่เปิดมากเกินไปสำหรับกล่อง windows ของคุณและรับคำเตือนของระบบที่เป็นลางไม่ดี คุณเสียสละนิดหน่อยในการอ่าน / เขียนดิสก์ด้วยวิธี gdal นี้ แต่ประสิทธิภาพในการประมวลผลของคุณลดลงเพียงอย่างเดียว (เช่นเมื่อเปรียบเทียบกับการคำนวณในหน่วยความจำที่รวดเร็วขึ้นหากกล่อง / ไลบรารีของคุณสามารถรองรับได้) 10

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.