#################################
# Spatiaalinen monikriteerimalli#
# © Arto Viinikka, SYKE
#################################

# Mallin tarkoituksena on tuottaa viherrakenteen arvoja kuvaava kartta spatiaalisen monikriteerimenetelmän
# avulla. Mallin toimimiselle on seuraavat oletukset

# Aineistot on muutettu rasterimuotoon ja ne kattavat täsmälleen saman tutkimusalueen
# Rasterin pikselien arvot ovat muotoa [0,1] tai jatkuvia välillä [0-1] ja niillä on sama solukoko
# Rasterit sijaitsevat kaikki samassa kansiossa
# Rastereita vastaavat pisteet on koottu erilliseen taulukkoon (.csv), ja aineistojen nimet vastaavat 
# täsmälleen kansiossa olevien rasterien nimiä


# tyhjennä Environment ja muisti. Kannattaa ajaa, jos tuntuu, että R on jumissa.
# Tämän jälkeen joutuu aloittamaan ajot alusta
rm(list = ls())
lapply(paste('package:',names(sessionInfo()$otherPkgs),sep=""),detach,character.only=TRUE,unload=TRUE)
.rs.restartR()

# Ladataan tarvittavat paketit
# Tarvitsee tehdä vain kerran
install.packages("raster")
install.packages("rgdal")
install.packages("sp")
install.packages("spdep")
install.packages("raster")
install.packages("foreach")

# otetaan paketit käyttöön 
require(raster)
require(rgdal) 
require(sp)
require(spdep)
require(foreach)

# luetaan rasterit kansiosta
raster_files <- list.files("D:/HYMY/gis/demo/input/", pattern=".tif$") # vaihda tiedostopolku kansioon, missä aineistot sijaitsevat
list_raster <- lapply(raster_files, function(fl){
  raster(paste0("D:/HYMY/gis/demo/input/", fl)) # vaihda tiedostopolku kansioon, missä aineistot ovat
})

# nimetään rasterit samoin kuin kansiossa
names(list_raster) <- (raster_files) 

# plotataan haluttu rasteri testiksi
plot(list_raster[[1]]) # [[1]] vastaa kansion ensimmäistä rasteria

# luetaan pistetaulukko
# pistetaulukon tulee sisältää kolumnit [AineistoNimi], [Pisteet]
# lisäksi taulukossa on hyvä olla lyhyt aineistoKuvaus, mutta tämä ei ole välttämätöntä mallin kannalta
pisteet<-read.table("D:/HYMY/gis/demo/pisteytysDEMO.csv", header = TRUE, sep =";", dec=".") # vaihda tiedostopolku kansioon
# missä pistetaulukko sijaitsee


# pisteytetään aineistoa vastaavat rasterit
foreach (i = 1:length(list_raster)) %do%{
  r1=list_raster[[i]] # valitsee listalta pisteytettävän rasterin
  id=names(list_raster)[[i]] # muodostaa uuden [id] muuttujan rasterin nimestä
  p1<-pisteet[pisteet$AineistoNimi == id,] # valitsee rasteria vastaavan pistemäärä taulukosta

  # pisteyttää rasterin
  r2<-r1*(p1[,2])
  
  # kirjoittaa ja nimeää pisteytetyn rasterin ulos
  writeRaster(r2, file.path("D:/HYMY/gis/demo/input/pisteytetyt/",names(list_raster)[[i]]), bylayer = F, suffix='names',
              format="GTiff", overwrite = T) 
  }


# rasterien summaaminen
# luetaan pisteytetyt rasteripinnat kansiosta
raster_files_uusi <- list.files("D:/HYMY/gis/demo/input/pisteytetyt/", pattern=".tif$") # vaihda tiedostopolku kansioon, missä aineistot sijaitsevat
list_raster_uusi <- lapply(raster_files_uusi, function(fl){
  raster(paste0("D:/HYMY/gis/demo/input/pisteytetyt/", fl)) # vaihda tiedostopolku kansioon, missä aineistot sijaitsevat
})


# summataan rasterit
rasteri_summattu<-do.call("sum",list_raster_uusi)


# normalisoidaan rasteri välille [0,1] jakamalla pikselin maksimiarvolla
tulosrasteri<-rasteri_summattu/maxValue(rasteri_summattu)

# plottaan lopullinen rasteripinta
plot(rasteri_summattu)
plot(tulosrasteri)

# kirjoitetaan lopulliset tulosaineistot

# summattu rasteri
writeRaster(rasteri_summattu,  "D:/HYMY/gis/demo/output/summarasteri.tif", bylayer = F, suffix='names',
            format="GTiff", overwrite = T) # vaihda tiedostopolku kansioon, mihin aineistot kirjoitetaan

# summattu ja normalisoitu rasteri
writeRaster(tulosrasteri,  "D:/HYMY/gis/demo/output/summarasteri_n.tif", bylayer = F, suffix='names',
            format="GTiff", overwrite = T) # vaihda tiedostopolku kansioon, mihin aineistot kirjoitetaan

