class: center, middle, inverse, title-slide # Analiza geoinformacyjna w R ### Jakub Nowosad, Paweł Bogawski ### VII Forum BioGIS, 2019-03-22, Poznań --- class: inverse, left, bottom # Ekosystem(y) <!-- R, począwszy od jego powstania w latach 90, ma długą historię wspierania analiz geoinformacyjnych. --> <!-- Ważnym krokiem w tym kierunku było, między innymi, stworzenie pakietów sp w 2005 i raster w 2010. --> <!-- Pierwszy z nich stał się podstawą pod setki kolejnych pakietów pozwalających na analizy przestrzenne, drugi natomiast ułatwił pracę z dużymi zbiorami danych rastrowych. --> <!-- W ostatnim czasie pojawiło się jednak kilka nowych pakietów, które w znaczny sposób zmieniły pracę z danymi przestrzennymi w R. --> <!-- Szczególnie dotyczy to pakietu sf będącego następcą pakietu sp, ale także pakietu terra (następcy pakietu raster) i pakietu stars (systemu do pracy z nieregularnymi zbiorami danych przestrzennych). --> <!-- To zróżnicowanie widoczne jest także w niemal każdej grupie geoinformacyjnych pakietów R, w tym służących do pobierania danych przestrzennych (np., rworldmap, rnaturalearth, cshapes) czy wizualizacji przestrzennych (np., rasterVis, leaflet, mapview, ggmap, ggplot2, cartogram, tmap). --> <!-- Celem tego warsztatu będzie łagodne wprowadzenie uczestników do złożonego systemu geoinformacyjnego w R. --> <!-- Pokazane będzie w jaki sposób zacząć analizowanie i wizualizowanie danych przestrzennych w R i które pakiety mogą być w tym pomocne. --> <!-- Dodatkowo wskazane będą miejsca gdzie szukać pomocy w razie natknięcia na problemy oraz materiały, które pozwolą na dalszy rozwój umiętności analizowania danych przestrzennych w R. --> --- # Ekosystem(y) <div class="figure" style="text-align: center"> <img src="figs/rb.png" alt="Z prezentacji Rogera Bivanda 'A practical history of R'" width="80%" /> <p class="caption">Z prezentacji Rogera Bivanda 'A practical history of R'</p> </div> --- # Ekosystem(y) <div class="figure" style="text-align: center"> <img src="figs/rb2.png" alt="Z prezentacji Rogera Bivanda 'A practical history of R-sig-geo'" width="80%" /> <p class="caption">Z prezentacji Rogera Bivanda 'A practical history of R-sig-geo'</p> </div> --- # Ekosystem(y) <!-- zdjęcie dzungli? --> .pull-left[ Pakiety (moduły) R: - **sf**, **raster** - klasy obiektów przestrzennych - **dplyr**, **rmapshaper** - przetwarzanie tabel atrybutów/geometrii - **rnaturalearth**, **osmdata**, **getlandsat** - pobieranie danych przestrzennych - **rgrass7**, **RQGIS**, **RSAGA**, **link2GI** - łączenie z oprogramowaniem GIS - **gstat**, **mlr**, **CAST** - modelowanie danych przestrzennych - **rasterVis**, **tmap**, **ggplot** - wizualizacje statyczne - **leaflet**, **mapview**, **mapdeck** - wizualizacje interaktywne - wiele innych... ] .pull-right[ <img src="figs/ecosystem.jpg" width="70%" style="display: block; margin: auto;" /> ] <!-- kontekst przestrzenny --> <!-- rspatial vs r-spatial --> <!-- sp vs sf --> <!-- raster vs stars vs terra --> --- # Ekosystem(y) .pull-left[ Klasy obiektów przestrzennych: - **sf** - **raster** ] .pull-right[ Wizualizacje: - **tmap** ] --- # Ekosystem(y) <!-- rspatial vs r-spatial --> .pull-left[ Klasy obiektów przestrzennych: - **sf** - **raster** - **sp** - **stars** - **terra** - **spatial** - ... ] .pull-right[ Wizualizacje: - **tmap** - **ggplot** - **rasterVis** - **leaflet** - **mapview** - **mapdeck** - ... ] --- # Wymagania wstępne .pull-left[ Wszystkie pakiety używane w poniższych przykładach można zainstalować używając kodu poniżej: ```r pkgs = c( "sf", "raster", "dplyr", "tmap", "landscapemetrics", "landscapetools", "usethis" ) to_install = !pkgs %in% installed.packages() if(any(to_install)) { install.packages(pkgs[to_install]) } ``` ] .pull-right[ Do pobrania materiałów na te warsztaty służy poniższy kod: ```r usethis::use_course("http://bit.ly/biogis19") ``` ] --- # Zadania 1. Zastanów się w czym R może tobie pomóc? Dlaczego chcesz się nauczyć go używać do analiz geoinformacyjnych? 2. Przejrzyj [CRAN Task View: Analysis of Spatial Data](https://cran.r-project.org/web/views/Spatial.html) i sprawdź czy istnieją tam pakiety, które mogą się Tobie przydać w codziennej pracy? <!-- 3. Wypełnij ankietę znajdującą się na stronie https://goo.gl/forms/HC0wOAKMMKrbsb1w2. --> --- class: inverse, left, bottom # Reprezentacja danych przestrzennych --- # Reprezentacja danych przestrzennych <!-- co to --> **sf**: - Pakiet **sf** to następca pakietu **sp** oparty o OGC standard Simple Features. - Łączy on możliwości zarówno pakietu **sp** jak i pakietów **rgdal** i **rgeos**. - Większość jego funkcji zaczyna się od prefiksu `st_`. - Ten pakiet pozwala na obsługę dodatkowych typów danych wektorowych (np. poligon i multipoligon to dwie oddzielne klasy), łatwiejsze przetwarzanie danych, oraz obsługę przestrzennych baz danych takich jak PostGIS. - https://r-spatial.github.io/sf/ oraz https://github.com/rstudio/cheatsheets/blob/master/sf.pdf **raster**: - Pakiet **raster** zawiera klasy i metody reprezentujące obiekty i operacje rastrowe. - Pozwala on na wczytywanie i zapisywanie danych rastrowych. - Umożliwia algebrę rastrów i przetwarzanie rastrów. - W jego skład wchodzi szereg dodatkowych funkcji, np. do analiz charakterystyk terenu. - Pozwala na pracę na dużych zbiorach danych. - ?`raster-package` oraz http://www.rpubs.com/etiennebr/visualraster --- # Wczytywanie danych przestrzennych - wektor .pull-left[ ```r library(sf) polska = st_read("data/polska.gpkg") ``` ``` ## Reading layer `polska' from data source `/home/jn/Science/conferences/BioGIS_19/workshop-pl/data/polska.gpkg' using driver `GPKG' ## Simple feature collection with 1 feature and 3 fields ## geometry type: POLYGON ## dimension: XY ## bbox: xmin: 171842.5 ymin: 132323.8 xmax: 861798.4 ymax: 775305.9 ## epsg (SRID): NA ## proj4string: +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ``` - Do zapisywania danych wektorowych służy funkcja `st_write()`. ] .pull-right[ ```r plot(polska) ``` <img src="index_files/figure-html/unnamed-chunk-7-1.png" style="display: block; margin: auto;" /> ] --- # Struktura obiektów przestrzennych - wektor ```r polska ``` ``` ## Simple feature collection with 1 feature and 3 fields ## geometry type: POLYGON ## dimension: XY ## bbox: xmin: 171842.5 ymin: 132323.8 xmax: 861798.4 ymax: 775305.9 ## epsg (SRID): NA ## proj4string: +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ## name pop_est gdp_md_est geom ## 1 Poland 38476269 1052000 POLYGON ((487928.3 182549, ... ``` --- # Wczytywanie danych przestrzennych - raster .pull-left[ ```r library(raster) dem = raster("data/polska_srtm.tif") ``` - Do zapisywania danych rastrowych służy funkcja `writeRaster()`. ] .pull-right[ ```r plot(dem) ``` <img src="index_files/figure-html/unnamed-chunk-10-1.png" style="display: block; margin: auto;" /> ] --- # Struktura obiektów przestrzennych - raster ```r dem ``` ``` ## class : RasterLayer ## dimensions : 702, 1202, 843804 (nrow, ncol, ncell) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : 14.125, 24.14167, 48.99167, 54.84167 (xmin, xmax, ymin, ymax) ## crs : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 ## source : /home/jn/Science/conferences/BioGIS_19/workshop-pl/data/polska_srtm.tif ## names : polska_srtm ## values : -9, 2220 (min, max) ``` --- # Zadania 1. Wczytaj do R plik `wlkp_pn.gpkg` zawierający granice Wielkopolskiego Parku Narodowego. Wyświetl ten obiekt i przejrzyj jego strukturę. Co możesz powiedzieć o zawartości tego pliku? Jaki typ danych on przechowuje? Jaki ma układ współrzędnych? Ile atrybutów zawiera? Jaka jest jego geometria? 2. Wczytaj do R plik `wlkp_pn_dem.tif` zawierający cyfrowy model wysokościowy dla obszaru Wielkopolskiego Parku Narodowego. Wyświetl ten obiekt i przejrzyj jego strukturę. Co możesz powiedzieć o zawartości tego pliku? Jaki typ danych on przechowuje? Jaki ma układ współrzędnych? Ile atrybutów zawiera? Jakie ma wymiary i rozdzielczość? --- class: inverse, left, bottom # Wizualizacja przestrzenna --- # Wizualizacja przestrzenna ```r library(tmap) ``` - Pakiet służący do tworzenia map tematycznych - Pozwala on na budowanie map statycznych, map animowanych oraz map interaktywnych - Jego obsługa oparta jest o dodawanie kolejnych warstw do zwizualizowania a następnie ich modyfikacji - https://github.com/mtennekes/tmap - lista dodatkowych materiałów do pakietu **tmap** <!-- add resources --> --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(polska) + tm_polygons() ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(polska) + tm_polygons() + tm_scale_bar(position = c("left", "bottom")) ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(polska) + tm_polygons() + tm_scale_bar(position = c("left", "bottom")) + tm_compass() ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(polska) + tm_polygons() + tm_scale_bar(position = c("left", "bottom")) + tm_compass() + tm_layout(title = "Polska") ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna ```r tmap_mode("view") ``` ```r tm_shape(polska) + tm_polygons() + tm_layout(title = "Polska") ``` ```r tmap_mode("plot") ``` --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(dem) + tm_raster() ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(dem) + tm_raster(style = "cont", midpoint = NA) ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(dem) + tm_raster(style = "cont", midpoint = NA, palette = "-RdYlGn") ``` ```r tmaptools::palette_explorer() ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(dem) + tm_raster(style = "fixed", breaks = c(-99, 0, 300, 600, 9999), midpoint = NA, palette = "-RdYlGn", title = "") + tm_layout(legend.position = c("LEFT", "BOTTOM")) ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(dem) + tm_raster(style = "fixed", breaks = c(-99, 0, 300, 600, 9999), labels = c("Depresje", "Niziny", "Wyżyny", "Góry"), midpoint = NA, palette = "-RdYlGn", title = "") + tm_layout(legend.position = c("LEFT", "BOTTOM")) ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna .left-code[ ```r tm_shape(dem) + tm_raster(style = "fixed", breaks = c(-99, 0, 300, 600, 9999), labels = c("Depresje", "Niziny", "Wyżyny", "Góry"), midpoint = NA, palette = c("#5E8B73", "#DAE97A", "#EADC70", "#AF8D5C"), title = "") + tm_layout(legend.position = c("LEFT", "BOTTOM")) ``` ] .right-plot[  ] --- # Wizualizacja przestrzenna ```r mapa1 = tm_shape(dem) + tm_raster(style = "fixed", breaks = c(-99, 0, 300, 600, 9999), labels = c("Depresje", "Niziny", "Wyżyny", "Góry"), midpoint = NA, palette = c("#5E8B73", "#DAE97A", "#EADC70", "#AF8D5C"), title = "") + tm_layout(legend.position = c("LEFT", "BOTTOM")) ``` ```r tmap_save(mapa1, "moja_mapa1.png") ``` --- # Zadania 1. Ulepsz obiekt `mapa1` poprzez np. dodanie skali, strzałki północy, czy tytułu. Spróbuj też dodać granicę Polski do tej mapy. <!-- 2. Wczytaj do R plik `polska_stacje.gpkg` zawierające wybrane stacje meteorologiczne w Polsce. --> <!-- Dodaj punty ze stacjami meteorologicznymi do mapy stworzonej w punkcie pierwszym. --> 2. Wczytaj do R pliki `wlkp_pn.gpkg` oraz `wlkp_pn_dem.tif`. Stwórz mapę przedstawiającą model terenu dla dla obszaru Wielkopolskiego Parku Narodowego. Zapisz uzyskaną mapę do pliku "WLKP_NAZWISKO.png". 3. Dodatkowo: spróbuj powtórzyć kroki z artykułu [Geocomputation with R: maps extended](https://geocompr.github.io/geocompkg/articles/maps.html) w celu wykonania mapy Polski z rzeźbą terenu wykonaną metodą cieniowania. --- class: inverse, left, bottom # Przetwarzanie danych <!-- 1. Przytnij dane dla parku!! --> --- # Przetwarzanie danych ```r library(dplyr) ``` - Pakiet **dplyr** pozwala na łatwe przetwarzanie danych występujących w postaci tabelarycznej - Jego możliwości obejmują wybieranie konkretnych kolumn czy wierszy, dodawane nowych kolumn, czy wykonywanie podsumowań - Więcej informacji można znaleźć na https://dplyr.tidyverse.org/ oraz https://r4ds.had.co.nz/transform.html <!-- dplyr +++ --> --- # Przetwarzanie atrybutów ```r dane_meteo = read.csv("data/polska_meteo_2017.csv") head(dane_meteo) ``` <table> <thead> <tr> <th style="text-align:right;"> Kod.stacji </th> <th style="text-align:left;"> Nazwa.stacji </th> <th style="text-align:right;"> Rok </th> <th style="text-align:right;"> Miesiac </th> <th style="text-align:right;"> Dzien </th> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> precip </th> <th style="text-align:right;"> vapor_pres </th> <th style="text-align:right;"> humidity </th> <th style="text-align:right;"> pressure </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 354150100 </td> <td style="text-align:left;"> KOŁOBRZEG </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 3.6 </td> <td style="text-align:right;"> 4.6 </td> <td style="text-align:right;"> 7.4 </td> <td style="text-align:right;"> 92.5 </td> <td style="text-align:right;"> 1013.5 </td> </tr> <tr> <td style="text-align:right;"> 354150100 </td> <td style="text-align:left;"> KOŁOBRZEG </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;"> 3.5 </td> <td style="text-align:right;"> 4.7 </td> <td style="text-align:right;"> 6.0 </td> <td style="text-align:right;"> 76.9 </td> <td style="text-align:right;"> 1011.1 </td> </tr> <tr> <td style="text-align:right;"> 354150100 </td> <td style="text-align:left;"> KOŁOBRZEG </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 1.9 </td> <td style="text-align:right;"> 10.0 </td> <td style="text-align:right;"> 6.7 </td> <td style="text-align:right;"> 92.3 </td> <td style="text-align:right;"> 1007.1 </td> </tr> <tr> <td style="text-align:right;"> 354150100 </td> <td style="text-align:left;"> KOŁOBRZEG </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 2.7 </td> <td style="text-align:right;"> 2.3 </td> <td style="text-align:right;"> 5.8 </td> <td style="text-align:right;"> 76.0 </td> <td style="text-align:right;"> 993.9 </td> </tr> <tr> <td style="text-align:right;"> 354150100 </td> <td style="text-align:left;"> KOŁOBRZEG </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> -1.7 </td> <td style="text-align:right;"> 6.2 </td> <td style="text-align:right;"> 3.9 </td> <td style="text-align:right;"> 74.5 </td> <td style="text-align:right;"> 1024.3 </td> </tr> <tr> <td style="text-align:right;"> 354150100 </td> <td style="text-align:left;"> KOŁOBRZEG </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 6 </td> <td style="text-align:right;"> -4.5 </td> <td style="text-align:right;"> 4.0 </td> <td style="text-align:right;"> 3.5 </td> <td style="text-align:right;"> 77.3 </td> <td style="text-align:right;"> 1038.7 </td> </tr> </tbody> </table> --- # Przetwarzanie atrybutów ```r stacje_meteo = st_read("data/polska_stacje.gpkg") ``` ``` ## Reading layer `polska_stacje' from data source `/home/jn/Science/conferences/BioGIS_19/workshop-pl/data/polska_stacje.gpkg' using driver `GPKG' ## Simple feature collection with 1998 features and 2 fields ## geometry type: POINT ## dimension: XY ## bbox: xmin: 172691.6 ymin: 139488.3 xmax: 854361.7 ymax: 846760.3 ## epsg (SRID): NA ## proj4string: +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs ``` ```r plot(st_geometry(stacje_meteo)) ``` <img src="index_files/figure-html/unnamed-chunk-22-1.png" style="display: block; margin: auto;" /> --- # Przetwarzanie atrybutów ```r dane_meteo_wyb = dane_meteo %>% filter(Nazwa.stacji %in% unique(stacje_meteo$NAZWA_ST)) ``` <table> <thead> <tr> <th style="text-align:right;"> Kod.stacji </th> <th style="text-align:left;"> Nazwa.stacji </th> <th style="text-align:right;"> Rok </th> <th style="text-align:right;"> Miesiac </th> <th style="text-align:right;"> Dzien </th> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> precip </th> <th style="text-align:right;"> vapor_pres </th> <th style="text-align:right;"> humidity </th> <th style="text-align:right;"> pressure </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 3.4 </td> <td style="text-align:right;"> 7.0 </td> <td style="text-align:right;"> 7.5 </td> <td style="text-align:right;"> 95.4 </td> <td style="text-align:right;"> 1013.5 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;"> 2.3 </td> <td style="text-align:right;"> 0.9 </td> <td style="text-align:right;"> 5.8 </td> <td style="text-align:right;"> 80.6 </td> <td style="text-align:right;"> 1010.7 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 1.4 </td> <td style="text-align:right;"> 8.0 </td> <td style="text-align:right;"> 6.4 </td> <td style="text-align:right;"> 93.0 </td> <td style="text-align:right;"> 1007.0 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 2.3 </td> <td style="text-align:right;"> 6.9 </td> <td style="text-align:right;"> 5.6 </td> <td style="text-align:right;"> 77.0 </td> <td style="text-align:right;"> 992.7 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> -2.9 </td> <td style="text-align:right;"> 1.5 </td> <td style="text-align:right;"> 2.8 </td> <td style="text-align:right;"> 55.6 </td> <td style="text-align:right;"> 1023.6 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 6 </td> <td style="text-align:right;"> -5.7 </td> <td style="text-align:right;"> 0.9 </td> <td style="text-align:right;"> 3.2 </td> <td style="text-align:right;"> 79.5 </td> <td style="text-align:right;"> 1038.8 </td> </tr> </tbody> </table> --- # Przetwarzanie atrybutów ```r dane_meteo_wyb = dane_meteo %>% filter(Nazwa.stacji %in% unique(stacje_meteo$NAZWA_ST)) %>% mutate(data = as.Date(paste0(Rok, "-", Miesiac, "-", Dzien))) ``` <table> <thead> <tr> <th style="text-align:right;"> Kod.stacji </th> <th style="text-align:left;"> Nazwa.stacji </th> <th style="text-align:right;"> Rok </th> <th style="text-align:right;"> Miesiac </th> <th style="text-align:right;"> Dzien </th> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> precip </th> <th style="text-align:right;"> vapor_pres </th> <th style="text-align:right;"> humidity </th> <th style="text-align:right;"> pressure </th> <th style="text-align:left;"> data </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 3.4 </td> <td style="text-align:right;"> 7.0 </td> <td style="text-align:right;"> 7.5 </td> <td style="text-align:right;"> 95.4 </td> <td style="text-align:right;"> 1013.5 </td> <td style="text-align:left;"> 2017-01-01 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;"> 2.3 </td> <td style="text-align:right;"> 0.9 </td> <td style="text-align:right;"> 5.8 </td> <td style="text-align:right;"> 80.6 </td> <td style="text-align:right;"> 1010.7 </td> <td style="text-align:left;"> 2017-01-02 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 1.4 </td> <td style="text-align:right;"> 8.0 </td> <td style="text-align:right;"> 6.4 </td> <td style="text-align:right;"> 93.0 </td> <td style="text-align:right;"> 1007.0 </td> <td style="text-align:left;"> 2017-01-03 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 2.3 </td> <td style="text-align:right;"> 6.9 </td> <td style="text-align:right;"> 5.6 </td> <td style="text-align:right;"> 77.0 </td> <td style="text-align:right;"> 992.7 </td> <td style="text-align:left;"> 2017-01-04 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> -2.9 </td> <td style="text-align:right;"> 1.5 </td> <td style="text-align:right;"> 2.8 </td> <td style="text-align:right;"> 55.6 </td> <td style="text-align:right;"> 1023.6 </td> <td style="text-align:left;"> 2017-01-05 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2017 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 6 </td> <td style="text-align:right;"> -5.7 </td> <td style="text-align:right;"> 0.9 </td> <td style="text-align:right;"> 3.2 </td> <td style="text-align:right;"> 79.5 </td> <td style="text-align:right;"> 1038.8 </td> <td style="text-align:left;"> 2017-01-06 </td> </tr> </tbody> </table> --- # Przetwarzanie atrybutów ```r dane_meteo_wyb = dane_meteo %>% filter(Nazwa.stacji %in% unique(stacje_meteo$NAZWA_ST)) %>% mutate(data = as.Date(paste0(Rok, "-", Miesiac, "-", Dzien))) %>% dplyr::select(-Rok, -Miesiac, -Dzien) ``` <table> <thead> <tr> <th style="text-align:right;"> Kod.stacji </th> <th style="text-align:left;"> Nazwa.stacji </th> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> precip </th> <th style="text-align:right;"> vapor_pres </th> <th style="text-align:right;"> humidity </th> <th style="text-align:right;"> pressure </th> <th style="text-align:left;"> data </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 3.4 </td> <td style="text-align:right;"> 7.0 </td> <td style="text-align:right;"> 7.5 </td> <td style="text-align:right;"> 95.4 </td> <td style="text-align:right;"> 1013.5 </td> <td style="text-align:left;"> 2017-01-01 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2.3 </td> <td style="text-align:right;"> 0.9 </td> <td style="text-align:right;"> 5.8 </td> <td style="text-align:right;"> 80.6 </td> <td style="text-align:right;"> 1010.7 </td> <td style="text-align:left;"> 2017-01-02 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 1.4 </td> <td style="text-align:right;"> 8.0 </td> <td style="text-align:right;"> 6.4 </td> <td style="text-align:right;"> 93.0 </td> <td style="text-align:right;"> 1007.0 </td> <td style="text-align:left;"> 2017-01-03 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> 2.3 </td> <td style="text-align:right;"> 6.9 </td> <td style="text-align:right;"> 5.6 </td> <td style="text-align:right;"> 77.0 </td> <td style="text-align:right;"> 992.7 </td> <td style="text-align:left;"> 2017-01-04 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> -2.9 </td> <td style="text-align:right;"> 1.5 </td> <td style="text-align:right;"> 2.8 </td> <td style="text-align:right;"> 55.6 </td> <td style="text-align:right;"> 1023.6 </td> <td style="text-align:left;"> 2017-01-05 </td> </tr> <tr> <td style="text-align:right;"> 354160105 </td> <td style="text-align:left;"> KOSZALIN </td> <td style="text-align:right;"> -5.7 </td> <td style="text-align:right;"> 0.9 </td> <td style="text-align:right;"> 3.2 </td> <td style="text-align:right;"> 79.5 </td> <td style="text-align:right;"> 1038.8 </td> <td style="text-align:left;"> 2017-01-06 </td> </tr> </tbody> </table> --- # Przetwarzanie atrybutów ```r dane_meteo_wyb = dane_meteo %>% filter(Nazwa.stacji %in% unique(stacje_meteo$NAZWA_ST)) %>% mutate(data = as.Date(paste0(Rok, "-", Miesiac, "-", Dzien))) %>% dplyr::select(-Rok, -Miesiac, -Dzien) %>% summarize(tavg = mean(tavg), pressure = mean(pressure)) ``` <table> <thead> <tr> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> pressure </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 8.685298 </td> <td style="text-align:right;"> 960.5246 </td> </tr> </tbody> </table> --- # Przetwarzanie atrybutów ```r dane_meteo_wyb = dane_meteo %>% filter(Nazwa.stacji %in% unique(stacje_meteo$NAZWA_ST)) %>% mutate(data = as.Date(paste0(Rok, "-", Miesiac, "-", Dzien))) %>% dplyr::select(-Rok, -Miesiac, -Dzien) %>% group_by(Kod.stacji) %>% summarize(tavg = mean(tavg), pressure = mean(pressure)) ``` <table> <thead> <tr> <th style="text-align:right;"> Kod.stacji </th> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> pressure </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 349190600 </td> <td style="text-align:right;"> 9.2780822 </td> <td style="text-align:right;"> 1017.513 </td> </tr> <tr> <td style="text-align:right;"> 349190625 </td> <td style="text-align:right;"> 6.5290411 </td> <td style="text-align:right;"> 0.000 </td> </tr> <tr> <td style="text-align:right;"> 349190650 </td> <td style="text-align:right;"> 0.1978082 </td> <td style="text-align:right;"> 0.000 </td> </tr> <tr> <td style="text-align:right;"> 349200660 </td> <td style="text-align:right;"> 9.2180822 </td> <td style="text-align:right;"> 1014.784 </td> </tr> <tr> <td style="text-align:right;"> 349210670 </td> <td style="text-align:right;"> 8.7728767 </td> <td style="text-align:right;"> 1017.553 </td> </tr> <tr> <td style="text-align:right;"> 349220690 </td> <td style="text-align:right;"> 8.3227397 </td> <td style="text-align:right;"> 1017.737 </td> </tr> </tbody> </table> --- # Łączenie danych ```r meteo = stacje_meteo %>% left_join(dane_meteo_wyb, by = c("KOD_SZS" = "Kod.stacji")) ``` <table> <thead> <tr> <th style="text-align:right;"> KOD_SZS </th> <th style="text-align:left;"> NAZWA_ST </th> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> pressure </th> <th style="text-align:left;"> geom </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 249190020 </td> <td style="text-align:left;"> BRZEŹNICA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> c(545976.260510018, 233149.457458902) </td> </tr> <tr> <td style="text-align:right;"> 249199999 </td> <td style="text-align:left;"> OSIEK </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> c(519109.405047427, 231411.908795745) </td> </tr> <tr> <td style="text-align:right;"> 249190040 </td> <td style="text-align:left;"> GIERAŁTOWICE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> c(527197.290270776, 230151.641154815) </td> </tr> <tr> <td style="text-align:right;"> 249190050 </td> <td style="text-align:left;"> RADZISZÓW </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> c(558306.218144104, 230885.909302064) </td> </tr> <tr> <td style="text-align:right;"> 249190060 </td> <td style="text-align:left;"> SIEPRAW </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> c(569259.6149073, 226821.435334128) </td> </tr> <tr> <td style="text-align:right;"> 249190070 </td> <td style="text-align:left;"> KĘTY </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> c(516182.656254972, 223533.556193128) </td> </tr> </tbody> </table> --- # Łączenie danych ```r meteo = stacje_meteo %>% inner_join(dane_meteo_wyb, by = c("KOD_SZS" = "Kod.stacji")) ``` <table> <thead> <tr> <th style="text-align:right;"> KOD_SZS </th> <th style="text-align:left;"> NAZWA_ST </th> <th style="text-align:right;"> tavg </th> <th style="text-align:right;"> pressure </th> <th style="text-align:left;"> geom </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 349190625 </td> <td style="text-align:left;"> ZAKOPANE </td> <td style="text-align:right;"> 6.5290411 </td> <td style="text-align:right;"> 0.000 </td> <td style="text-align:left;"> c(569804.515915351, 158924.036586795) </td> </tr> <tr> <td style="text-align:right;"> 349190650 </td> <td style="text-align:left;"> KASPROWY WIERCH </td> <td style="text-align:right;"> 0.1978082 </td> <td style="text-align:right;"> 0.000 </td> <td style="text-align:left;"> c(571455.865783155, 152132.170449405) </td> </tr> <tr> <td style="text-align:right;"> 349200660 </td> <td style="text-align:left;"> NOWY SĄCZ </td> <td style="text-align:right;"> 9.2180822 </td> <td style="text-align:right;"> 1014.784 </td> <td style="text-align:left;"> c(621910.953224735, 196894.713701549) </td> </tr> <tr> <td style="text-align:right;"> 349210670 </td> <td style="text-align:left;"> KROSNO </td> <td style="text-align:right;"> 8.7728767 </td> <td style="text-align:right;"> 1017.553 </td> <td style="text-align:left;"> c(699590.639267207, 208053.055658539) </td> </tr> <tr> <td style="text-align:right;"> 349220690 </td> <td style="text-align:left;"> LESKO </td> <td style="text-align:right;"> 8.3227397 </td> <td style="text-align:right;"> 1017.737 </td> <td style="text-align:left;"> c(742035.646054704, 183036.071495296) </td> </tr> <tr> <td style="text-align:right;"> 350200570 </td> <td style="text-align:left;"> KIELCE-SUKÓW </td> <td style="text-align:right;"> 8.4849315 </td> <td style="text-align:right;"> 1016.895 </td> <td style="text-align:left;"> c(619185.547042676, 328424.723335625) </td> </tr> </tbody> </table> --- # Reprojekcje .pull-left[ ```r plot(dem) ``` <img src="index_files/figure-html/unnamed-chunk-37-1.png" style="display: block; margin: auto;" /> ] .pull-right[ ```r plot(st_geometry(meteo), axes = TRUE) ``` <img src="index_files/figure-html/unnamed-chunk-38-1.png" style="display: block; margin: auto;" /> ] --- # Reprojekcje ```r meteo = stacje_meteo %>% inner_join(dane_meteo_wyb, by = c("KOD_SZS" = "Kod.stacji")) %>% st_transform(4326) ``` --- # Reprojekcje ```r tm_shape(dem) + tm_raster() + tm_shape(meteo) + tm_symbols(col = "tavg", palette = "RdBu") ``` <img src="index_files/figure-html/unnamed-chunk-40-1.png" style="display: block; margin: auto;" /> --- # Interakcja wektor-raster ```r meteo$elev = extract(dem, meteo) head(meteo) ``` ``` ## Simple feature collection with 6 features and 5 fields ## geometry type: POINT ## dimension: XY ## bbox: xmin: 19.96032 ymin: 49.23253 xmax: 22.3417 ymax: 50.81048 ## epsg (SRID): 4326 ## proj4string: +proj=longlat +datum=WGS84 +no_defs ## KOD_SZS NAZWA_ST tavg pressure geom ## 1 349190625 ZAKOPANE 6.5290411 0.000 POINT (19.96032 49.29382) ## 2 349190650 KASPROWY WIERCH 0.1978082 0.000 POINT (19.98182 49.23253) ## 3 349200660 NOWY SĄCZ 9.2180822 1014.784 POINT (20.6886 49.62714) ## 4 349210670 KROSNO 8.7728767 1017.553 POINT (21.76917 49.70674) ## 5 349220690 LESKO 8.3227397 1017.737 POINT (22.3417 49.46647) ## 6 350200570 KIELCE-SUKÓW 8.4849315 1016.895 POINT (20.69221 50.81048) ## elev ## 1 844 ## 2 1796 ## 3 275 ## 4 323 ## 5 384 ## 6 247 ``` --- # Interakcja raster-wektor .pull-left[ ```r lc = raster("data/polska_lc.tif") plot(lc) ``` <img src="index_files/figure-html/unnamed-chunk-42-1.png" style="display: block; margin: auto;" /> ] .pull-right[ ```r wlkp_pn = st_read("data/wlkp_pn.gpkg", quiet = TRUE) plot(st_geometry(wlkp_pn), axes = TRUE) ``` <img src="index_files/figure-html/unnamed-chunk-43-1.png" style="display: block; margin: auto;" /> ] --- # Interakcja raster-wektor ```r wlkp_pn_lc = crop(lc, wlkp_pn) plot(wlkp_pn_lc) ``` <img src="index_files/figure-html/unnamed-chunk-44-1.png" style="display: block; margin: auto;" /> --- # Interakcja raster-wektor ```r wlkp_pn_lc2 = mask(wlkp_pn_lc, wlkp_pn) plot(wlkp_pn_lc2) ``` <img src="index_files/figure-html/unnamed-chunk-45-1.png" style="display: block; margin: auto;" /> --- # Zadania 1. Wczytaj dane meteorologiczne dla roku 2017 oraz dane o położeniu stacji meteorologicznych. Stwórz obiekt przestrzenny zawierający wszystkie pomiary dla trzech stacji: `BIAŁYSTOK`, `KRAKÓW-BALICE`, oraz `POZNAŃ`. (Porada: użyj do tego, między innymi funkcji `right_join()`). 2. Wylicz średnią temperaturę w styczniu oraz w lipcu dla tych trzech stacji. 3. Określ na jakim pokryciu terenu znajdują się te trzy stacje. 4. Dodatkowe: ulepsz mapę temperatur średnich zaprezentowaną w części "Reprojekcje". --- class: inverse, left, bottom # Przykład - metryki krajobrazowe --- # Przykład - metryki krajobrazowe ```r library(landscapemetrics) library(landscapetools) ``` ```r show_landscape(wlkp_pn_lc, discrete = TRUE) ``` <img src="index_files/figure-html/unnamed-chunk-47-1.png" style="display: block; margin: auto;" /> --- # Przykład - metryki krajobrazowe ```r list_lsm() ``` ``` ## # A tibble: 132 x 5 ## metric name type level function_name ## <chr> <chr> <chr> <chr> <chr> ## 1 area patch area area and edge m… patch lsm_p_area ## 2 cai core area index core area metric patch lsm_p_cai ## 3 circle related circumscribing circ… shape metric patch lsm_p_circle ## 4 contig contiguity index shape metric patch lsm_p_contig ## 5 core core area core area metric patch lsm_p_core ## 6 enn euclidean nearest neighbor … aggregation met… patch lsm_p_enn ## 7 frac fractal dimension index shape metric patch lsm_p_frac ## 8 gyrate radius of gyration area and edge m… patch lsm_p_gyrate ## 9 ncore number of core areas core area metric patch lsm_p_ncore ## 10 para perimeter-area ratio shape metric patch lsm_p_para ## # … with 122 more rows ``` --- # Metryki krajobrazowe - krajobraz - AI - Aggregation index ```r lsm_l_ai(wlkp_pn_lc) ``` ``` ## # A tibble: 1 x 6 ## layer level class id metric value ## <int> <chr> <int> <int> <chr> <dbl> ## 1 1 landscape NA NA ai 70.3 ``` --- # Metryki krajobrazowe - klasa - ED - Edge density ```r lsm_c_ed(wlkp_pn_lc) ``` ``` ## # A tibble: 12 x 6 ## layer level class id metric value ## <int> <chr> <int> <int> <chr> <dbl> ## 1 1 class 10 NA ed 8.27 ## 2 1 class 11 NA ed 10.6 ## 3 1 class 30 NA ed 3.12 ## 4 1 class 40 NA ed 0.767 ## 5 1 class 60 NA ed 2.35 ## 6 1 class 70 NA ed 9.61 ## 7 1 class 90 NA ed 6.59 ## 8 1 class 100 NA ed 3.65 ## 9 1 class 130 NA ed 1.38 ## 10 1 class 180 NA ed 0.295 ## 11 1 class 190 NA ed 5.32 ## 12 1 class 210 NA ed 1.69 ``` --- # Metryki krajobrazowe - płat - PARA - Perimeter-Area ratio ```r lsm_p_para(wlkp_pn_lc) ``` ``` ## # A tibble: 234 x 6 ## layer level class id metric value ## <int> <chr> <int> <int> <chr> <dbl> ## 1 1 patch 10 1 para 0.0169 ## 2 1 patch 10 2 para 0.0169 ## 3 1 patch 10 3 para 0.0117 ## 4 1 patch 10 4 para 0.00620 ## 5 1 patch 10 5 para 0.0113 ## 6 1 patch 10 6 para 0.00893 ## 7 1 patch 10 7 para 0.0169 ## 8 1 patch 10 8 para 0.0169 ## 9 1 patch 10 9 para 0.0127 ## 10 1 patch 10 10 para 0.0126 ## # … with 224 more rows ``` --- # Metryki krajobrazowe - zbiorczo ```r calculate_lsm(wlkp_pn_lc, type = "aggregation metric") ``` ``` ## # A tibble: 428 x 6 ## layer level class id metric value ## <int> <chr> <int> <int> <chr> <dbl> ## 1 1 class 10 NA ai 43.4 ## 2 1 class 11 NA ai 85.0 ## 3 1 class 30 NA ai 25.7 ## 4 1 class 40 NA ai 40.6 ## 5 1 class 60 NA ai 63.6 ## 6 1 class 70 NA ai 68.7 ## 7 1 class 90 NA ai 70.9 ## 8 1 class 100 NA ai 33.5 ## 9 1 class 130 NA ai 66.7 ## 10 1 class 180 NA ai 37.5 ## # … with 418 more rows ``` --- # Metryki krajobrazowe - wizualizacja ```r mapa_p_para = get_lsm(wlkp_pn_lc, what = "lsm_p_para") ``` ``` ## Warning: only using 'what' argument ``` ```r show_landscape(mapa_p_para[[1]][[1]]) ``` <img src="index_files/figure-html/unnamed-chunk-53-1.png" style="display: block; margin: auto;" /> --- # Metryki krajobrazowe - wizualizacja ```r show_lsm(wlkp_pn_lc, what = "lsm_p_para") ``` <img src="index_files/figure-html/unnamed-chunk-54-1.png" style="display: block; margin: auto;" /> --- # Metryki krajobrazowe - próbki ```r punkt = st_sf(st_sfc(geom = st_point(c(347500, 493000)))) plot(wlkp_pn_lc) plot(st_geometry(punkt), add = TRUE, cex = 2) ``` <img src="index_files/figure-html/unnamed-chunk-55-1.png" style="display: block; margin: auto;" /> --- # Metryki krajobrazowe - próbki ```r sample_lsm(wlkp_pn_lc, punkt, shape = "circle", size = 2000, what = "lsm_c_ed") ``` ``` ## # A tibble: 10 x 8 ## layer level class id metric value plot_id percentage_inside ## <int> <chr> <int> <int> <chr> <dbl> <int> <dbl> ## 1 1 class 10 NA ed 11.5 1 100. ## 2 1 class 11 NA ed 19.9 1 100. ## 3 1 class 30 NA ed 5.26 1 100. ## 4 1 class 60 NA ed 2.14 1 100. ## 5 1 class 70 NA ed 9.34 1 100. ## 6 1 class 90 NA ed 7.50 1 100. ## 7 1 class 100 NA ed 7.80 1 100. ## 8 1 class 180 NA ed 0.795 1 100. ## 9 1 class 190 NA ed 2.14 1 100. ## 10 1 class 210 NA ed 0.795 1 100. ``` --- # Zadania 1. W pliku `polska_pn.gpkg` znajdują się granice parków narodowych w Polsce. Wczytaj ten plik do R i wybierz z niego tylko Białowieski Park Narodowy. 2. Przytnij mapę pokrycia terenu z pliku `polska_lc.tif` do zasięgu (obwiedni) Białowieskiego Parku Narodowego. 3. Jakie kategorie pokrycia terenu można znaleźć na tym obszarze (możesz do tego celu użyć funkcji `unique()`)? 4. Wylicz powierzchnię całego obszaru oraz powierzchnie kolejnych klas (`TA` i `CA`). Jakie są trzy kategorie o największej powierzchni? 5. Sprawdź ile płatów znajduje się na tym obszarze (`NP`). --- class: inverse, left, bottom # Źródła informacji --- # Źródła informacji .pull-left[ - http://geocompr.github.io/ - Lovelace R., Nowosad J., Muenchow J. 2019, **Geocomputation with R**. CRC Press - https://bookdown.org/nowosad/Geostatystyka/ - Nowosad, J. 2019, **Geostatystyka w R**. Poznań: Space A. ISBN 978-83-953296-0-9. - **sf** - https://r-spatial.github.io/sf/ - **raster** - https://rspatial.org/spatial/index.html - **tmap** - https://github.com/mtennekes/tmap - **dplyr** - http://r4ds.had.co.nz/ - Wickham H., Goremund G. 2016. **R for Data Science**. O'Reilly Media - **landscapemetrics** - https://r-spatialecology.github.io/landscapemetrics ] .pull-right[ Dodatkowe materiały na https://nowosad.github.io/elp/ergosum.html#resources: - Blogi - Kursy - Serwisy internetowe - Twitter `#rspatial`, `#geocompr` - Meetupy ] --- class: center, middle .pull-left[ ## O mnie: Twitter:
jakub_nowosad Email: nowosad.jakub@gmail.com https://nowosad.github.io https://geocompr.github.io/ ]