gdalwarp tạo ra các trình quét trống khi được gọi từ tập lệnh python, nhưng không thông qua dòng lệnh


8

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ó?


2
Nó không thể là một vấn đề ràng buộc, bạn đã không sử dụng chúng. Bạn thực hiện lệnh gdalwarp. Bạn nên kiểm tra trạng thái lỗi của lệnh gdalwarp, xem: stackoverflow.com/questions/3791465/
Zoltan

2
Để mở rộng những gì Zoltan đang nói, về cơ bản bạn đang gọi cùng một chương trình (gdalwarp). os.systemthự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.)
Evil Genius

Bạn cũng nên xem xét chuyển từ os.systemtới subprocessđó là mô-đun mới hơn và chứa một số (an ninh) cải tiến.
Kersten

@Zoltan thông báo lỗi gì? Tôi đã không nhận được thông báo lỗi vì lệnh kỹ thuật đã hoạt động, chỉ là đầu ra không đúng (giá trị 0) .plz xem cập nhật của tôi. cảm ơn!
dùng20408

2
Một vấn đề là tôi nghĩ rằng bạn sẽ cần chỉ định -ot Float32hoặ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.
Nat Wilson

Câu trả lời:


2

Bạn không nói làm thế nào bạn bắt đầu kịch bản python / gdalwarp của bạn. Tôi phát hiện ra rằng một cronjob sẽ không luôn có cùng môi trường với môi trường dòng lệnh của tôi. Tôi đã phải bắt đầu tạo môi trường thời gian chạy cho các loại kịch bản này. Như đã nói, nếu bạn khởi động tập lệnh từ, giả sử, một biểu tượng trên màn hình của bạn, thì nó có thể không có môi trường thời gian chạy giống như môi trường dòng lệnh của bạn. "PYTHONPATH" có thể là một trong những biến môi trường mà bạn phải đặt. Ngoài ra, bạn có thể phải đặt biến cho gdalwarp. Cuối cùng, các tệp dữ liệu của bạn có thể không ở đúng vị trí. Bạn có thể phải đặt một đường dẫn tuyệt đối, chẳng hạn như / xxx / xxxx / NDVI_raster hoặc sử dụng tilda ~ / NDVI_raster. Giống như PYTHONPATH, bạn cũng có thể phải thiết lập PATH và các biến môi trường khác."xuất hoặc nguồn" cài đặt sames ở đầu tập lệnh của bạn.


1

Tôi cũng có vấn đề này. Cuối cùng tôi đã tìm ra trong trường hợp của mình, đó là vì tôi vừa tạo hình ảnh trên đĩa bằng gdalcác ràng buộc Python , nhưng tôi đã không đóng gdal.Datasetđối tượng trong bộ nhớ, do đó, việc ghi vào đĩa chỉ hoàn thành một phần. Thật kỳ lạ, cách duy nhất tôi có thể tìm thấy để đóng một gdal.DatasetPython là: del variable_name_of_dataset- thật xấu xí!

Trong Cđó, có một GDALClose()phương pháp hiện tại không được API Python GDAL triển khai, nhưng Rasteriothực hiện: https://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io

Xem thêm: Tại sao đóng một tập dữ liệu trong GDAL Python?

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.