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?
os.system
sebenarnya 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.)os.system
kesubprocess
yang merupakan modul baru dan berisi sejumlah (keamanan) perbaikan.-ot Float32
atau sesuatu yang serupa untuk topeng kualitas, karena Anda tidak dapat mewakili fraksi dengan raster integer.Jawaban:
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.
sumber
Saya punya masalah ini juga. Saya akhirnya menemukan dalam kasus saya itu karena saya baru saja membuat gambar on-disk menggunakan
gdal
binding Python , tapi saya belum menutup objekgdal.Dataset
dalam memori, jadi penulisan-ke-disk hanya selesai sebagian. Cukup aneh, satu-satunya cara saya bisa menemukan untuk menutup dengangdal.Dataset
Python adalah:del variable_name_of_dataset
- sangat jelek!Dalam
C
adaGDALClose()
metode yang saat ini tidak diterapkan oleh API Python GDAL, tetapiRasterio
tidak: https://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io.pyx#L1463Lihat juga: Mengapa menutup dataset dalam GDAL Python?
sumber