Buforowanie wektora w R
Buforowanie jest jednym z podstawowych narzędzi GIS używanym w analizach przestrzennych. Ale jak to zrobić w R? Wczytajmy najpierw warstwę kilku szlaków kolejowych z Open Street Map (pobierz) do zmiennej kolej, którą wykorzystamy do prezentacji możliwości funkcji buforowania:
library(rgdal)
kolej = readOGR("D:/","kolej",stringsAsFactors = FALSE)
Wyświetlmy wczytaną warstw:
plot(kolej)
Wyświetlmy podsumowanie dla wczytanej warstwy kolej:
summary(kolej)
Object of class SpatialLinesDataFrame
Coordinates:
min max
x 638667.5 678777.7
y 490053.6 519583.1
Is projected: TRUE
proj4string :
[+proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs]
Data attributes:
osm_id code fclass name
Length:213 Min. :6101 Length:213 Length:213
Class :character 1st Qu.:6101 Class :character Class :character
Mode :character Median :6101 Mode :character Mode :character
Mean :6101
3rd Qu.:6101
Max. :6106
Wczytana warstwa zawiera 213 obiektów liniowych prezentujących odcinki linii kolejowych znajdujących się w jednym z powiatów.
Do podstawowych analiz przestrzennych na danych wektorowych służy biblioteka rgeos, którą musimy zainstalować i zainicjować:
install.packages(„rgeos”)
library(rgeos)
Do buforowania warstw wektorowych służy funkcja gBuffer z zainstalowanej wcześniej biblioteki. Wygenerujmy za jej pomocą bufor wokół linii kolejowych o wielkości 1 km:
bufor = gBuffer(kolej, width = 1000)
Wyświetlmy wygenerowany bufor oraz linie kolejowe:
plot(bufor, col = „red”)
plot(kolej, add = TRUE)
Sprawdźmy ile elementów ma bufor:
length(bufor)
[1] 1
Bufor ma jeden element, to znaczy że bufory dla poszczególnych odcinków linii kolejowej zostały ze sobą połączone. W przypadku, gdy chcemy z użyciem tej funkcji otrzymać bufory dla każdego elementu zbioru musimy dodać do funkcji argument byid równy TRUE:
bufor = gBuffer(kolej, width = 1000, byid = TRUE)
Wyświetmy wynik działania funkcji:
plot(bufor, col = "red")
plot(kolej, add = TRUE)
Sprawdźmy ile teraz elementów ma bufor:
length(kolej)
[1] 213
Dla każdego elementu został wygenerowany oddzielny bufor. W funkcji gBuffer możemy również zdefiniować różną wartość bufora dla każdego z elementów. Wygenerujmy wektor w zawierający szerokość bufora 500 m:
w = rep(500,length(kolej))
Zmieńmy jedną z wartości wektora na 2000 m:
w[86] = 2000
Teraz w funkcji gBuffer do atrybutu width wstawmy utworzony przez nas wektor w:
bufor = gBuffer(kolej, width = w, byid = TRUE)
Wyświetlamy wynik:
plot(bufor, col = "red")
plot(kolej, add = TRUE)
Na mapie widać, że jedna z linii kolejowych ma dużo większy obszar bufora niż pozostałe. Tak to zdefiniowaliśmy w naszym wektorze w.
Podsumowując do buforowania w R służy funkcja gBuffer. Tworzone bufory możemy dowolnie modyfikować w zależności od naszych potrzeb poprzez zdefiniowanie odpowiednich atrybutów funkcji. W R można znaleźć wiele funkcji podobnych do przedstawionej znajdujących się w innych bibliotekach, ale tę kwestię pozostawiamy R-owym szperaczom:)