Come aggiungere raster di dimensioni diverse in GDAL in modo che il risultato sia solo nell'area intersecata


11

Sto scrivendo un metodo Python che aggiunge due raster e genera un singolo output raster. Per ragioni indipendenti dalla mia volontà, le estensioni dei raster di input sono diverse, ma si sovrappongono.

È possibile operare esclusivamente sui pixel raster di input che si sovrappongono nelle 2 regioni sovrapposte per generare il mio output in modo tale che l'estensione raster di output sia solo la regione di intersezione dei due input?

Risposte:


12

La prima cosa da fare è determinare il rettangolo sovrapposto in coordinate geospaziali. Per fare ciò, ottieni la geotrasformazione per ogni immagine sorgente:

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

Quindi converti quel rettangolo in pixel per ogni immagine sottraendo le coordinate superiore e sinistra e dividendole per la dimensione dei pixel, arrotondando per eccesso.

Da qui puoi chiamare ReadRaster()ogni immagine, dandogli le estensioni in pixel che hai appena calcolato:

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

Sono un po 'stanco, quindi se questo non ha molto senso, fammi sapere!


Funziona anche con raster con proiezioni diverse (ovvero sistemi di riferimento di coordinate / sistemi di riferimento spaziale)? E anche se le proiezioni sono le stesse: funziona anche se gt1[1]e gt2[1](o gt1[5]e gt2[5]) hanno segni opposti? (Quale potrebbe capovolgere uno dei raster in verticale o in orizzontale, credo.) Oppure se abs(gt1[2])e abs(gt1[4])sono maggiori di abs(gt1[1])e abs(gt1[5])ma abs(gt2[2])e abs(gt2[4])sono più piccoli di abs(gt2[1])e abs(gt2[5])(che probabilmente getterebbero uno dei raster in diagonale)?
das-g,

6

Il terzo elemento di intersezione dovrebbe essere 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])]

Inoltre, consiglierei un po 'di logica per verificare che i set di dati si intersecino effettivamente.

Questo è un approccio:

if (intersection[2] < intersection[0]) or (intersection[1] < intersection[3]):
    intersection = None
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.