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?

Kaya
sumber

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!

MerseyViking
sumber
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
David Shean
sumber