
Serwis wykorzystuje pliki cookies. Korzystając ze strony wyrażasz zgodę na wykorzystywanie plików cookies. Więcej informacji znajdziesz w naszej:
polityce prywatnościpolityce plików cookieterrio 🧰 to trzeci w ciągu dwóch tygodni projekt z tej samej stajni co GeoLibre i RustGIS, ale zupełnie innego rodzaju. Nie jest programem z mapą i przyciskami. To biblioteka i narzędzie wiersza poleceń do czytania, zapisu, konwersji i reprojekcji danych przestrzennych: rastrów, wektorów i chmur punktów. Napisana w czystym Ruście, bez bibliotek w C, więc buduje się wszędzie tam, gdzie działa Rust, łącznie z przeglądarką.
Jeśli ta rola brzmi znajomo, to słusznie. Dokładnie to robi GDAL, biblioteka, na której stoi QGIS, ArcGIS, rasterio, PostGIS i większość świata GIS. terrio nie próbuje zastąpić całego GDAL-a. Chce dać jego najczęściej używane funkcje tam, gdzie zainstalowanie GDAL-a jest problemem, i mieć dokładnie takie same wyniki.
W tym artykule sprawdzamy, co potrafi terrio, jak wypada na polskich układach współrzędnych, gdzie ma sens i czym różni się od QGIS. Tekst napisaliśmy 25 października dla wersji 0.5.0.

Autorem jest ponownie Qiusheng Wu z University of Tennessee, a projekt rozwija organizacja opengeos na licencji MIT. terrio powstał jako warstwa danych dla GeoLibre i RustGIS: oba programy potrzebowały czytników formatów, które działają bez GDAL-a, także w WebAssembly. Punktem wyjścia były biblioteki wbraster, wbvector i wbprojection z projektu whitebox_next_gen Johna Lindsaya (autora WhiteboxTools). Autor terrio pisze, że testy przeciwko GDAL-owi ujawniły w nich błędy dekodowania pikseli i gubienie georeferencji, więc dla kluczowych formatów napisał własne sterowniki, a problemy zgłosił do źródła.
Kalendarium:
.prj, kolejne odwzorowania przeniesione z PROJ-a, pakiety dla Arch Linuksa (AUR) i Fedory (COPR),Po jedenastu dniach repozytorium ma około 180 gwiazdek i 17 forków, czyli wciąż o rząd wielkości mniej niż GeoLibre czy RustGIS. To narzędzie dla programistów i administratorów danych, nie dla każdego użytkownika GIS. Tak jak w tamtych projektach, autor deklaruje w README, że kod powstaje głównie z pomocą modelu Claude Opus 5.5 pod nadzorem człowieka. Różnica jest taka, że tutaj każdy wynik jest porównywany z GDAL-em, PROJ-em i PDAL-em na prawdziwych plikach, a różnice traktuje się jak błędy.
open() rozpoznaje format po zawartości pliku i czyta rastry oraz wektory do wspólnego modelu, więc konwersja między dowolnymi dwoma formatami to jedno wywołanie.Dla formatów, których terrio nie czyta (HDF4, NITF, File Geodatabase), istnieje opcjonalny backend GDAL: jedyna zależność od C, domyślnie wyłączona, wymaga zbudowania ze źródeł z zainstalowanym GDAL-em 3.4 lub nowszym.
terrio ma cztery „twarze” i każdą instaluje się inaczej:
curl -LsSf https://terrio.opengeos.org/install.sh | sh, na Windows powershell -ExecutionPolicy ByPass -c "irm https://terrio.opengeos.org/install.ps1 | iex". Skrypt pobiera statyczny plik wykonywalny dla Twojej platformy (Linux x86_64 i ARM64, macOS Intel i Apple Silicon, Windows x64 i ARM64), sprawdza sumę SHA-256 i wkłada go do ~/.local/bin. Nie trzeba mieć Rusta ani Pythona. Alternatywy: pip install terrio (też instaluje polecenie), uv tool install terrio, cargo binstall terrio-cli albo kompilacja cargo install terrio-cli (Rust 1.90 lub nowszy). Na Arch Linuksie jest pakiet terrio-bin w AUR, na Fedorze repozytorium COPR, oba aktualizowane z każdym wydaniem.pip install terrio. Są gotowe paczki (wheels) dla Linuksa (glibc i musl), macOS i Windows, dla Pythona 3.10 lub nowszego. Potrzebny jest tylko NumPy i mały pakiet affine. Jest też paczka dla Pyodide, czyli Pythona w przeglądarce.npm install terrio-js: biblioteka skompilowana do WebAssembly dla przeglądarek i Node.js. Pliki otwiera się z bajtów, bo w WebAssembly nie ma systemu plików.cargo add terrio.Na stronie projektu jest też Playground: terrio w przeglądarce, do którego można przeciągnąć własny plik GeoTIFF, GeoPackage, Shapefile w ZIP czy LAZ i obejrzeć jego opis, przekonwertować go albo przeliczyć współrzędne. Pierwsze wejście pobiera około 4 MB, a pliki nie opuszczają komputera.

