GISProjekt R

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