Tôi đang cố gắng tổng hợp một số dữ liệu raster (tất cả .tif) lên đến độ phân giải thô hơn (từ 0,05 độ đến 0,25 độ) bằng cách sử dụng gdalwarp trong python, nhưng lệnh không hoạt động. Thay vì nhận đầu ra với một phạm vi giá trị rộng, tất cả các giá trị của đầu ra là 0. Độ phân giải và độ sâu / loại pixel là chính xác, nhưng các giá trị thì không.
Dưới đây là tài liệu hướng dẫn lệnh gdalwarp: http://www.gdal.org/gdalwarp.html
Tôi có hai tệp đầu vào mà tôi muốn tổng hợp độ phân giải lên tới 0,25 độ, tạo ra một số đầu ra:
'NDVI_raster': Đầu vào đầu tiên là raster có chữ ký 16 bit đại diện cho NDVI, với các giá trị nằm trong khoảng từ -10.000 đến 10.000 và các giá trị gật đầu là -15.000.
'gật đầu_mask': Thứ hai là mặt nạ NoData, float 32 bit, trong đó 1 = giá trị của dữ liệu "tốt" và 0 = NoData.
Với 'NDVI_raster' làm đầu vào, tôi muốn tạo ra 7 đầu ra khác nhau, mỗi đầu ra đại diện cho một thống kê khác nhau. Tôi làm điều này bằng cách gọi gdalwarp 7 lần, mỗi lần đặt phương thức lấy mẫu lại (-r) thành một trong các cách sau: trung bình, chế độ, max, min, trung vị, q1, q2. Tôi sẽ gọi các đầu ra NDVI_ave.tif, NDVI_mode.tif, v.v. Ngay bây giờ, tôi đang sử dụng GDAL 1.10.1, chỉ cho phép mức trung bình và chế độ, vì vậy tôi hiện đang thử nghiệm với hai chỉ số này.
Sử dụng 'gật đầu_mask' làm đầu vào, cuối cùng tôi muốn tạo ra một QAL (lớp đảm bảo chất lượng). Để làm điều này, tôi sử dụng gdalwarp, với chế độ lấy mẫu lại được đặt thành 'trung bình' để tổng hợp lên tới 0,25 độ. Điều này dẫn đến mỗi pixel đại diện cho tỷ lệ pixel tốt / tổng số pixel từ đầu vào. Hãy gọi đầu ra QAL.
Đây là những gì trong mã của tôi (sử dụng chế độ làm ví dụ cho đầu vào đầu tiên):
os.system('gdalwarp -tr .25 .25 -r mode -srcnodata -15000 %s %s' % (NDVI_raster, NDVI_mode))
Và đối với lớp QA:
os.system('gdalwarp -tr .25 .25 -r average -srcnodata -15000 %s %s' % (nodata_mask, QAL))
Kết quả là các raster với độ phân giải, hình chiếu và độ sâu pixel chính xác, nhưng các giá trị pixel đều bằng 0.
Bất cứ ai quen thuộc với python / gdal đều biết chuyện gì đang xảy ra?
Khi gọi lệnh gdalwarp từ dòng lệnh (linux), tôi nhận được kết quả mong muốn. Khi sử dụng os.system để gọi gdalwarp từ python, tôi nhận được các raster trống. Vì vậy, có lẽ có điều gì đó không ổn với các ràng buộc gdal / python của tôi?
Thay vì gọi lệnh thông qua os.system, tôi đã sử dụng quy trình con. Công cụ thông qua phương thức này cũng có vẻ chạy trơn tru, nhưng kết quả là như nhau: một raster đầy 0.
Tôi đã thử đặt lệnh gọi gdalwarp trong tập lệnh bash shell và gọi tập lệnh shell đó từ python, nhưng kết quả là một loạt -1 thay vì 0. Thật kỳ lạ, tôi đã thử nghiệm nó trước đây và khá chắc chắn rằng nó đã hoạt động, nhưng thử nghiệm đã bị xóa khỏi máy chủ của tôi và bây giờ tôi không thể tạo lại nó vì một số lý do.
Đặt lệnh gdalwarp trong tập lệnh bash shell và sau đó gọi tập lệnh shell đó từ dòng lệnh cho tôi kết quả mong muốn. Tuy nhiên, việc gọi cùng một kịch bản shell từ python. Trông có vẻ như có gì đó không ổn với python, nhưng tôi phải làm gì và làm cách nào để khắc phục nó?
os.system
thực sự khởi động một shell và thực thi lệnh đã cho. Ngoài giá trị trả về, có lẽ bạn nên xác minh các biến mà bạn đang cố gắng chuyển vào (ví dụ: có bất kỳ vấn đề trích dẫn nào không? V.v.)
os.system
tới subprocess
đó là mô-đun mới hơn và chứa một số (an ninh) cải tiến.
-ot Float32
hoặc một cái gì đó tương tự cho mặt nạ chất lượng, bởi vì bạn không thể biểu diễn các phân số với một raster số nguyên.