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 @@ + + + + + + + + + + + + + + +Wprowadzenie + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ + + + + + + +
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).

+
+

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.

+
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:

+
    +
  • 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:

+
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").

+
+
+
+

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.

+
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:

+
    +
  • 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.

+
writeVector(wektor, filename = "wektor.gpkg")
+
+
+
+

Wizualizacje

+

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.

+
+
+

Zadanie

+
    +
  1. Wczytaj plik logo.tif z pakietu i sprawdź jego +metadane.
  2. +
  3. Pobierz dane z Natural Earth w +małej skali i przygotuj wizualizację. Funkcje +download.file() oraz unzip() mogą być tutaj +przydatne.
  4. +
+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + +