W świecie Linuxa istnieje wiele bibliotek, które działają w tle i są praktycznie niewidoczne dla użytkownika końcowego – ale bez nich nie byłoby nowoczesnych aplikacji GIS, AI czy przetwarzania danych.
Jedną z takich bibliotek jest liblerc4, implementująca format LERC.
To rozwiązanie, które łączy:
- wysoką wydajność
- kontrolowaną stratność
- ogromne przyspieszenie pracy na dużych zbiorach danych

Czym jest LERC?
LERC (ang. Limited Error Raster Compression) to algorytm kompresji danych rastrowych, który pozwala określić maksymalny dopuszczalny błąd na piksel.
LERC to wydajny format kompresji danych rastrowych (obrazów, map wysokości, danych naukowych), który pozwala na kompresję z określoną maksymalną dopuszczalną wartością błędu (bezstratna lub stratna).
Kluczowa różnica względem JPEG:
- JPEG – ma wyglądać dobrze
- LERC – ma być dokładne w określonym zakresie błędu
Dzięki temu:
- możesz kompresować dane naukowe
- zachować kontrolę nad precyzją
- osiągnąć bardzo wysoki współczynnik (ang. ratio) kompresji
LERC pozwala ustawić parametr MaxZError, który ogranicza maksymalne odchylenie wartości pikseli.
Historia projektu
LERC został opracowany przez firmę Esri, czyli lidera w dziedzinie GIS (systemów informacji geograficznej).
Kamienie milowe biblioteki LERC:
- początek: potrzeba kompresji danych wysokościowych (DEM)
- rozwój jako open source (Apache 2.0)
- integracja z narzędziami GIS (np. GDAL)
- rozwój do wersji LERC2 (bardziej wydajna i elastyczna)
Kształt biblioteki LERC dzisiaj:
- jest częścią ekosystemu Open Source
- działa bardzo wydajnie na Linuxie, i innych systemach
- dostępny jako biblioteka współdzielona w systemie Linux (rozszerzenie pliku:
.so)
liblerc4 w Linuxie
W systemach Linux biblioteka występuje jako:
libLerc.so.4 (np. pakiet liblerc4)
Znajdziesz ją w:
- Debian / Ubuntu – instalacja:
apt install liblerc4
- Fedora – instalacja:
dnf install liblerc
- środowiskach HPC – instalacja:
- module load
libLerc to lekka biblioteka współdzielona (~600 KB)!
Jak działa kompresja LERC?
W uproszczeniu:
- Dane są skalowane i zaokrąglane
- Redukowana jest liczba bitów potrzebnych do zapisu
- Tworzony jest nagłówek z parametrami
- dane są kompresowane blokami
Efekt kompresji:
- ogromna redukcja rozmiaru
- zachowanie kontrolowanej dokładności
Lompresja LERC może osiągać nawet 100x redukcji danych!
API biblioteki (C / C++)
Choć implementacja biblioteki LERC jest w języku programowania C++, biblioteka udostępnia prosty interfejs ANSI C.
Najważniejsze funkcje:
1. Obliczenie rozmiaru bufora
uint lerc_computeCompressedSize(...);
Pozwala sprawdzić ile pamięci trzeba zaalokować
2. Kompresja danych
uint lerc_encode(...);
Kompresuje obraz / raster do bufora
3. Dekompresja
uint lerc_decode(...);
Odczyt danych z formatu LERC
Najważniejsze cechy API:
- obsługa wielu typów danych:
- int
- float
- double
- możliwość ustawienia:
maxZError– dla kontroli jakości
- wsparcie dla:
- masek (ang. missing data)
- wielu kanałów
Przykład użycia w ANSI C
Minimalny przykład (działa z najnowszą wersją biblioteki liblerc-dev 4.0.0+ds-5):
#include <stdio.h>
#include <stdlib.h>
#include "Lerc_c_api.h"
int main() {
int width = 256;
int height = 256;
int nBands = 1;
int nDim = 1;
int nMasks = 0;
int dataType = 6; // Lerc_DT_Float
int numPixels = width * height;
float data[256 * 256];
// generowanie danych testowych
for (int i = 0; i < numPixels; i++) {
data[i] = (float)i / 10.0f;
}
double maxZError = 0.01;
// rozmiar przed kompresją
unsigned int rawSize = numPixels * sizeof(float);
unsigned int outSize = 0;
if (lerc_computeCompressedSize(
data,
dataType,
nDim,
width,
height,
nBands,
nMasks,
NULL,
maxZError,
&outSize) != 0) {
printf("Error computing compressed size\n");
return 1;
}
unsigned char* buffer = (unsigned char*)malloc(outSize);
if (!buffer) {
printf("Memory allocation failed\n");
return 1;
}
unsigned int nBytesWritten = 0;
if (lerc_encode(
data,
dataType,
nDim,
width,
height,
nBands,
nMasks,
NULL,
maxZError,
buffer,
outSize,
&nBytesWritten) != 0) {
printf("Encoding failed\n");
free(buffer);
return 1;
}
// ratio
double ratio = (double)rawSize / (double)nBytesWritten;
printf("Raw size: %u bytes\n", rawSize);
printf("Compressed size: %u bytes\n", nBytesWritten);
printf("Compression ratio: %.2fx\n", ratio);
free(buffer);
return 0;
}
Jak używać w Linuxie
Instalacja:
Debian/Ubuntu:
sudo apt install liblerc-dev
Kompilacja:
gcc example.c -o example -lLerc
Uruchomienie:
$ ./example
Raw size: 262144 bytes
Compressed size: 96960 bytes
Compression ratio: 2.70x
Gdzie używa się LERC?
1. GIS i dane geograficzne
- modele wysokości (DEM)
- mapy satelitarne
- GeoTIFF (przez GDAL)
LERC jest natywnie wspierany przez GDAL.
2. HPC i nauka
- symulacje fizyczne
- modele klimatyczne
- dane pomiarowe
3. AI / ML
- duże macierze danych
- feature maps
- preprocessing danych
4. Przetwarzanie obrazów
- obrazy medyczne
- analizy przemysłowe
Dlaczego LERC jest szybki?
Dekodowanie:
- ~5 ms / MegaPiksel
Kodowanie:
- ~20–30 ms / MegaPiksel
To czyni LERC:
- szybszym niż gzip
- bardziej przewidywalnym niż JPEG
Kiedy warto używać LERC?
Zalecana:
- dane naukowe
- raster o wysokiej precyzji
- duże dataset’y, czyli zbiory danych
Niezalecana:
- zdjęcia użytkowe (JPEG lepszy)
- grafika webowa (PNG/WebP)
Popularność w Linuxie
LERC:
- jest dostępny w większości dystrybucji
- używany przez:
- GDAL
- systemy HPC
- narzędzia GIS
ale:
- nie jest popularny w “consumer Linux”
- jest kluczowy w środowiskach specjalistycznych
Podsumowanie
Biblioteka współdzielona liblerc4 to:
mała biblioteka
ogromne możliwości
kluczowy element świata danych
Jeśli pracujesz z:
- dużymi zbiorami danych
- obrazami naukowymi
- GIS
Warto ją znać, szczególnie kiedy jesteś naukowcem lub programistą używającym nacodzień Linuxa.