GISProjekt R

Leaflet w R

Pokazaliśmy Wam jakiś czas temu jak prezentować wyniki swoich analiz na mapach z wykorzystaniem ggmap. Dzisiaj zaprezentujemy Wam jak używać pakietu leaflet w R do tworzenia interaktywnych map. Dodatkowo potrzebować będziemy bibliotek raster i sf do wczytania i przetworzenia warstw wejściowych:

library(leaflet)
library(raster)
library(sf)

Do naszego ćwiczenia użyjemy warstwy wektorowe używane już wcześniej: koleje i drogi.  Wczytajmy je:

railways <- st_read("d:/kolej.shp")
roads <- st_read("d:/drogi.shp")

Znajdźmy przejazdy:

railway_crossings <- st_intersection(railways,roads)

Wczytajmy jeszcze raster. Użyjemy NMT dla Mazowsza:

dem <- raster("d:/mazowieckie_dem.tif")

Wczytany raster nie ma nadanego układu współrzędnych. Poprawmy to:

projection(dem) = CRS(„+init=EPSG:2180”)

projection(dem) = CRS("+init=EPSG:2180")

Przytniemy NMT do zasięgu warstwy dróg:

dem <- crop(nmt,roads)

Otwórzmy podstawę mapy używając leaflet i dodając domyśle kafle podkładu mapy OSM:

m <- leaflet() %>% addTiles()

Wyświetlmy mapę:

m

leaflet_1

Dodajmy do mapy warstwę rastrową NMT, z przezroczystością 0.8 funkcją addRasterImage:

m %>%
 addRasterImage(dem, opacity = 0.8, group = "DEM")

leaflet_2

Dodajmy warstwę dróg (kolor niebieski) i linii kolejowych (kolor czerwony) korzystając z addPolylines. Dla warstw wektorowych konieczna jest transformacja do układu geograficznego z użyciem st_transform:

m %>%
 addRasterImage(dem, opacity = 0.8, group = "DEM") %>%  
 addPolylines(data = st_transform(railways,4326), group = "Railways") %>%
 addPolylines(data = st_transform(roads,4326), color = "red", group = "Roads")

leaflet_3

Wcześniej wykonaliśmy intersekcje dwóch wczytanych warstw, uzyskując warstwę punktową z przejazdami. Dodajmy ją do naszej mapy używając addCircleMakers:

m %>%
 addRasterImage(dem, opacity = 0.8, group = "DEM") %>%  
 addPolylines(data = st_transform(railways,4326), group = "Railways") %>%
 addPolylines(data = st_transform(roads,4326), color = "red", group = "Roads") %>%
 addCircleMarkers(data = st_transform(railway_crossing,4326), color = "green", group = "Railway crossings")

leaflet_4

Nasza mapa zawiera już wszystkie warstwy. Mapa jest interaktywna – możemy dowolnie się po niej poruszać.

Czy zwróciliście uwagę że dla każdej funkcji dodającej warstwę zdefiniowaliśmy atrybut group. Wartości tego atrybutu wykorzystamy w ostatnim kroku dodając do mapy listę warstw. Podzielimy warstwy na te wyświetlane niezależnie (baseGroups) i te które mogą się nakładać (overlayGroups).

m %>%
 addRasterImage(dem, opacity = 0.8, group = "DEM") %>%  
 addPolylines(data = st_transform(railways,4326), group = "Railways") %>%
 addPolylines(data = st_transform(roads,4326), color = "red", group = "Roads") %>%
 addCircleMarkers(data = st_transform(railway_crossings,4326), color = "green", group = "Railway crossings") %>%
 addLayersControl(baseGroups = c("Railways","Roads"), overlayGroups = c("Railway crossings","DEM"))

Ostatecznie mapa wygląda i działa tak:

Post miał na celu tylko przybliżyć Wam możliwości pakietu leaflet. Posiada on wiele większe możliwości nie wspomniane dzisiaj, które musicie odkryć sami. Rozszerzyć wiedzę o użytych dzisiaj funkcjach bibliotek raster i sf możecie w naszym Kursie GIS w R.