gdalwarp menghasilkan raster kosong ketika dipanggil dari skrip python, tetapi tidak melalui baris perintah

8

Saya mencoba untuk menggabungkan beberapa data raster (semua .tif) hingga resolusi yang lebih kasar (dari .05 derajat hingga .25 derajat) menggunakan gdalwarp dalam python, tetapi perintahnya tidak berfungsi. Alih-alih mendapatkan output dengan rentang nilai yang luas, semua nilai output adalah 0. Resolusi dan kedalaman piksel / tipe sudah benar, tetapi nilainya tidak.

Berikut ini dokumentasi untuk perintah gdalwarp: http://www.gdal.org/gdalwarp.html

Saya memiliki dua file input yang ingin saya himpun hingga resolusi 0,25 derajat, menghasilkan beberapa output:

  • 'NDVI_raster': Input pertama adalah raster bertanda 16-bit yang mewakili NDVI, dengan nilai berkisar antara -10.000 hingga 10.000 dan nilai nodata -15.000.

  • 'nodata_mask': Yang kedua adalah topeng NoData, float 32-bit, di mana 1 = nilai data "baik", dan 0 = NoData.

Dengan 'NDVI_raster' sebagai input, saya ingin menghasilkan 7 output yang berbeda, masing-masing mewakili statistik yang berbeda. Saya melakukan ini dengan memanggil gdalwarp 7 kali, setiap kali mengatur metode resampling (-r) ke salah satu dari yang berikut: rata-rata, mode, maks, min, median, q1, q2. Saya akan memanggil output NDVI_ave.tif, NDVI_mode.tif, dll. Saat ini, saya menggunakan GDAL 1.10.1, yang hanya memungkinkan rata-rata dan mode, jadi saya menguji hanya dengan dua statistik ini sekarang.

Menggunakan 'nodata_mask' sebagai input, saya ingin akhirnya menghasilkan QAL (lapisan jaminan kualitas). Untuk melakukan ini, saya menggunakan gdalwarp, dengan mode resampling diatur ke 'rata-rata' untuk mengumpulkan hingga 0,25 derajat. Ini menghasilkan setiap piksel yang mewakili rasio piksel baik / total piksel dari input. Sebut saja output QAL.

Inilah yang ada di kode saya (menggunakan mode sebagai contoh untuk input pertama):

os.system('gdalwarp -tr .25 .25 -r mode -srcnodata -15000 %s %s' % (NDVI_raster, NDVI_mode))

Dan untuk lapisan QA:

os.system('gdalwarp -tr .25 .25 -r average -srcnodata -15000 %s %s' % (nodata_mask, QAL))

Hasilnya adalah raster dengan resolusi, proyeksi, dan kedalaman piksel yang benar, tetapi nilai pikselnya semua 0.

Adakah yang akrab dengan python / gdal tahu apa yang terjadi?


Saat memanggil perintah gdalwarp dari baris perintah (linux), saya mendapatkan hasil yang diinginkan. Saat menggunakan os.system untuk memanggil gdalwarp dari python, saya mendapatkan raster kosong. Jadi mungkin ada yang salah dengan binding gdal / python saya?


Alih-alih memanggil perintah melalui os.system, saya menggunakan subproses. Alat melalui metode ini juga tampaknya berjalan lancar, tetapi hasilnya sama: raster penuh 0's.


Saya mencoba memasukkan panggilan gdalwarp ke dalam skrip bash shell dan memanggil skrip shell itu dari python, tetapi hasilnya adalah sekelompok -1s bukannya 0s. Cukup aneh, saya telah mengujinya sebelumnya dan cukup yakin itu berhasil, tetapi tes itu dihapus dari server saya dan sekarang saya tidak dapat membuatnya kembali untuk beberapa alasan.


Menempatkan perintah gdalwarp dalam skrip bash shell dan kemudian memanggil skrip shell itu dari baris perintah memberi saya hasil yang diinginkan. Memanggil skrip shell yang sama dari python, tidak. Sepertinya ada yang salah dengan python, tapi apa dan bagaimana cara memperbaikinya?

pengguna20408
sumber
2
Itu tidak bisa menjadi masalah yang mengikat, Anda tidak menggunakannya. Anda menjalankan perintah gdalwarp. Anda harus memeriksa status kesalahan dari perintah gdalwarp, lihat: stackoverflow.com/questions/3791465/…
Zoltan
2
Untuk memperluas apa yang dikatakan Zoltan, Anda pada dasarnya memanggil program yang sama (gdalwarp). os.systemsebenarnya memulai sebuah shell dan mengeksekusi perintah yang diberikan. Selain nilai pengembalian, Anda mungkin harus memverifikasi variabel yang ingin Anda sampaikan (mis. Segala masalah penawaran? Dll.)
Evil Genius
Anda juga harus mempertimbangkan pindah dari os.systemke subprocessyang merupakan modul baru dan berisi sejumlah (keamanan) perbaikan.
Kersten
@Zoltan pesan kesalahan apa? Saya tidak mendapatkan pesan kesalahan karena perintah secara teknis bekerja, hanya outputnya tidak benar (nilai 0) .plz lihat pembaruan saya. Terima kasih!
user20408
2
Satu masalah adalah bahwa saya pikir Anda perlu menentukan -ot Float32atau sesuatu yang serupa untuk topeng kualitas, karena Anda tidak dapat mewakili fraksi dengan raster integer.
Nat Wilson

Jawaban:

2

Anda tidak mengatakan bagaimana Anda memulai skrip python / gdalwarp Anda. Saya menemukan bahwa cronjob tidak akan selalu memiliki lingkungan yang sama dengan lingkungan baris perintah saya. Saya harus mulai membuat lingkungan runtime untuk skrip jenis ini. Dengan itu dikatakan, jika Anda memulai skrip Anda dari, katakanlah, ikon di desktop Anda, maka itu mungkin tidak memiliki lingkungan runtime yang sama dengan lingkungan baris perintah Anda. "PYTHONPATH" mungkin salah satu variabel lingkungan yang harus Anda atur. Selain itu, Anda mungkin harus mengatur variabel untuk gdalwarp. Akhirnya, file data Anda mungkin tidak berada di lokasi yang benar. Anda mungkin harus menetapkan jalur absolut seperti / xxx / xxxx / NDVI_raster atau menggunakan tilda ~ / NDVI_raster. Seperti PYTHONPATH, Anda mungkin juga harus menyiapkan PATH dan variabel lingkungan lainnya."ekspor atau sumber" pengaturan sames di awal skrip Anda.

Greg
sumber
1

Saya punya masalah ini juga. Saya akhirnya menemukan dalam kasus saya itu karena saya baru saja membuat gambar on-disk menggunakan gdalbinding Python , tapi saya belum menutup objek gdal.Datasetdalam memori, jadi penulisan-ke-disk hanya selesai sebagian. Cukup aneh, satu-satunya cara saya bisa menemukan untuk menutup dengan gdal.DatasetPython adalah: del variable_name_of_dataset- sangat jelek!

Dalam Cada GDALClose()metode yang saat ini tidak diterapkan oleh API Python GDAL, tetapi Rasteriotidak: https://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io.pyx#L1463

Lihat juga: Mengapa menutup dataset dalam GDAL Python?

Hazzles
sumber