Cara menambahkan raster berukuran berbeda di GDAL sehingga hasilnya hanya di wilayah berpotongan


11

Saya sedang menulis metode Python yang menambahkan dua raster dan menghasilkan output raster tunggal. Untuk alasan di luar kendali saya, luasan raster input berbeda, tetapi mereka tumpang tindih.

Apakah mungkin untuk beroperasi secara eksklusif pada piksel raster input yang tumpang tindih di 2 wilayah yang tumpang tindih untuk menghasilkan ouput saya sedemikian rupa sehingga tingkat raster output hanya merupakan daerah berpotongan dari dua input?

Jawaban:


12

Hal pertama yang harus dilakukan adalah menentukan persegi panjang yang tumpang tindih dalam koordinat geospasial. Untuk melakukan ini, Anda mendapatkan geotransform untuk setiap gambar sumber:

gt1 = ds1.GetGeoTransform()
# r1 has left, top, right, bottom of dataset's bounds in geospatial coordinates.
r1 = [gt1[0], gt1[3], gt1[0] + (gt1[1] * ds1.RasterXSize), gt1[3] + (gt1[5] * ds1.RasterYSize)]

# Do the same for dataset 2 ...

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

Kemudian konversi persegi panjang itu menjadi piksel untuk setiap gambar dengan mengurangi koordinat atas dan kiri dan membaginya dengan ukuran piksel, membulatkan ke atas.

Dari sini Anda dapat memanggil ReadRaster()setiap gambar, memberikan luasan piksel yang baru saja Anda hitung:

band.ReadRaster(px1[0], px1[1], px1[2] - px1[0], px1[3] - px1[1], px1[2] - px1[0], px1[3] - px1[1],
                # <band's datatype here>
)

Saya sedikit lelah, jadi jika ini tidak masuk akal, beri tahu saya!


Apakah ini juga berfungsi untuk raster dengan proyeksi yang berbeda (alias sistem referensi koordinat / sistem referensi spasial)? Dan bahkan jika proyeksi itu sama: Apakah ini juga berhasil jika gt1[1]dan gt2[1](atau gt1[5]dan gt2[5]) memiliki tanda-tanda yang berlawanan? (Yang akan membalik salah satu raster secara vertikal maupun horizontal, saya pikir.) Atau jika abs(gt1[2])dan abs(gt1[4])lebih besar dari abs(gt1[1])dan abs(gt1[5])tapi abs(gt2[2])dan abs(gt2[4])lebih kecil dari abs(gt2[1])dan abs(gt2[5])(yang mungkin akan membalik salah satu raster diagonal)?
das-g

6

Elemen ketiga persimpangan haruslah min (r1 [2], r2 [2]):

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

Juga, saya akan merekomendasikan beberapa logika untuk memeriksa apakah dataset benar-benar berpotongan.

Ini adalah salah satu pendekatan:

if (intersection[2] < intersection[0]) or (intersection[1] < intersection[3]):
    intersection = None
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.