W wersji 0.5.0 polecenie terrio formats wypisuje 51 sterowników:
Wektory wymieniają się też z ekosystemem Arrow: warstwa zamienia się w tabelę GeoArrow i z powrotem bez pliku pośredniego, co łączy terrio z GeoPandas, Polars i DuckDB.
Czego brakuje w stosunku do GDAL-a: File Geodatabase, HDF4, NITF, MrSID, ECW oraz wszystkich baz danych. To część z ponad 200 sterowników GDAL-a, która zostaje za opcjonalnym backendem. Sterowniki DXF i DWG są już w kodzie na gałęzi głównej, ale nie weszły jeszcze do wydania 0.5.0.
Polecenia terrio odpowiadają jeden do jednego narzędziom GDAL-a, a opcje mają te same nazwy zapisane z myślnikami:
terrio info - gdalinfo i ogrinfo, z --json, --stats i histogramem,terrio convert - ogr2ogr: zmiana formatu, filtr --where, wybór kolumn --select, zasięg --spat, reprojekcja --t-srs, dopisywanie do istniejącego GeoPackage,terrio translate i terrio warp - gdal_translate i gdalwarp: wycinki, zmiana typu, skalowanie, piramidy, zapis COG, reprojekcja z resamplingiem (nearest, bilinear, cubic, average, mode), linia cięcia,terrio mosaic - gdalbuildvrt i gdal_merge.py,terrio rasterize i terrio polygonize,terrio dem - gdaldem: cieniowanie (także wielokierunkowe), spadki, ekspozycja, mapa hipsometryczna, TRI, TPI, szorstkość,terrio calc, terrio proximity, terrio sieve - algebra map, mapy odległości, czyszczenie klasyfikacji,terrio crs - gdalsrsinfo i gdaltransform, także z wysokościami i epokami współrzędnych,terrio grid - odpowiednik writers.gdal z PDAL: chmura punktów do rastra (max, min, średnia, IDW, TIN) z filtrem klas,terrio filter - filtry PDAL w Ruście: klasyfikacja gruntu SMRF, CSF i PMF, usuwanie odstających punktów, wysokość nad gruntem, przycinanie, normalne, a od 0.5.0 także klastrowanie DBSCAN, cechy kowariancji, współczynnik LOF, kolorowanie punktów z rastra i atrybuty z poligonów.Wersja 0.5.0 dodała to, czego w pierwszej wersji artykułu brakowało najbardziej, czyli operacje wektorowe i analizy łączące rastry z wektorami. Powstały na prośbę użytkownika zgłoszoną 23 października i trafiły do wydania dzień później:
terrio buffer, overlay, dissolve - bufor (planarny, w jednostkach układu warstwy), nakładanie poligonów (przecięcie, suma, różnica, różnica symetryczna) i agregacja po atrybutach,terrio centroid, singlepart, vertices - centroidy, rozbicie geometrii wieloczęściowych, wierzchołki jako punkty,terrio is-valid, make-valid, clean - raport poprawności geometrii, naprawa i czyszczenie topologii (przyciąganie do siatki, duplikaty, domykanie pierścieni),terrio contour - warstwice z rastra, ten sam algorytm co w GDAL,terrio zonal-stats - statystyki strefowe dla poligonów z wielu pasm i rastrów, z przeliczaniem układów,terrio sample i terrio footprint - próbkowanie rastrów w punktach i dokładny obrys ważnych danych rastra,terrio sql - zapytania SELECT z WHERE, ORDER BY i LIMIT na warstwach wektorowych.Autor porównał każdą z tych operacji z GDAL-em i GEOS-em: nakładanie i agregacja mieszczą się w tolerancji względnej 1e-7, bufory w 5e-4 (bo łuki są przybliżane odcinkami). Operacje są planarne, więc bufor na warstwie w WGS 84 liczy się w stopniach.
Z Pythona te same operacje są funkcjami z argumentami nazwanymi jak opcje CLI. Dla osób piszących w rasterio jest moduł terrio.rio: skrypty działają po zmianie jednej linii importu, a od 0.5.0 jest też polecenie terrio-rio, odpowiednik rio z rasterio. Dla xarray jest terrio.xarray z metodami znanymi z rioxarray. Jest też serwer MCP (terrio mcp), dzięki któremu asystent AI (Claude Code, Cursor, VS Code) może wywoływać te polecenia na Twoich plikach, pytając przed każdą operacją zapisu.
Zainstalowaliśmy terrio 0.3.2 przez pip na zwykłym laptopie z Windows i sprawdziliśmy to, co dla polskiego użytkownika najważniejsze: układy współrzędnych.
terrio info na scenie Sentinel-2 z 28 września 2026 r., leżącej jako COG w publicznym archiwum AWS: pełny opis pliku (10980 na 10980 pikseli, EPSG:32634, piramidy, nodata) w 1,3 sekundy, bez pobierania obrazu.terrio translate --projwin wyciął z tego pliku prostokąt nad centrum Warszawy (2398 na 2339 pikseli). Trwało to 37 sekund, bo kafle wycinka (17 MB po zapisie) musiały przyjść z serwera w USA.terrio warp --t-srs EPSG:2180 przeliczył wycinek do PL-1992 w 0,4 sekundy, a terrio convert -f COG zapisał go jako COG z kompresją Deflate w 0,5 sekundy.Wynik warpu widać poniżej. Zwróćcie uwagę na lekki obrót obrazu: to właśnie różnica między strefą UTM 34N a PL-1992.
Po wyjściu wersji 0.5.0 powtórzyliśmy test. Współrzędne w PL-1992 i PL-2000 wyszły co do cyfry takie same jak wcześniej, a warp tego samego wycinka zajął 0,3 sekundy.

