GDAL'de farklı boyutlu rasterler nasıl eklenir, böylece sonuç sadece kesişen bölgede olur


11

İki raster ekleyen ve tek bir raster çıktı üreten bir Python yöntemi yazıyorum. Kontrolüm dışındaki nedenlerden ötürü, giriş rasterlerinin boyutları farklı, ancak örtüşüyorlar.

Çıkış çıkışımın boyutu iki girişin sadece kesişen bölgesi olacak şekilde çıkışımı oluşturmak için üst üste binen 2 bölgede çakışan giriş tarama pikselleri üzerinde çalışmak mümkün müdür?

Yanıtlar:


12

Yapılacak ilk şey, jeo-uzamsal koordinatlarda çakışan dikdörtgeni belirlemektir. Bunu yapmak için, her kaynak görüntü için coğrafi dönüşüm elde edersiniz:

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])]

Ardından, üst ve sol koordinatları çıkararak ve yuvarlayarak piksel boyutuna bölerek bu dikdörtgeni her görüntü için piksele dönüştürün.

Buradan ReadRaster(), her bir görüntüyü çağırarak , yeni hesapladığınız piksel boyutlarını verin:

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>
)

Biraz yorgunum, eğer bu pek mantıklı değilse, bana bildirin!


Bu aynı zamanda farklı projeksiyonlara sahip rasterler için de kullanılabilir mi? Projeksiyonlar aynı olsa bile: gt1[1]ve gt2[1](veya gt1[5]ve gt2[5]) karşıt işaretler varsa bu da işe yarar mı? (Dikey veya yatay raster birini çevirmek olurdu Ki, ben. Düşünüyorum) Veya eğer abs(gt1[2])ve abs(gt1[4])daha büyük olan abs(gt1[1])ve abs(gt1[5])ancak abs(gt2[2])ve abs(gt2[4])daha küçük abs(gt2[1])ve abs(gt2[5])(muhtemelen çapraz raster birini çevirmek olurdu)?
das-g

6

Kesişimin üçüncü elemanı min olmalıdır (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])]

Ayrıca, veri kümelerinin gerçekten kesiştiğini kontrol etmek için bazı mantık öneririm.

Bu bir yaklaşımdır:

if (intersection[2] < intersection[0]) or (intersection[1] < intersection[3]):
    intersection = None
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.