diff --git a/notebooks/01_wprowadzenie.Rmd b/notebooks/01_wprowadzenie.Rmd new file mode 100644 index 0000000..759139a --- /dev/null +++ b/notebooks/01_wprowadzenie.Rmd @@ -0,0 +1,184 @@ +--- +title: "Wprowadzenie" +author: "Krzysztof Dyba" +output: + html_document: + toc: yes + toc_float: true +--- + +```{r message=FALSE} +library("terra") +``` + +Pakiet **terra** wspiera obsługę wielu formatów danych rastrowych i wektorowych +poprzez [GDAL](https://gdal.org). Możesz uzyskać listę wspieranych sterowników +używając funkcji `gdal(drivers = TRUE)`. + +# Dane rastrowe + +W niniejszym pakiecie znajdziemy kilka przykładów danych rastrowych, tj.: + +* `elev.tif` +* `logo.tif` +* `meuse.tif` + +## Wczytywanie + +Do 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. + +```{r} +sciezka_do_rastra = system.file("ex/elev.tif", package = "terra") +sciezka_do_rastra # wyświetl +``` + +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. + +```{r} +raster = rast(sciezka_do_rastra) +``` + +Wpisując nazwę obiektu (tj. `raster`) możemy wyświetlić jego metadane. + +```{r} +raster +``` + +Możemy zauważyć, że metadane składają się z 9 atrybutów: + +* klasa obiektu +* wymiary (liczba wierszy, kolumn, warstw) +* rozdzielczość +* zakres przestrzenny (*bounding box*) +* przestrzenny układ współrzędnych +* źródło +* nazwa warstwy +* wartość minimalna i maksymalna + +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). + +## Zapisywanie + +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: + +```r +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: + +```r +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. + +```r +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"`). + +# Dane wektorowe + +## Wczytywanie + +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**. + +```{r} +sciezka_do_wektora = system.file("ex/lux.shp", package = "terra") +wektor = vect(sciezka_do_wektora) +wektor +``` + +Tak jak poprzednio otrzymujemy metadane tej warstwy, które zawierają następujące +atrybuty: + +* klasa obiektu +* typ geometrii +* wymiary (liczba geometrii, atrybutów) +* zakres przestrzenny +* źródło +* przestrzenny układ współrzędnych +* ramka danych z nazwą, typem i wartościami atrybutów + +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`. + +## Zapisywanie + +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. + +```r +writeVector(wektor, filename = "wektor.gpkg") +``` + +# Wizualizacje + +Do podstawowej wizualizacji danych zarówno rastrowych i wektorowych służy funkcja +`plot()`. + +```{r} +plot(raster) +``` + +```{r} +# 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. + +```{r} +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`. + +```{r} +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](https://r-tmap.github.io/tmap/) czy [ggplot2](https://ggplot2.tidyverse.org/). + +# Zadanie + +1. Wczytaj plik `logo.tif` z pakietu i sprawdź jego metadane. +2. Pobierz dane z [Natural Earth](https://www.naturalearthdata.com/downloads/) +w małej skali i przygotuj wizualizację. Funkcje `download.file()` oraz `unzip()` +mogą być tutaj przydatne. diff --git a/notebooks/01_wprowadzenie.html b/notebooks/01_wprowadzenie.html new file mode 100644 index 0000000..b764d78 --- /dev/null +++ b/notebooks/01_wprowadzenie.html @@ -0,0 +1,1739 @@ + + + + +
+ + + + + + + + + +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.tif
logo.tif
meuse.tif
Do 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
.
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.
+logo.tif
z pakietu i sprawdź jego
+metadane.download.file()
oraz unzip()
mogą być tutaj
+przydatne.