Il modo più semplice per me di affrontare questo problema era utilizzare il formato virtuale GDAL . Questo formato mi ha permesso di trattare l'intero insieme di immagini come un singolo oggetto immagine e di trasformarlo in tre passaggi relativamente semplici.
Creazione del set di dati virtuale
GDAL (compresi i binari Windows GISInternals di Tamas Szekeres e le versioni recenti di OSGeo4W ) include un'utilità chiamata gdalbuildvrt che può essere utilizzata per creare un set di dati virtuale iniziale.
Un modo semplice per utilizzarlo è aggiungere tutte le tue immagini a un file di testo e quindi utilizzare quel file di testo come input per gdalbuildvrt. Ecco un esempio (dovrai riportare il secondo comando su una riga):
dir /b *.tif > my_images.txt
gdalbuildvrt
-hidenodata
-vrtnodata "255 255 255"
-resolution highest
-input_file_list my_images.txt
my_image.vrt
Questo ti lascerà con un file XML che puoi trattare come una singola immagine per tutte le operazioni GDAL. Inoltre rappresenta internamente i nodati come bianchi, ma nasconde la definizione dei nodati dagli strumenti che ne leggono.
Creazione della panoramica ricampionata
Successivamente, eseguirai il ricampionamento e l'output dell'immagine panoramica. Puoi farlo con gdal_translate o gdalwarp . Per uno di questi, ricorda che la dimensione risultante sarà width * height * 3
(numero di bande a 8 bit) Byte. Se questo sarà maggiore di 4 GB, ti consigliamo di esaminare le opzioni GeoTIFF per la sintassi per specificare BigTIFF come output (-co "BIGTIFF = YES").
Per gdal_translate, dovrai determinare le dimensioni dell'immagine virtuale usando il pratico comando gdalinfo . Prendi queste dimensioni e dividi ognuna per un fattore coerente per determinare la larghezza e l'altezza di output del tuo file in pixel.
Il comando avrà un aspetto simile (su una riga):
gdal_translate
-outsize 53120 14000
-co "TILED=YES"
-co "PROFILE=GEOTIFF"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Per gdalwarp, dovrai conoscere la dimensione pixel risultante; in questo caso sto usando 0,5 metri. Ti consigliamo inoltre di effettuare una chiamata sul metodo di ricampionamento. Preferisco cubicspline per le panoramiche ortofoto. È più morbido, ma non li userai fino alla massima risoluzione e nella mia esperienza crea un'immagine più comprimibile se stai usando qualcosa come 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
Puoi anche prendere in considerazione l'utilizzo delle opzioni di compressione JPEG per queste panoramiche GeoTIFF ricampionate; riduce notevolmente il file di output con ( secondo Frank ) solo una penalità marginale per le prestazioni.
-co "COMPRESS=JPEG"
-co "JPEG_QUALITY=80"
-co "PHOTOMETRIC=YCBCR"
panoramiche
Dovrai anche eseguire il pratico comando gdaladdo sull'immagine risultante per creare "piramidi" interne, in modo che le richieste di risoluzioni inferiori rispetto alle dimensioni dell'immagine complete possano essere soddisfatte con un sottoinsieme di dati. L'aumento delle prestazioni è nella maggior parte dei casi degno dello spazio su disco. Ti consigliamo di giocare con i livelli che usi qui; per immagini molto grandi potresti essere in grado di rilasciarne alcune. Il comando gdaladdo è simile al seguente:
gdaladdo
-r average
my_image.tif
2 4 8 16 32 64 128 256
Suggerirei di sperimentare questi livelli per prestazioni ottimali. Potresti scoprire che un diverso intervallo di ricampionamento è migliore per la tua applicazione o, in base alle dimensioni dell'immagine, che puoi eliminare alcuni dei numeri più alti (o che sono necessari altri)
Inoltre, se stai generando una panoramica esterna (usando l'opzione -ro) considera l'aggiunta delle linee di configurazione della compressione JPEG:
--config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW BAND
(Credo che questi siano ereditati dal GeoTIFF principale per panoramiche incorporate)
Appunti
Di fronte a questo problema, ho chiesto sul canale #gdal su freenode.irc.net. Questa è una risorsa straordinaria, e sono in debito con Howard Butler, Frank Warmerdam e Even Rouault per avermi aiutato in questo.