Como adicionar rasters de tamanhos diferentes no GDAL para que o resultado seja apenas na região interceptada

11

Estou escrevendo um método Python que adiciona dois rasters e gera uma única saída raster. Por razões fora do meu controle, as extensões dos rasters de entrada são diferentes, mas elas se sobrepõem.

É possível operar exclusivamente nos pixels de varredura de entrada sobrepostos nas 2 regiões sobrepostas para gerar minha saída de modo que a extensão da varredura de saída seja apenas a região de interseção das duas entradas?

Rico
fonte

Respostas:

12

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!

MerseyViking
fonte
Isso também funciona para rasters com projeções diferentes (também conhecidos como sistemas de referência de coordenadas / sistemas de referência espacial)? E mesmo que as projeções sejam as mesmas: isso também funciona se gt1[1]e gt2[1](ou gt1[5]e gt2[5]) tem sinais opostos? (Qual seria a rotação de um dos rasters na vertical ou na horizontal, eu acho.) Ou se abs(gt1[2])e abs(gt1[4])são maiores que abs(gt1[1])e abs(gt1[5])mas abs(gt2[2])e abs(gt2[4])são menores que abs(gt2[1])e abs(gt2[5])(o que provavelmente faria um dos rasters na diagonal)?
das-g
6

O terceiro elemento da interseção deve ser 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])]

Além disso, eu recomendaria alguma lógica para verificar se os conjuntos de dados realmente se cruzam.

Esta é uma abordagem:

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