liblerc4 – biblioteka współdzielona w Linux do szybkiej kompresji danych LERC – ang. Limited Error Raster Compression

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:

  1. Dane są skalowane i zaokrąglane
  2. Redukowana jest liczba bitów potrzebnych do zapisu
  3. Tworzony jest nagłówek z parametrami
  4. 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.

About the author

Autor "BIELI" to zapalony entuzjasta otwartego oprogramowania, który dzieli się swoją pasją na blogu poznajlinuxa.pl. Jego wpisy są skarbnicą wiedzy na temat Linuxa, programowania oraz najnowszych trendów w świecie technologii. Autor "BIELI" wierzy w siłę społeczności Open Source i zawsze stara się inspirować swoich czytelników do eksplorowania i eksperymentowania z kodem.