A primeira coisa a fazer é determinar o retângulo sobreposto nas coordenadas geoespaciais. Para fazer isso, você obtém a geotransformação para cada imagem de origem:
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])]
Em seguida, converta esse retângulo em pixels para cada imagem, subtraindo as coordenadas superior e esquerda e dividindo pelo tamanho do pixel, arredondando para cima.
A partir daqui, você pode chamar ReadRaster()
cada imagem, fornecendo as extensões de pixel que você acabou 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>
)
Estou um pouco cansado, por isso, se isso não fizer muito sentido, avise-me!
gt1[1]
egt2[1]
(ougt1[5]
egt2[5]
) tem sinais opostos? (Qual seria a rotação de um dos rasters na vertical ou na horizontal, eu acho.) Ou seabs(gt1[2])
eabs(gt1[4])
são maiores queabs(gt1[1])
eabs(gt1[5])
masabs(gt2[2])
eabs(gt2[4])
são menores queabs(gt2[1])
eabs(gt2[5])
(o que provavelmente faria um dos rasters na diagonal)?O terceiro elemento da interseção deve ser min (r1 [2], r2 [2]):
Além disso, eu recomendaria alguma lógica para verificar se os conjuntos de dados realmente se cruzam.
Esta é uma abordagem:
fonte