# załadowanie bibliotek programistycznych
# w pierwszej kolejności najprawdopodobniej trzeba będzie je zainstalować
library("sp") # biblioteka do wizualizacji danych przestrzennych
library("raster") # biblioteka do obsługi plików rastrowych
library("rgdal") # obsługa rozszerzeń gdal
## rgdal: version: 1.1-3, (SVN revision 594)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 1.11.2, released 2015/02/10
## Path to GDAL shared files: /usr/share/gdal/1.11
## Loaded PROJ.4 runtime: Rel. 4.9.1, 04 March 2015, [PJ_VERSION: 491]
## Path to PROJ.4 shared files: (autodetected)
## Linking to sp version: 1.2-1
library("rgeos") # obsługa bibliotek geoprzestrzennych
## rgeos version: 0.3-12, (SVN revision 498)
## GEOS runtime version: 3.5.0-CAPI-1.9.0 r4084
## Linking to sp version: 1.2-0
## Polygon checking: TRUE
library("RColorBrewer") # automatyczne generowanie skal kolorystycznych
kolory = colorRampPalette(brewer.pal(7,"OrRd")[-1])(50)
sp.theme(set = TRUE, regions = list(col = kolory))
# Zastosujemy w obliczeniach prosty model dyspersji zanieczyszczen
# Calkowita koncentracja zanieczyszczeń w dystansie 'd' i dla kąta θ z punktowego źródła zanieczyszczeń
# dana jest poniższym wzorem:
#f=α*exp(−(d/β)2e−^(κ*cos(θ−ϕ)^2))
# gdzie:
# a - poziom zanieczyszczeń w punkcie emisji
# β - współczynnik odległości
# ϕ - dominujący kierunek smugi zanieczyszczeń
# κ - ekscentryczność (mimośródowość)
# zapiszmy teraz powyższy wzór w postaci funkcji programistycznej:
pfunc <- function(d2, ang, a, b, k, phi)
{ a * exp(-(d2*exp(-k*cos(ang-phi))^2/b^2)) }
# a następnie zastosujmy ją do obliczeń w regularnej siatce punktów
plume <- function(src,dst,a,b,k,phi)
{ src = coordinates(src)
dst = coordinates(dst)
d2 = (dst[,1]-src[,1])^2 + (dst[,2]-src[,2])^2
ang = atan2(dst[,2]-src[,2],dst[,1]-src[,1])
pfunc(d2,ang,a,b,k,phi) }
# modyfikacja ukladu wspolrzednych do postaci kompatybilnej z naszymi wzorami fizycznymi (zapisanymi w układzie SI)
toOSGB <- function(s){spTransform(s,CRS("+init=epsg:27700"))}
cumbria <- toOSGB(readOGR(dsn="cumbria.shp",layer="cumbria",verbose=FALSE)) # warstwa GIS: granice administracyjne
elektrownia <- toOSGB(readOGR(dsn="nuclear.shp",layer="nuclear",verbose=FALSE)) # warstwa GIS: elektrownia
miasta <- readOGR(dsn="ukgaz.shp",layer="ukgaz",verbose=FALSE) # warstwa GIS: miasta
# wyrysujmy zatem wczytane pliki:
plot(cumbria)
plot(elektrownia,add=TRUE,pch=19,cex=3.5,col="red") #Definiuje kolor oraz ksztalt punkt emitującego zanieczyszczenia.
plot(miasta,add=TRUE)

# tworzymy pusty raster o zasięgu odpowiadającym zasięgowi naszego poligonu
plevel <- raster(extent(cumbria),nrows=500,ncols=500)
# wykonajmy obliczenia w utworzonej siatce punktów:
plevel[] <- plume(src=elektrownia, dst=SpatialPoints(plevel), a=9000, b=400, k=5, phi=70*pi/180)
projection(plevel) <- proj4string(cumbria) # nadanie układu współrzędnych
plot(plevel,col=kolory) # wyrysowanie wyniku
plot(cumbria,add=TRUE, lty=4, lwd=2) # dodanie granic administracyjnych
plot(elektrownia,add=TRUE,pch=19,cex=3.5,col="blue")
plot(miasta,add=TRUE)
title("Rozprzestrzenianie chmury radioaktywnej")

#Wykaz miast zagrozonych zanieczyszczeniami powyzej zdefiniowanie wielkosci (tu: 6000).
# 1: ekstrakcja warstwy rastrowej do punktow:
miasta$exposure <- extract(plevel, miasta)
# 2: wybranie tylko wartosci wiekszych od wartosci progowej:
over6000 <- miasta$exposure>6000
# 3: utworzenie ramki danych
zagrozone_miasta <- data.frame(miasta@data[over6000,c("Name","pop","exposure")])
zagrozone_miasta
## Name pop exposure
## 3 Cockermouth 7551 7154.426
## 10 Dearham 1391 6125.387
## 13 Great Clifton 1101 6631.521
## 14 Dean 1077 7721.381
## 15 Brigham 1065 7129.519
## 18 Broughton Moor 726 6235.179
## 20 Bridekirk 636 6793.254
## 33 Bassenthwaite 412 6176.067
## 35 Papcastle 406 7078.424
## 36 Little Clifton 391 7087.436
## 37 Plumbland 367 6035.050
## 40 Gilcrux 303 6161.290
## 41 Embleton 297 7024.913
## 42 Blindcrake 287 6563.121
## 43 Lorton 250 7301.323
## 46 Loweswater 209 7701.603
## 47 Winscales 186 6876.589
## 48 Camerton 172 6322.226
## 50 Buttermere 127 6316.868
## 51 Setmurthy 108 6427.336
## 52 Wythop 51 6890.644
## 87 Egremont 6496 7923.451
## 89 Cleator Moor 6347 8186.493
## 90 Arlecdon 3678 8201.449
## 91 Frizington 2415 8306.656
## 92 Distington 2283 6526.419
## 93 St John Beckermet 1925 8619.762
## 96 Moresby 1280 6027.835
## 100 Lamplugh 763 8190.845
## 104 St Bridget Beckermet 385 8619.762
## 109 Ennerdale Bridge 240 8591.672
## 110 Haile 237 8901.306
## 112 Ponsonby 92 8825.822
# zadania do wykonania:
# Zadanie 1:
# Jaki kształt ma smuga zanieczyszczeń jeśli κ = 0 , a jaki przy wartościach dodatnich>
# Który z parametrów (w uproszczeniu) spośród parametrów κ oraz ϕ możemy traktować jako siłę i kierunek wiatru?
# Zadanie 2:
# Korzystając z pomocy do funkcji 'colorRampPalette' zmień stosowany schemat barwny
# Zadanie 3:
# Jakie wartości parametru tego parametru odpowiadają kątowi:
# 0, 45, 90, 180, 270 stopni? (należy traktować analogicznie jak kierunek wiatru)
# Zadanie 4:
# Wymień 3 miasta o populacji powyżej 300 mieszkańców, o największym zagrożeniu chmurą radioaktywną jeśli kierunek napływu mas
# powietrza zmieni się na zachodni