library("terra")
Pakiet terra wspiera obsługę wielu formatów danych
rastrowych i wektorowych poprzez GDAL.
Możesz uzyskać listę wspieranych sterowników używając funkcji
gdal(drivers = TRUE).
W niniejszym pakiecie znajdziemy kilka przykładów danych rastrowych, tj.:
elev.tiflogo.tifmeuse.tifDo wczytania danych rastrowych służy funkcja rast() i
wymaga podania ścieżki do pliku lub plików. Spróbujmy zatem wczytać
przykładowy plik elev.tif, który domyślnie zawarty jest w
pakiecie (w podfolderze ex). W tym celu należy uprzednio
wywołać funkcję system.file(), która zwróci nam ścieżkę do
tego pliku.
sciezka_do_rastra = system.file("ex/elev.tif", package = "terra")
sciezka_do_rastra # wyświetl
## [1] "C:/Users/Krzysztof/AppData/Local/R/win-library/4.3/terra/ex/elev.tif"
Funkcję system.file() stosuje się jedynie jeśli chcemy
odwołać się do danych pochodzących z jakiegoś pakietu. W przypadku
standardowej pracy, ten krok jest pomijany.
Następnie wczytajmy dane do sesji ze wskazanej lokalizacji.
raster = rast(sciezka_do_rastra)
Wpisując nazwę obiektu (tj. raster) możemy wyświetlić
jego metadane.
raster
## class : SpatRaster
## dimensions : 90, 95, 1 (nrow, ncol, nlyr)
## resolution : 0.008333333, 0.008333333 (x, y)
## extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source : elev.tif
## name : elevation
## min value : 141
## max value : 547
Możemy zauważyć, że metadane składają się z 9 atrybutów:
Co ważne, pakiet terra przy otwieraniu rastra nie wczytuje go do pamięci, a jedynie tworzy wskaźnik do niego (dane przetwarzane są blokowo, co pozwala przetwarzać dane, które nie mieszczą się w pamięci).
Do zapisu danych rastrowych służy funkcja writeRaster(),
w której trzeba zdefiniować zapisywany obiekt oraz ścieżkę do zapisu.
Ścieżkę do pliku można zdefiniować na dwa sposoby. Pierwszy (łatwiejszy)
to podanie ścieżki bezwzględnej, tj. wskazanie
dokładnej lokalizacji, w której znajduje się plik. Na przykład:
sciezka = "C:/Users/Krzysztof/Desktop/raster.tif"
Jednak nie jest to zalecana metoda, gdyż uniemożliwia zlokalizowanie
plików na różnych systemach operacyjnych. Drugi sposób polega na
określeniu ścieżki względnej. W tym przypadku podajemy
lokalizację pliku względem bieżącego katalogu roboczego (lub projektu).
Aby dowiedzieć się, gdzie znajduje się katalog roboczy, możemy użyć
funkcji getwd(), a do jego zmiany funkcji
setwd(). Na przykład:
getwd()
#> "C:/Users/Krzysztof/Documents"
sciezka = "raster.tif"
Teraz zapiszmy nasz obiekt w aktualnym katalogu roboczym podając
nazwę raster.tif. Typ pliku (w tym przypadku
geotiff) jest określany automatycznie na podstawie jego
rozszerzenia w nazwie.
writeRaster(raster, filename = "raster.tif")
W powyższej funkcji można zdefiniować również inne argumenty, np. typ
danych (datatype = "INT1U") czy kompresję
(gdal = c("COMPRESS=LZW")).
Procedura wczytania danych wektorowych wygląda podobnie jak w
przypadku danych rastrowych. Do tego celu służy funkcja
vect(), która również przyjmuje ścieżkę do pliku. Tym razem
wczytamy plik ex/lux.shp również dostarczony z pakietem
terra.
sciezka_do_wektora = system.file("ex/lux.shp", package = "terra")
wektor = vect(sciezka_do_wektora)
wektor
## class : SpatVector
## geometry : polygons
## dimensions : 12, 6 (geometries, attributes)
## extent : 5.74414, 6.528252, 49.44781, 50.18162 (xmin, xmax, ymin, ymax)
## source : lux.shp
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## names : ID_1 NAME_1 ID_2 NAME_2 AREA POP
## type : <num> <chr> <num> <chr> <num> <int>
## values : 1 Diekirch 1 Clervaux 312 18081
## 1 Diekirch 2 Diekirch 218 32543
## 1 Diekirch 3 Redange 259 18664
Tak jak poprzednio otrzymujemy metadane tej warstwy, które zawierają następujące atrybuty:
Należy wspomnieć, że dane wektorowe domyślnie wczytywane są do
pamięci w przeciwieństwie do rastrów. Chyba, że zdefiniuje się argument
proxy = TRUE.
Do zapisu danych wektorowych służy funkcja
writeVector(). Działa ona analogicznie jak funkcja
writeRaster(). Zapiszmy naszą warstwę wektorową jako
geopackage (.gpkg) w katalogu roboczym.
writeVector(wektor, filename = "wektor.gpkg")
Do podstawowej wizualizacji danych zarówno rastrowych i wektorowych
służy funkcja plot().
plot(raster)
# wyświetla tylko geometrie
# jeśli nie zdefiniowano żadnego atrybutu
plot(wektor)
Warstwy można na siebie nakładać używając argumentu
add = TRUE. Pamiętaj żeby przed wyświetleniem sprawdzić czy
warstwy mają jednakowe układy współrzędnych.
plot(raster)
plot(wektor, add = TRUE)
Parametry wizualizacji oczywiście można dostosować. Sprawdź ich wykaz
w dokumentacji funkcji (?terra::plot). Dla przykładu możemy
nadać kolory na podstawie atrybutu NAME_1 (gmina) używając
argumentu col i definiując wybrane kolory. Oprócz tego,
możemy zmienić kolor tła (argument background) oraz granic
poligonów (argument border). Możemy również nadać rycinie
tytuł używając argumentu main. Alternatywnie, zamiast nazw
kolorów, można wykorzystać kod szesnastkowy, np. #ffff00
będzie reprezentował odcień żółtego.
plot(wektor, "NAME_1", col = c("red", "blue", "green"), background = "lightgrey",
border = "white" , main = "Luksemburg")
Do bardziej zaawansowanych wizualizacji możesz wykorzystać na przykład pakiety tmap czy ggplot2.
1. Wczytaj plik logo.tif z pakietu i
sprawdź jego metadane.
2. Pobierz dowolnie wybrane przez siebie dane z Natural Earth i
przygotuj wizualizację. Funkcje download.file() oraz
unzip() mogą być przydatne w tym celu.