A maneira mais fácil de lidar com esse problema foi usar o formato virtual GDAL . Esse formato me permitiu tratar todo o conjunto de imagens como um único objeto de imagem e transformá-lo em três etapas relativamente simples.
Criando o conjunto de dados virtual
O GDAL (incluindo os binários GISInternals do Windows da Tamas Szekeres e versões recentes do OSGeo4W ) inclui um utilitário chamado gdalbuildvrt, que pode ser usado para criar um conjunto de dados virtual inicial.
Uma maneira simples de usar isso é adicionar todas as suas imagens a um arquivo de texto e, em seguida, usar esse arquivo de texto como uma entrada para o gdalbuildvrt. Aqui está um exemplo (você precisará colocar o segundo comando novamente em uma linha):
dir /b *.tif > my_images.txt
gdalbuildvrt
-hidenodata
-vrtnodata "255 255 255"
-resolution highest
-input_file_list my_images.txt
my_image.vrt
Isso deixará um arquivo XML que você pode tratar como uma imagem única para todas as operações do GDAL. Ele também representa internamente os nodata como brancos, mas oculta a definição de nodata das ferramentas que estão sendo lidas.
Criando a visão geral reamostrada
Em seguida, você realizará a reamostragem e a saída da imagem geral. Você pode fazer isso com gdal_translate ou gdalwarp . Para qualquer um deles, lembre-se de que o tamanho resultante será width * height * 3
(número de bandas de 8 bits) bytes. Se o tamanho for maior que 4 GB, convém consultar as opções GeoTIFF para a sintaxe especificar BigTIFF como sua saída (-co "BIGTIFF = YES").
Para gdal_translate, você precisará determinar as dimensões da imagem virtual usando o prático comando gdalinfo . Pegue essas dimensões e divida cada uma por um fator consistente para determinar a largura e a altura de saída do seu arquivo em pixels.
O comando será semelhante a (em uma linha):
gdal_translate
-outsize 53120 14000
-co "TILED=YES"
-co "PROFILE=GEOTIFF"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Para gdalwarp, você precisará saber o tamanho de pixel resultante; neste caso, estou usando 0,5 metro. Você também deseja fazer uma chamada no método de reamostragem. Prefiro cubicspline para visões gerais de ortofoto. É mais suave, mas você não vai usá-las até a resolução máxima e, na minha experiência, cria uma imagem mais compressível se estiver usando algo como JPEG ou ECW.
gdalwarp
-r cubicspline
-of GTiff
-dstnodata "255 255 255"
-tr 0.5 0.5
-co "PROFILE=GEOTIFF"
-co "BIGTIFF=YES"
-co "TILED=YES"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Você também pode considerar o uso de opções de compactação JPEG para essas visões gerais GeoTIFF reamostradas; reduz consideravelmente o arquivo de saída, com (de acordo com Frank ) apenas uma penalidade de desempenho marginal.
-co "COMPRESS=JPEG"
-co "JPEG_QUALITY=80"
-co "PHOTOMETRIC=YCBCR"
visões gerais
Você também deseja executar o prático comando gdaladdo sobre a imagem resultante para criar "pirâmides" internas, para que solicitações de resoluções mais baixas que as dimensões totais da imagem possam ser atendidas com um subconjunto de dados. O aumento no desempenho vale mais que o espaço em disco na maioria dos casos. Você vai querer brincar com os níveis que você usa aqui; para imagens muito grandes, você pode soltar algumas. O comando gdaladdo é mais ou menos assim:
gdaladdo
-r average
my_image.tif
2 4 8 16 32 64 128 256
Eu sugeriria experimentar esses níveis para obter o desempenho ideal. Você pode achar que um intervalo de reamostragem diferente é melhor para o aplicativo ou, com base no tamanho da imagem, pode eliminar alguns dos números mais altos (ou que são necessários mais)
Além disso, se você estiver gerando uma visão geral externa (usando a opção -ro), considere adicionar as linhas de configuração de compactação JPEG:
--config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW BAND
(Eu acredito que eles são herdados do GeoTIFF pai para visões gerais incorporadas)
Notas
Ao enfrentar esse problema, perguntei no canal #gdal em freenode.irc.net. Esse é um recurso incrível, e sou muito grato a Howard Butler, Frank Warmerdam e Even Rouault por me ajudarem com isso.