library(sp)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(raster)
## 
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
## 
##     select
p95 <- read.asciigrid("~/Pobrane/p95.asc", as.image=FALSE, plot.image=TRUE)
obs <- read.asciigrid("~/Pobrane/obs.asc", as.image=FALSE, plot.image=TRUE)
# wczytanie szejpa z granicami administracyjnymi
# akurat w zasiegu mialem tylko taki dziwny z mapa Europy i "z dziura" dla PL
pl <- maptools::readShapeSpatial("/home/bartosz/R/skryptydoR/gis/dziurapl.shp") ;
## Warning: use rgdal::readOGR or sf::st_read

## Warning: use rgdal::readOGR or sf::st_read
wynik <- raster(p95) - raster(obs)
wynik[wynik<0] <- 0 # pozbywamy sie anomalii <0 i zastepujemy "0"
calosc <- mask(wynik, pl,inverse=T) # maskujemy wyniki tylko do granic administracyjnych PL
# ten proces moze chwile zajec bez zrownoleglania...
plot(calosc, main="anomalie", col=terrain.colors(255)) # 

#####################################
#####################################
### jesli brac pod uwage rzeczywista powierzchnie gridow:
# 1. oblicz rozmiar wszystkich gridow z rastra [km2]
cell_size<-area(calosc, na.rm=TRUE, weights=FALSE)
## Warning in couldBeLonLat(out): CRS is NA. Assuming it is longitude/latitude
plot(cell_size, main="Powierzchnia grida w km^2")

raster_area <- sum(cell_size[], na.rm=T)
print(paste("obszar PL z rastra:",round(raster_area, digits=1),"km^2"))
## [1] "obszar PL z rastra: 310189.5 km^2"
dane <- na.omit(data.frame(pow=cell_size[],anom=calosc[]))

# obliczenie anomalii 0-1
policz_anomalie <- function(klasa1=0, klasa2=10, interwal=0.5, dane=dane){
  
  brejki <- c(-Inf,seq(from=klasa1,to=klasa2, by=interwal),Inf)
  tmp <- NULL
    for (i in 1:(length(brejki)-1)){
    suma_powierzchni <- dplyr::filter(dane, anom>brejki[i], anom<=brejki[i+1]) %>% pull(pow) %>% sum()
    udzial_powierzchni <- suma_powierzchni/raster_area
    wynik <- data.frame(suma_powierzchni=suma_powierzchni, 
                        udzial_powierzchni=udzial_powierzchni, klasa1=brejki[i], klasa2=brejki[i+1])
    tmp <- rbind.data.frame(tmp, wynik)
  }
  return(tmp)
}

policz_anomalie(klasa1=0,klasa2=1, interwal = 0.5, dane = dane)
##   suma_powierzchni udzial_powierzchni klasa1 klasa2
## 1        18049.692         0.05818924   -Inf    0.0
## 2         9439.851         0.03043253    0.0    0.5
## 3         9490.850         0.03059694    0.5    1.0
## 4       273209.128         0.88078129    1.0    Inf
# albo zmieniajac nieco ustawienia funkcji:
policz_anomalie(klasa1=0,klasa2=10, interwal=1,dane = dane)
##    suma_powierzchni udzial_powierzchni klasa1 klasa2
## 1          18049.69         0.05818924   -Inf      0
## 2          18930.70         0.06102947      0      1
## 3          28794.93         0.09283013      1      2
## 4          35725.69         0.11517376      2      3
## 5          55304.99         0.17829419      3      4
## 6          59818.09         0.19284368      4      5
## 7          75145.68         0.24225732      5      6
## 8          18419.74         0.05938221      6      7
## 9              0.00         0.00000000      7      8
## 10             0.00         0.00000000      8      9
## 11             0.00         0.00000000      9     10
## 12             0.00         0.00000000     10    Inf
calosc[] <- round(calosc[]) # mozemy takze zaokraglic wyniki dla ladniejszego efektu, ale to bardziej do plotowania
plot(calosc, col=c( "white", rev(heat.colors(n=7))))
plot(pl, add=T)