Proyeksi ulang skrip dengan Python dengan GDAL

10

Saya mengalami banyak masalah dengan GDAL. Selain hanya kadang-kadang kurang dokumentasi, tampaknya ada sedikit dukungan di Python. Ngomong-ngomong, ini hanyalah skrip proyek kumpulan yang berjalan demikian:

source_file = gdal.Open(filepath.encode("ascii"))
source_wkt = source_file.GetProjectionRef()
source_srs = osr.SpatialReference()
source_srs.ImportFromWkt(source_wkt)                            

reproj_file = gdal.AutoCreateWarpedVRT(source_file, source_wkt, dest_wkt)
gdal.ReprojectImage(source_file, reproj_file, source_wkt, dest_wkt)
reproj_attributes = reproj_file.GetGeoTransform()

driver = gdal.GetDriverByName("GTiff")
dest_file = driver.CreateCopy(outputpath.encode("ascii"), reproj_file, 0)

Bagian dest_srs dan des_wkt tidak didefinisikan dalam potongan kode ini tetapi berada di suatu tempat di luar loop (karena hanya perlu didefinisikan sekali). Tampaknya berfungsi sekali, saya bisa mendapatkan satu tif tampak bagus dari itu, lalu beri saya 'ERROR 6 WriteBlock () tidak didukung' dan python crash. Semuanya GeoTIFF dibuat dengan cara yang sama dengan data dasar yang sama (hanya waktu yang berbeda).

Juga karena sifat proyeksi ulang (dari GCS ke PCS), AutoCreateWarpedVRT cenderung membuat banyak ruang kosong, tetapi memberinya nilai 0, yang merupakan masalah karena itu bisa menjadi nilai data nyata. Apakah ada cara untuk mengatur nilai nodata ke -99?

wowohweewah
sumber
6
Saya kira Anda memiliki alasan untuk melakukan ini dengan python, tetapi hanya untuk memastikan: Anda sadar bahwa tujuan utama utilitas gdalwarp adalah untuk memproyeksikan ulang raster? mis gdalwarp -t_srs '+proj=utm +zone=11 +datum=WGS84' raw_spot.tif utm11.tif. Sudah ada sejak lama, kaya fitur, teruji dengan baik, dan kemungkinan lebih cepat dari pendekatan python murni.
matt wilkie
Menghapus perintah ReprojectImage, komputer saya memproyeksikan ulang gambar tanpa kesalahan.
Roger Veciana

Jawaban:

3

Tentang AutoCreateWarpedVRTruang kosong.

Lihatlah tiket kesalahan gdal ini .

Secara khusus dinyatakan di sana:

Jika saya menambahkan baris ini ke rgbwarped.vrt yang dihasilkan pada langkah kedua semuanya OK:

<Option name="UNIFIED_SRC_NODATA">YES</Option>

Aplikasi C ++ dapat mengatur opsi ini secara langsung. Aplikasi yang menggunakan AutoCreateWarpedVRT dari SWIG binding harus menambahkan baris ini ke teks VRT yang diproduksi secara manual.

Alex Markov
sumber
Saya tidak mencoba Optionmemperbaiki, tetapi beralih ke menelepon gdalwarpmelalui subprocessmemecahkan masalah dengan membuka kedok NoData.
j08lue