GISProjekt R

Statystyki strefowe (Zonal statistics) w R

Statystyki strefowe to pomocne narzędzie pozwalające na wyznaczenie dowolnej statystyki z pikseli rastra pokrywających się np. z poligonem z warstwy wektorowej. Najczęściej w oprogramowaniu GIS mamy domyślnie do wyboru kilkanaście statystyk np. maksymalna, średnia, minimalna wartość itp. A co w przypadku gdy chcemy obliczyć statystykę wymyśloną przez nas. W oprogramowaniu GIS nie jest to niemożliwe, ale wymaga sporo pracy, np. z wykorzystaniem Modelera. Na szczęście mamy R-a, gdzie można to zrobić w jednej funkcji:) Zacznijmy jednak od prostych rzeczy. Inicjujemy bibliotekę raster w której znajduje się funkcja extract, służąca do ekstrakcji wartości pikseli rastra leżących w danym wektorze:

install.packages(‘raster’)
library(raster)

Inicjujemy bibliotekę rgdal, którą wykorzystamy do wczytania danych wektorowych:

library(rgdal)

Wczytujemy plik rastrowy oraz plik z warstwą wektorową np. z darmowych warstw udostępnianych przez CODGiK (w moim przypadku NMT i warstwa powiatów województwa mazowieckiego):

r = raster(“C:/grid_mazowieckie.tif”)

g = readOGR(“C:/”,”powiaty_maz”)

Wczytane warstwy wyglądają następująco:

 

Używając funkcji extract z biblioteki raster możemy wyciągnąć wartości pikseli NMT znajdujących się wewnątrz np. dwóch pierwszych powiatów:

h = extract(r,powiaty[1:2,])

Utworzona zmienna h jest listą, zawierającą w poszczególnych elementach wartości wysokości dla konkretnego powiatu. Wartości te wywołujemy używając:

h[[1]]

[1] 98.47 98.97 99.38 99.85 99.68 99.31

W przypadku, gdy dla konkretnego powiatu chcemy policzyć np. średnią wartość wysokości musimy dodać do funkcji extract atrybut fun = mean:

h_mean = extract(r,powiaty[1:2,],fun=mean)

Wywołując w konsoli zmienną h_mean widzimy, że jest to już macierz wartości:

h_mean
         [,1]
[1,] 119.7398
[2,] 119.0318

Jako atrybut fun do funkcji extract możemy wstawić dowolną funkcję utworzoną przez nas. Pamiętamy, że dla każdego z powiatów otrzymujemy wektor wartości i będziemy go musieli przetwarzać. Zdefiniujmy funkcję tworzącą statystykę, która będzie nam zwracała procent pikseli o wartościach większych od średniej wysokości w powiecie. Najpierw utworzymy funkcję nasza_funkcja zawierającą tylko jedną zmienną lokalną x będąco naszym zbiorem wartości pikseli oraz argument logiczny na.rm odpowiedzialny za usuwanie wartości NA:

nasza_funkcja function(x,na.rm=TRUE)

{

Dodajmy do funkcji zmienną zawierającą wartość średnią

avg = mean(x)

Policzmy ile jest wszystkich pikseli:

all = length(x)

i policzmy ile jest tych większych od avg:

more_than_avg = sum(x › avg)

policzmy procent:

prc = (more_than_avg/all)*100

Funkcja będzie zwracała procent:

return(prc)

Zamykamy definicję funkcji:

}

Nasza funkcja ostatecznie powinna wyglądać następująco:

nasza_funkcja function(x,na.rm=TRUE)

{

avg = mean(x)

all = length(x)

more_than_avg = sum(x›avg)

prc = (more_than_avg/all)*100

return(prc)

}

W celu wyznaczenia wartości procentów wstawiamy ją do funkcji extract do atrybutu fun:

pix_prc = extract(r,powiaty[1:2,],fun=nasza_funkcja)

W wyniku otrzymujemy macierz zawierającą procenty ze zdefiniowanej przez nas funkcji:

prc_pixeli

         [,1]
[1,] 46.52973
[2,] 38.13020

Funkcję extract możemy modyfikować w zależności jakie dane chcemy uzyskać. Polecam zajrzeć do dokumentacji technicznej tej funkcji, lub do pomocy:

help(“extract”)