La forma más fácil de resolver este problema fue utilizar el formato virtual GDAL . Este formato me permitió tratar todo el conjunto de imágenes como un solo objeto de imagen y transformarlo en tres pasos relativamente simples.
Crear el conjunto de datos virtual
GDAL (incluidos los binarios de Windows GISInternals de Tamas Szekeres y las versiones recientes de OSGeo4W ) incluye una utilidad llamada gdalbuildvrt que se puede utilizar para construir un conjunto de datos virtual inicial.
Una forma simple de usar esto es agregar todas sus imágenes a un archivo de texto y luego usar ese archivo de texto como entrada para gdalbuildvrt. Aquí hay un ejemplo (deberá volver a colocar el segundo comando en una línea):
dir /b *.tif > my_images.txt
gdalbuildvrt
-hidenodata
-vrtnodata "255 255 255"
-resolution highest
-input_file_list my_images.txt
my_image.vrt
Esto lo dejará con un archivo XML que puede tratar como una sola imagen para todas las operaciones de GDAL. También representa internamente los nodatos como blancos, pero oculta la definición de nodos de las herramientas que leen.
Crear el resumen muestreado
A continuación, realizará el remuestreo y la salida de la imagen general. Puede hacer esto con gdal_translate o gdalwarp . Para cualquiera de estos, recuerde que el tamaño resultante será width * height * 3
(número de bandas de 8 bits) Bytes. Si esto será mayor a 4GB, querrá ver las opciones de GeoTIFF para la sintaxis para especificar BigTIFF como su salida (-co "BIGTIFF = YES").
Para gdal_translate, deberá determinar las dimensiones de la imagen virtual utilizando el práctico comando gdalinfo . Tome estas dimensiones y divídalas por un factor consistente para determinar el ancho y la altura de salida de su archivo en píxeles.
El comando se verá algo así (en una línea):
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, necesitará saber el tamaño de píxel resultante; en este caso estoy usando .5 metro. También querrá hacer una llamada sobre el método de remuestreo. Prefiero cubicspline para vistas generales de ortofoto. Es más suave, pero no los usará a resolución completa y, en mi experiencia, crea una imagen más comprimible si usa algo como JPEG o 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
También es posible que desee considerar el uso de opciones de compresión JPEG para estas vistas generales de GeoTIFF remuestreadas; reduce considerablemente el archivo de salida con ( según Frank ) solo una penalización de rendimiento marginal.
-co "COMPRESS=JPEG"
-co "JPEG_QUALITY=80"
-co "PHOTOMETRIC=YCBCR"
Resúmenes
También querrá ejecutar el práctico comando gdaladdo sobre la imagen resultante para construir "pirámides" internas, de modo que las solicitudes de resoluciones más bajas que las dimensiones de la imagen completa se puedan cumplir con un subconjunto de datos. El aumento en el rendimiento vale más que el espacio en disco en la mayoría de los casos. Querrás jugar con los niveles que usas aquí; para imágenes muy grandes, puede dejar caer algunas. El comando gdaladdo se parece a esto:
gdaladdo
-r average
my_image.tif
2 4 8 16 32 64 128 256
Sugeriría experimentar con estos niveles para un rendimiento óptimo. Puede encontrar que un intervalo de muestreo diferente es mejor para su aplicación o, en función del tamaño de su imagen, que puede eliminar algunos de los números más altos (o que se necesitan más)
Además, si está generando una descripción general externa (usando la opción -ro) considere agregar las líneas de configuración de compresión JPEG:
--config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW BAND
(Creo que estos se heredan del GeoTIFF principal para las vistas generales incrustadas)
Notas
Cuando me enfrenté a este problema, pregunté en el canal #gdal en freenode.irc.net. Este es un recurso increíble, y estoy totalmente en deuda con Howard Butler, Frank Warmerdam e Even Rouault por ayudarme con esto.