Czy GDAL powinien być ustawiony na tworzenie plików GeoTIFF z kompresją? Którego algorytmu należy użyć?


50

Mam folder danych GIS, który składa się głównie z plików GeoTIFF. Cały zestaw waży około 1.2 GB. Zauważyłem, że jeśli spakuję zawartość do tarballa, rozbije się do około 82 MB. Chciałbym sprawdzić zestaw w systemie kontroli wersji, który może być obsługiwany przez inne osoby i wygląda na to, że jest trochę miejsca, które można wycisnąć.

Strona sterownika GDAL GeoTIFF zawiera wiele opcji, które można wykorzystać do tworzenia skompresowanych plików GeoTIFF. Istnieje również wiele opcji, które wpływają na sposób działania każdego algorytmu.

Strona pomocy ma dobrą robotę w opisywaniu opcji, ale nie wyjaśnia, jak wybrać algorytm lub kompromisy związane ze zmiennym poziomem kompresji. Prowadzi to do następujących pytań:

  • Zalety stosowania kompresji to radykalna oszczędność miejsca. Jakie są minusy? Czy informacje są tracone podczas kompresji obrazu?

  • Jak należy wybrać algorytm i poziom kompresji. Czy niektóre rodzaje obrazów nadają się do określonego algorytmu?

Odpowiedzi:


84

Aby wybrać metodę kompresji, musisz użyć polecenia takiego jak:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

Podczas korzystania z kompresji największym kompromisem jest dodatkowy czas przetwarzania, który jest wymagany do rozpakowania obrazu, a po rozpakowaniu obraz nadal zajmowałby taką samą ilość pamięci. W przypadku utraty informacji istnieją dwa podstawowe typy kompresji :

  • bezstratny - zachowujący oryginalne wartości danych
  • stratne - które degradują dane, aby zaoszczędzić jeszcze więcej miejsca

Algorytmy bezstratne trzeba zachować, gdy trzeba zachować oryginalne wartości danych, takie jak DEM lub funkcje rastrowe. Algorytmy takie jak PACKBITS , DEFLATE i LZW są bezstratne i można je zamówić zgodnie ze stopniem kompresji:

  1. LZW - najwyższy stopień kompresji, najwyższa moc przetwarzania
  2. SIADAĆ
  3. PACKBITS - najniższy stopień kompresji, najniższa moc przetwarzania

Współczynnik kompresji nadal zależy od danych, jeśli dane mają wiele podobnych wartości, PACKBITS przyniesie dobre wyniki.

W przeciwieństwie do bezstratnych użyłbyś algorytmów stratnych, takich jak JPEG, do kompresji rastrów, które nie muszą zwracać dokładnych wartości. Na przykład ortofotografie lub zdjęcia satelitarne można kompresować za pomocą algorytmów stratnych.


5
+1 za miłą odpowiedź. PACKBITS jest formą kodowania przez całą długość ( en.wikipedia.org/wiki/Run-length_encoding ), która będzie dobrze działać w przypadku danych z dużą ilością sąsiadujących tych samych wartości (jeśli na przykład masz dużo wartości NULL lub sklasyfikowany raster) i LZW to bardziej niezawodny algorytm, który działa na większą liczbę rodzajów danych. Jak wspomniano, ogólny kompromis dotyczy przestrzeni i prędkości, więc to, co jest właściwe, zależy od twojego wykorzystania i danych. Ponadto niektóre programy nie obsługują niektórych rodzajów kompresji GeoTiff.
scw

3
to jest dobry, odpowiedni post linfiniti.com/2011/05/…
oeon

1
Dobra odpowiedź, dobrze podsumowuje twoje opcje. Pamiętaj również, że każda z tych metod kompresji ma parametry, które możesz ustawić, co znacząco wpłynie na wynik. @ j03lar50n, cieszę się, że mój artykuł na blogu okazał się przydatny ...
R Thiede

piękna odpowiedź! takie proste i od razu do rzeczy.
sys49152

@scw, czy możesz powiedzieć więcej o tym, które oprogramowanie nie obsługuje niektórych rodzajów kompresji - czy jest jakieś oprogramowanie, które nie obsługuje lzw ani pakietów? A może najczęściej odwołujesz się do mniej popularnych algorytmów?
David LeBauer

28

Z lzwi deflatekompresji przy użyciu -co predictor=2może przyczynić się do obrazowania, które są w różnym płynnie jak kompresowanie różnic z piksela piksela zamiast wartości bezwzględne, a to będzie na ogół małe i mają więcej wzorów ( ref ). Predictor jest przydatna tylko z lzwi deflatekompresji, opcja nie działa z innymi metodami.

gdal_translate -co compress=lzw -co predictor=2 ...

Oszczędności predyktorów mogą być ogromne. Właśnie ponownie skompresowałem katalog 16-bitowych modeli wysokości geotiff, używając do 17 GB przy domyślnych ustawieniach LZW do zaledwie 5 GB z predyktorem = 2.

Istnieją sprzeczne informacje na temat różnic pomiędzy predyktorami 2 & 3 i kiedy każdy jest najlepiej stosować ( ref1 , ref2 ). Być może paliwo na kolejne pytanie.

