Comment ajouter des rasters de différentes tailles dans GDAL pour que le résultat soit uniquement dans la région intersectée

11

J'écris une méthode Python qui ajoute deux rasters et génère une seule sortie raster. Pour des raisons indépendantes de ma volonté, les étendues des rasters en entrée sont différentes, mais elles se chevauchent.

Est-il possible d'opérer exclusivement sur les pixels du raster en entrée qui se chevauchent dans les 2 régions qui se chevauchent pour générer ma sortie de telle sorte que l'étendue du raster en sortie ne soit que la région d'intersection des deux entrées?

Riches
la source

Réponses:

12

La première chose à faire est de déterminer le rectangle qui se chevauche en coordonnées géospatiales. Pour ce faire, vous obtenez la géotransformation pour chaque image source:

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

Convertissez ensuite ce rectangle en pixels pour chaque image en soustrayant les coordonnées supérieure et gauche et en divisant par la taille des pixels, en arrondissant.

De là, vous pouvez appeler ReadRaster()chaque image, en lui donnant les pixels que vous venez de calculer:

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

Je suis un peu fatigué, donc si ça n'a pas beaucoup de sens, faites le moi savoir!

MerseyViking
la source
Cela fonctionne-t-il également pour les rasters avec différentes projections (aka systèmes de référence de coordonnées / systèmes de référence spatiale)? Et même si les projections sont les mêmes: cela fonctionne-t-il également si gt1[1]et gt2[1](ou gt1[5]et gt2[5]) ont des signes opposés? (Je pense que ce qui retournerait l'un des rasters verticalement ou horizontalement.) Ou si abs(gt1[2])et abs(gt1[4])sont plus grands que abs(gt1[1])et abs(gt1[5])mais abs(gt2[2])et abs(gt2[4])sont plus petits que abs(gt2[1])et abs(gt2[5])(ce qui retournerait probablement l'un des rasters en diagonale)?
das-g
6

Le troisième élément d'intersection doit être 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])]

De plus, je recommanderais une certaine logique pour vérifier que les jeux de données se croisent réellement.

Ceci est une approche:

if (intersection[2] < intersection[0]) or (intersection[1] < intersection[3]):
    intersection = None
David Shean
la source