Pierwsza wersja tego artykułu zawierała wykres z benchmarków projektu: konwersja 800-megabajtowego GeoTIFF-a do COG w 1,5 s zamiast 21 s, warp w 2,2 s zamiast 16,4 s, cieniowanie w 0,6 s zamiast 4,6 s, czyli przewaga od 1,1 do 13,6 razy nad GDAL 3.12.2. Usunęliśmy ten wykres, bo autor wycofał te tabele. Co się stało:
--threads nie ograniczała wszystkich wątków terrio.Nowe liczby (GDAL 3.13.3, terrio 0.5.0) są dużo skromniejsze. Z 22 przypadków tylko 8 przeszło wszystkie bramki, a w nich terrio jest szybszy od 1,2 do 1,65 razy: wycinek rastra 1,21, warp najbliższym sąsiadem 1,48, mozaika czterech kafli 1,45, GeoPackage do GeoParquet 1,48, GeoJSON do Shapefile 1,60, opis zdalnego COG 1,32, okno z dużej mozaiki 1,65. Kilka spektakularnych wyników, jak cieniowanie w 0,5 s zamiast 4 s, zostało wykluczonych, bo piksele wyniku różnią się od GDAL-a. Te różnice (nakładki COG, warp dwuliniowy, spadki) autor zebrał w osobnym zgłoszeniu do wyjaśnienia. W dwóch przypadkach szybszy był GDAL, m.in. przy wektoryzacji rastra.
Dla czytelnika wniosek jest podwójny. terrio jest realnie szybki, zwłaszcza w pamięci, ale nie o rząd wielkości, a wątek z benchmarkami to najlepszy dowód, że projekt reaguje na krytykę w ciągu godzin i poprawia się publicznie.
terrio convert -f COG i zapis PMTiles z rastrów lub wektorów to droga do map, które wyświetla się bez serwera mapowego, np. w GeoLibre albo na własnej stronie.terrio grid --class 2 --stat idw zrobi NMT z punktów gruntu, --stat max ze wszystkich punktów NMPT, a różnica (terrio calc) da model wysokości roślinności. O tych produktach pisaliśmy w artykułach DTM, DSM i nDSM i Canopy Height Model. Nieklasyfikowaną chmurę można wcześniej przepuścić przez terrio filter smrf, czyli klasyczny (nie AI) algorytm klasyfikacji gruntu. Podejście z sieciami neuronowymi opisaliśmy w artykule Klasyfikacja chmury punktów LiDAR.terrio dem, terrio mosaic) idą bez konwersji w QGIS. Więcej o zastosowaniach NMT w artykule NMT i jego zastosowania.terrio calc z pasmami Sentinel-2 policzy NDVI dokładnie tak jak gdal_calc.py, a STAC pozwala wskazać scenę adresem zamiast pobierać ją ręcznie. Teoria w artykule Wskaźniki roślinności.terrio-js pozwala wczytać Shapefile w ZIP, GeoPackage czy GeoTIFF po stronie użytkownika, bez wysyłania pliku na serwer, i od razu przeliczyć współrzędne. To ciekawa opcja dla geoportali z funkcją „wgraj swoje dane”.To porównanie młotka z warsztatem, więc najpierw ustalmy, co porównujemy. QGIS to kompletny program z mapą, edycją, kartografią i tysiącami wtyczek, który do czytania danych używa GDAL-a, do układów PROJ-a, a do chmur punktów PDAL-a. terrio to zamiennik tych trzech bibliotek w wąskim zakresie, bez żadnego interfejsu graficznego. Z tego wynika wszystko inne:
.prj, układy bez kodu w WKT, zapis WKT) naprawiono w wersji 0.4.0.qgis_process, PyQGIS i Model Designer, ale wymaga zainstalowanego QGIS, czyli setek megabajtów z Qt i Pythonem. terrio to jeden plik i działa tam, gdzie QGIS-a nie da się postawić: w funkcji serverless, na routerze z ARM-em, w przeglądarce.W praktyce terrio nie konkuruje z QGIS-em, tylko z tym, co QGIS ma pod maską. Rozsądny układ wygląda tak: terrio przygotowuje dane (konwersja, reprojekcja, COG, NMT z LAZ) w skryptach i na serwerze, a QGIS je ogląda, edytuje i składa do mapy. Oba czytają te same GeoPackage, GeoParquet, FlatGeobuf i GeoTIFF-y, a kto zna opcje gdalwarp i ogr2ogr, zna już opcje terrio.
Projekt nie trafił na Hacker News ani na Reddita, ale w repozytorium zaczęła się rozmowa, i to konkretna:
info na dużym GeoPackage, 16 GB pamięci przy zapisie GeoJSON, brak obsługi 15-bitowych próbek GeoTIFF z Sentinel-2. Wszystko naprawione w 0.3 i 0.4.Polskojęzycznych opinii nie ma. Nasz test polskich układów jest, o ile wiemy, pierwszym opisanym.
terrio-js waży 16 MB (4 MB po kompresji Brotli), odchudzony terrio-js/core bez GeoParquet, chmur punktów i formatów naukowych 9 MB. Wielowątkowość działa tylko na stronach z izolacją cross-origin, a pliki powyżej 4 GB wymagają osobnego modułu memory64.pip install terrio.terrio info dane.gpkg albo terrio info plik.tif --stats.terrio info z adresem dowolnego COG, np. sceny Sentinel-2 z AWS.terrio crs EPSG:4326 --to EPSG:2180 21.0122 52.2297 i porównaj z QGIS-em lub pyproj.terrio convert dane.shp dane.gpkg --t-srs EPSG:2180.terrio info plik.laz --stats, potem terrio grid plik.laz nmt.tif --tr 1 --stat idw --class 2.