library(exactextractr) library(raster) library(sf) library(tools) library(ncdf4) library(RNetCDF) library(dplyr) library(tidyr) ############################################################## # # PARAMETRI # ############################################################## prismaDirectory <- "prisma" cosmo2iDirectory <- "cosmo2i" cosmo5mDirectory <- "cosmo5m" baciniDirectory <- "bacini" rainDirectory <- "rain" fileBacini <- "bacini.shp" fileRain <- "rain.dfs0.txt" varRainPrisma <- "PIOGGIA_CUM_1H" varRainCosmo <- "TP_HOUR" projutm <- "+proj=utm +zone=32 +datum=WGS84" ############################################################## # # FUNZIONI # ############################################################## readVarNetCDF <- function(ncdName,varName) { ncin <- nc_open(ncdName) r <- ncvar_get(ncin, varName) nc_close(ncin) return(r) } #if (Sys.info()['sysname']=="Linux") { args <- commandArgs(trailingOnly = TRUE) dateStart <- as.character(args[1]) dateEnd <- as.character(args[2]) dataDirectory <- as.character(args[3]) # } else if (Sys.info()['sysname']=="Windows") { # # dateStart <- "2023-08-11 03:00:00" # dateEnd <- "2023-10-11 12:00:00" # dataDirectory <- "inputMike" # # } # Leggo il file dei bacini print(paste0(Sys.time()," - Leggo il file dei bacini: ",fileBacini)) filename <- file.path(dataDirectory,baciniDirectory,fileBacini) baciniSHP <- read_sf(filename) # Leggo i file prisma prismaFiles <- list.files(path = file.path(dataDirectory,prismaDirectory), pattern = ".nc", full.names = TRUE) totalExtractPrisma <- data.frame() for (file in prismaFiles) { if (file_ext(file) == "nc") { print(paste0(Sys.time()," - Estraggo i dati dal prisma:", basename(file))) fileDates <- readVarNetCDF(file, "strTime") fileBrick <- brick(file, var = varRainPrisma) extractRain <- exact_extract(fileBrick, baciniSHP, 'mean', progress = FALSE) names(extractRain) <- NULL extractRain <- data.frame(cbind(fileDates,t(extractRain))) if (nrow(totalExtractPrisma)==0) { totalExtractPrisma <- extractRain } else { totalExtractPrisma <- rbind(totalExtractPrisma,extractRain) } } } # converto i NaN totalExtractPrisma[totalExtractPrisma=="NaN"] <- "-1E-35" # filtro solo le date necessarie totalExtractPrisma$fileDates <- as.POSIXct(totalExtractPrisma$fileDates, tz="UTC") totalExtractPrisma <- totalExtractPrisma[order(totalExtractPrisma$fileDates),] dateStart <- as.POSIXct(dateStart, tz="UTC") dateEnd <- as.POSIXct(dateEnd, tz="UTC") totalExtractPrisma <- totalExtractPrisma[totalExtractPrisma$fileDates >= dateStart & totalExtractPrisma$fileDates <= dateEnd, ] # Leggo i file dal cosmo cosmoFiles <- list.files(path = file.path(dataDirectory,cosmo5mDirectory), pattern = ".nc", full.names = TRUE) if (length(cosmoFiles) == 0) { cosmoFiles <- list.files(path = file.path(dataDirectory,cosmo2iDirectory), pattern = ".nc", full.names = TRUE) } totalExtractCosmo <- data.frame() for (file in cosmoFiles) { if (file_ext(file) == "nc") { print(paste0(Sys.time()," - Estraggo i dati dal cosmo:", basename(file))) fileDates <- readVarNetCDF(file, "time") fileBrick <- brick(file, var = varRainCosmo) fileBrick <- projectRaster(fileBrick, crs = projutm) extractRain <- exact_extract(fileBrick, baciniSHP, 'mean', progress = FALSE) names(extractRain) <- NULL extractRain <- data.frame(cbind(fileDates,t(extractRain))) } if (nrow(totalExtractCosmo)==0) { totalExtractCosmo <- extractRain } else { totalExtractCosmo <- rbind(totalExtractCosmo,extractRain) } } # converto i NaN totalExtractCosmo[totalExtractCosmo=="NaN"] <- "-1E-35" totalExtractCosmo$fileDates <- as.POSIXct(totalExtractCosmo$fileDates*3600, tz="UTC", origin='1900-01-01 00:00') totalExtractCosmo <- totalExtractCosmo[order(totalExtractCosmo$fileDates),] # unisco i dataframe finaldf <- rbind(totalExtractPrisma,totalExtractCosmo) # rimuovo eventuali duplicati e tengo l'ultimo valore finaldf <- finaldf %>% group_by(fileDates) %>% slice(n()) # esporto il file finale finaldf$fileDates <- strftime(finaldf$fileDates, format = "%d/%m/%Y %H:%M:%S", tz = "UTC") print(paste0(Sys.time()," - Esporto il file finale: ",fileRain)) filename <- file.path(dataDirectory,rainDirectory,fileRain) write.table(finaldf, filename, sep = ";", dec = ".", row.names = FALSE, col.names = FALSE, quote = FALSE)