Lo primero que debe hacer es determinar el rectángulo superpuesto en coordenadas geoespaciales. Para hacer esto, obtienes la geotransformación para cada imagen de origen:
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])]
Luego convierta ese rectángulo en píxeles para cada imagen restando las coordenadas superior e izquierda y dividiendo por el tamaño del píxel, redondeando hacia arriba.
Desde aquí puede llamar ReadRaster()
a cada imagen, dándole las extensiones de píxeles que acaba de calcular:
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>
)
Estoy un poco cansado, así que si esto no tiene mucho sentido, ¡házmelo saber!
gt1[1]
ygt2[1]
(ogt1[5]
ygt2[5]
) tienen signos opuestos? (Creo que sería voltear uno de los rásteres vertical u horizontalmente). ¿O siabs(gt1[2])
yabs(gt1[4])
son mayores queabs(gt1[1])
yabs(gt1[5])
peroabs(gt2[2])
yabs(gt2[4])
son más pequeños queabs(gt2[1])
yabs(gt2[5])
(lo que probablemente voltearía uno de los rásteres en diagonal)?El tercer elemento de intersección debe ser min (r1 [2], r2 [2]):
Además, recomendaría algo de lógica para verificar que los conjuntos de datos realmente se crucen.
Este es un enfoque:
fuente