Najłatwiejszym sposobem poradzenia sobie z tym problemem było użycie wirtualnego formatu GDAL . Ten format pozwolił mi potraktować cały zestaw obrazów jako pojedynczy obiekt obrazu i przekształcić go w trzy stosunkowo proste kroki.
Tworzenie wirtualnego zestawu danych
GDAL (w tym pliki binarne Windows GISInternals Tamasa Szekeresa i najnowsze wersje OSGeo4W ) zawiera narzędzie o nazwie gdalbuildvrt, którego można użyć do zbudowania początkowego wirtualnego zestawu danych.
Jednym z prostych sposobów wykorzystania tego jest dodanie wszystkich obrazów do pliku tekstowego, a następnie użycie tego pliku tekstowego jako danych wejściowych do gdalbuildvrt. Oto przykład (musisz umieścić drugie polecenie z powrotem w jednym wierszu):
dir /b *.tif > my_images.txt
gdalbuildvrt
-hidenodata
-vrtnodata "255 255 255"
-resolution highest
-input_file_list my_images.txt
my_image.vrt
Zostanie Ci plik XML, który możesz traktować jako pojedynczy obraz dla wszystkich operacji GDAL. Również wewnętrznie reprezentuje nodata jako biały, ale ukrywa definicję nodata przed czytającymi ją narzędziami.
Tworzenie przeglądu ponownie próbkowanego
Następnie wykonasz ponowne próbkowanie i wyjście obrazu poglądowego. Możesz to zrobić za pomocą gdal_translate lub gdalwarp . Dla każdego z nich pamiętaj, że wynikowy rozmiar będzie wynosić width * height * 3
(liczba 8 bitów pasm) bajtów. Jeśli będzie to więcej niż 4 GB, warto przyjrzeć się opcjom GeoTIFF dla składni, aby określić BigTIFF jako wynik (-co „BIGTIFF = TAK”).
W przypadku gdal_translate musisz określić wymiary obrazu wirtualnego za pomocą wygodnego polecenia gdalinfo . Weź te wymiary i podziel każdy według pewnego spójnego współczynnika, aby określić szerokość i wysokość pliku wyjściowego w pikselach.
Polecenie będzie wyglądać mniej więcej tak (w jednym wierszu):
gdal_translate
-outsize 53120 14000
-co "TILED=YES"
-co "PROFILE=GEOTIFF"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
W przypadku gdalwarp musisz znać wynikowy rozmiar pikseli; w tym przypadku używam miernika .5. Będziesz także chciał zadzwonić na metodę ponownego próbkowania. Wolę sześcienną linię do przeglądów ortofotografii. Jest bardziej miękki, ale nie będziesz go używać do pełnej rozdzielczości, a z mojego doświadczenia wynika, że tworzy bardziej kompresowalny obraz, jeśli używasz czegoś takiego jak JPEG lub 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
Możesz także rozważyć użycie opcji kompresji JPEG dla tych przeglądów GeoTIFF po ponownym próbkowaniu; znacznie zmniejsza plik wyjściowy ( według Franka ) tylko z marginalnym spadkiem wydajności.
-co "COMPRESS=JPEG"
-co "JPEG_QUALITY=80"
-co "PHOTOMETRIC=YCBCR"
Przegląd
Będziesz także chciał uruchomić poręczną komendę gdaladdo nad wynikowym obrazem, aby zbudować wewnętrzne „piramidy”, dzięki czemu prośby o mniejszą rozdzielczość niż pełne wymiary obrazu można spełnić przy pomocy podzbioru danych. Wzrost wydajności w większości przypadków jest więcej niż wart miejsca na dysku. Będziesz chciał pobawić się poziomami, których tu używasz; w przypadku bardzo dużych obrazów możesz upuścić niektóre. Polecenie gdaladdo wygląda mniej więcej tak:
gdaladdo
-r average
my_image.tif
2 4 8 16 32 64 128 256
Sugeruję eksperymentowanie z tymi poziomami w celu uzyskania optymalnej wydajności. Może się okazać, że inny interwał próbkowania jest lepszy dla twojej aplikacji lub, w zależności od rozmiaru obrazu, że możesz upuścić niektóre z wyższych liczb (lub że potrzebnych jest więcej)
Ponadto, jeśli generujesz przegląd zewnętrzny (używając opcji -ro), rozważ dodanie linii konfiguracji kompresji JPEG:
--config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW BAND
(Uważam, że są one dziedziczone z nadrzędnego GeoTIFF dla osadzonych przeglądów)
Notatki
W obliczu tego problemu zapytałem na kanale #gdal na freenode.irc.net. To niesamowity zasób i jestem głęboko wdzięczny Howardowi Butlerowi, Frankowi Warmerdamowi, a nawet Rouaultowi za pomoc w tym.