Inną łatwą opcją oszczędności jest -co tiled=yes. Istnieje oprogramowanie, które nie potrafi odczytać obrazów sąsiadujących, ale stają się one coraz rzadsze i przeważnie poza GIS (nie znam żadnego oprogramowania GIS głównego strumienia, które ich nie czyta).

Opierając się na odpowiedzi @ alfonx na użycie skompresowanych przeglądów : Pozwala to na przechowywanie obrazu podstawowego bez strat, w celu zapewnienia integralności danych, a piramidy na straty, dla szybkości i oszczędności miejsca. To prawie najlepsze z obu światów. W celu uzyskania możliwie najmniejszych podglądów z gdaladdoobrazami RGB: użyj kompresji JPEG, uśrednionego lub gaussowskiego ponownego próbkowania zamiast domyślnego najbliższego sąsiada (wygładza podgląd) i przeglądu fotometrycznego YCBCR. Zobacz stronę referencyjną gdaladdo, aby uzyskać więcej informacji na temat tych opcji (choć niewiele mówi o tym, o co chodzi w fotometryce).

Jest to część pliku wsadowego systemu Windows, którego używam do stosowania zewnętrznych przeglądów JPEG do wszystkich tiffów w katalogu:

set _opts= -r gauss --config PHOTOMETRIC_OVERVIEW YCBCR ^
--config COMPRESS_OVERVIEW JPEG --config JPEG_QUALITY_OVERVIEW 85

for %%a in (*.tif) do gdaladdo -ro %_opts% %%a 2 4 8 16 32 64

Notatki

GDAL 1.6.0 wprowadził gaussponowne próbkowanie, które może prowadzić do lepszych wyników averagew przypadku ostrych krawędzi o wysokim kontraście lub głośnych wzorach. Należy użyć mocy 2 poziomów (2 4 8 ...), aby wybrać jądro Gaussa o ponownym próbkowaniu 3x3.

JPEG_QUALITY_OVERVIEW 85 - jeśli nie jest określony, używana jest domyślna wartość 75%, co daje mniejszy plik, ale uważam, że 85% jest lepszym kompromisem w stosunku do kompromisu jakości.

Aktualizacja, 2015: GDAL 1.8 i 2.0 wprowadziły wiele nowych opcji, które nie zostały tutaj omówione, a których nie miałem czasu do przeanalizowania. Przeczytaj oficjalną stronę formatu GTIFF , jestem pewien, że są szczegółowe dodatkowe przydatne ustawienia.


10

Dla dużych rastrów GeoTiff oferuje możliwość przechowywania (wstępnie) zmniejszonych przeglądów jako dodatkowych obrazów do pliku GeoTiff. Można to zrobić za pomocą gdaladdo (= Przegląd GDAL ADD). Podczas tworzenia tych przeglądów możesz ręcznie powiedzieć gdalowi, aby je również skompresował:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Przyspiesza przeglądanie danych bez zwiększania rozmiaru. Uwaga: aplikacje Geotools, takie jak Geoserver, uDig, AtlasStyler, Geopublisher, mogą korzystać z tej funkcji i korzystać z przeglądów.



4

Ostatecznie prawdopodobnie będziesz musiał poeksperymentować z różnymi opcjami i zobaczyć, co spełnia twoje potrzeby.

Coraz częściej korzystam z GeoTIFF-ów skompresowanych JPEG w porównaniu z formatami opartymi na falkach. Moje wyniki były całkiem dobre. Wykorzystanie do tego GDAL pozwoliło uzyskać współczynniki kompresji porównywalne z formatami opartymi na falkach, bez zbyt dużej utraty danych. Uderzenie wydajności związane z dekompresją jest do zaakceptowania.

To, co najbardziej podoba mi się w tym podejściu, to fakt, że obsługa GeoTIFF jest prawie uniwersalna, podczas gdy obsługa formatów falkowych nie zawsze jest zapewniona i czasami podlega trudnym problemom z licencjonowaniem.


3

Moje doświadczenie w porównaniu kompresji GeoTIFF z kompresją ECW ( Enhanced Compressed Wavelet ) w Mapowaniu Zasobów Ziemi polega na tym, że ECW jest o rząd wielkości lepszy podczas kompresji zdjęć lotniczych w wysokiej rozdzielczości. Kolejną ważną zaletą kompresji opartej na falkach jest to, że w przeciwieństwie do starszych formatów, takich jak GeoTIFF, JPEG - nie JPEG 2000 - tylko część obrazu można zdekompresować [ref. 1]. Nie można nie doceniać znaczenia tej przewagi, zwłaszcza przy pracy z „większym niż około połowy wielkości pamięci komputera”.

Wydaje się - nigdy nie miałem okazji go przetestować - że MrSID , inny zastrzeżony format pliku oparty na falkach, również wykazuje wyższy współczynnik kompresji niż „starsze” formaty i selektywną dekompresję.

ref. 1: http://www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf


1
dariapra, pamiętaj, że GeoTIFF-Packbits lub GeoTIFF-LZW to bezstratne kompresje, podczas gdy ECW i JPEG są stratne. Bezstratną lub stratną kompresję należy starannie wybrać w zależności od przyszłego wykorzystania danych.
markusN

1
Nie twierdzę, że luźny format kompresji jest zawsze prawidłowym formatem pamięci. Chciałem przez to powiedzieć, że użycie formatu takiego jak ECW jest odpowiednie w niektórych środowiskach produkcyjnych. Na przykład ECW jest bardziej odpowiednim formatem niż GeoTIFF, jeśli mamy instancję MapServer obsługującą warstwy ortophoto przez WMS. Nic nie zabrania, abyś przechowywał ortophoto przy użyciu bezstratnej kompresji.
dariapra

3

Odpowiedzi @dodobas i @ matt-wilkie obejmują większość wszystkiego, co dotyczy kompresji i rozmycia za pomocą GDAL w celu zmniejszenia rozmiaru obrazu.

Chciałbym dodać dwie rzeczy:

  • dokumentacja formatu pliku z GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Zobacz opcje tworzenia ( -co), w szczególności:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • oraz że niezbędne jest sprawdzenie, czy oprogramowanie, które będzie korzystało z GeoTIFF:
    • obsługuje żądaną metodę kompresji;
    • zaleca stosowanie kompresji.

Na przykład GeoServer nie zaleca kompresji GeoTIFF :

Na koniec Geotiff obsługuje różne rodzaje kompresji, ale sugerujemy, aby jej nie używać. Chociaż pozwala na znacznie mniejsze pliki, proces dekompresji jest kosztowny i będzie przeprowadzany przy każdym dostępie do danych, co znacznie spowalnia renderowanie. Z naszego doświadczenia wynika, że ​​czas dekompresji jest dłuższy niż odczyt danych z czystego dysku.

Jest to szczególnie prawdziwe, jeśli już używasz przeglądów, kafelkowania i nośników pamięci o wysokiej wydajności (dysk klasy korporacyjnej lub dysk SSD).


Muszę także skopiować mój plik JPEG, ponieważ nie jestem w stanie przekonwertować rastra na tablicę za pomocą gdalina Pythona. Pokazuje błąd pamięci, a czasem brak pamięci. Czy ktoś może mieć jakiś pomysł, jak zaimplementować tę linię (gdal_translate -co "COMPRESS = metoda" src_dataset dst_dataset) w pythonie. Jestem nowy w używaniu gdal. Dlatego czasami trudno mi zrozumieć strukturę.
Shiuli Pervin

1
@ShiuliPervin, Po pierwsze, JPEG jest już skompresowanym (stratnym) formatem. Po drugie, wygląda na to, że masz problem z fragmentem, a nie z kompresją. Przeczytaj plik w kafelkach, paskach lub kawałku, zamiast wszystkich naraz. Nawet jeśli plik jest skompresowany, podczas jego używania trzeba będzie go zdekompresować (na przykład: jeśli plik 4 GB zużyje 2 GB na dysku podczas kompresji, nadal zajmie 4 GB pamięci RAM, gdy wszystko zostanie załadowane do przetworzenia. oszczędność miejsca alternatywę, można zajrzeć do nielicznych formatowania dla GeoTiff .
Kevin

1
@ShiuliPervin, chociaż mogę nie rozumieć twojego pytania. Sama kompresja często zużywa dużo pamięci, ale nie powinna przepełniać systemu, chyba że w bibliotece jest błąd lub podano nieprawidłowy argument. Jeśli masz problemy z JPEG jako typem kompresji dla GeoTIFF, możesz spróbować LZMA lub DEFLATE.
Kevin

0

Dla tych, którzy używają nowszych wersji GDAL, dostępna jest również bezstratna kompresja ZStandard ( ZSTD ) (GDAL> = 2.3) i stratna kompresja z ograniczonym błędem kompresji rastrowej ( LERC ) (GDAL> = 2.4).

Ogólnie rzecz biorąc, ZSTDoferuje szybsze prędkości odczytu danych niż oba LZWi DEFLATEprzy podobnych współczynnikach kompresji, chociaż może być nieco wolniejszy podczas zapisywania pliku (w zależności od używanych ustawień).

Jeśli nie troszczysz się o precyzję danych (np. Tylko wizualizację, a nie analizę), to LERCmoże być dobrym rozwiązaniem. Istnieje MAX_Z_ERRORustawienie, które pozwala dostosować, ile precyzji chcesz poświęcić. Np. A MAX_Z_ERROR=0.001lub 1 mm dało oszczędność miejsca 50% w jednym teście (patrz odnośnik ).

Najlepsze jest to, że możesz łączyć LERCz ZSTDużyciem COMPRESS=LERC_ZSTD! Lub jeśli wolisz używać DEFLATE, możesz to zrobić COMPRESS=LERC_DEFLATE. Zobacz także pełną listę kombinacji / ustawień na oficjalnych dokumentach GDAL GeoTIFF https://gdal.org/drivers/raster/gtiff.html#creation-options

Więcej szczegółowych informacji i pełnych porównań porównawczych można znaleźć pod tym cennym odniesieniem:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.