## ----setup_1, include = FALSE--------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width=6, 
  fig.height=4
)
options(scipen = 9999)

## ----libs, message=FALSE, warning=FALSE----------------------------------
library(sf)
library(tidyverse)
library(ncdfgeom)

## ----data_shape_2--------------------------------------------------------
prcp_data <- readRDS(system.file("extdata/climdiv-pcpndv.rds", package = "ncdfgeom"))
print(prcp_data, n_extra = 0)
plot(prcp_data$date, prcp_data$`0101`, col = "red", 
     xlab = "date", ylab = "monthly precip (inches)", main = "Sample Timeseries for 0101-'Northern Valley'")
lines(prcp_data$date, prcp_data$`0101`)

## ----data_shape----------------------------------------------------------
climdiv_poly <- read_sf(system.file("extdata/climdiv.gpkg", package = "ncdfgeom"))
print(climdiv_poly)
plot(st_geometry(climdiv_poly), main = "Climate Divisions with 0101-'Northern Valley' Highlighted")
plot(st_geometry(filter(climdiv_poly, CLIMDIV == "0101")), col = "red", add = TRUE)

## ----write_ts, warning = FALSE-------------------------------------------
climdiv_centroids <- climdiv_poly %>%
  st_transform(5070) %>% # Albers Equal Area
  st_set_agr("constant") %>%
  st_centroid() %>%
  st_transform(4269) %>% #NAD83 Lat/Lon
  st_coordinates() %>%
  as.data.frame()

nc_file <- "climdiv_prcp.nc"

prcp_dates <- prcp_data$date
prcp_data <- select(prcp_data, -date)
prcp_meta <- list(name = "climdiv_prcp_inches", 
                  long_name = "Estimated Monthly Precipitation (Inches)")

write_timeseries_dsg(nc_file = nc_file, 
                     instance_names = climdiv_poly$CLIMDIV, 
                     lats = climdiv_centroids$Y, 
                     lons = climdiv_centroids$X, 
                     times = prcp_dates, 
                     data = prcp_data, 
                     data_unit = rep("inches", (ncol(prcp_data) - 1)), 
                     data_prec = "float", 
                     data_metadata = prcp_meta, 
                     attributes = list(title = "Demonstation of ncdfgeom"), 
                     add_to_existing = FALSE)

climdiv_poly <- st_sf(st_cast(climdiv_poly, "MULTIPOLYGON"))

write_geometry(nc_file = "climdiv_prcp.nc", 
               geom_data = climdiv_poly,
               variables = "climdiv_prcp_inches")

## ----ncdump--------------------------------------------------------------
try({ncdump <- system(paste("ncdump -h", nc_file), intern = TRUE)
cat(ncdump, sep = "\n")}, silent = TRUE)

## ----read----------------------------------------------------------------
# First read the timeseries.
prcp_data <- read_timeseries_dsg("climdiv_prcp.nc")

# Now read the geometry.
climdiv_poly <- read_geometry("climdiv_prcp.nc")

## ----data_summary--------------------------------------------------------
names(prcp_data)
class(prcp_data$time)
names(prcp_data$varmeta$climdiv_prcp_inches)
prcp_data$data_unit
prcp_data$data_prec
str(names(prcp_data$data_frames$climdiv_prcp_inches))
prcp_data$global_attributes
names(climdiv_poly)

## ----p_colors_source, echo=FALSE-----------------------------------------
# Because we've gotta have pretty colors!
p_colors <- function (n, name = c("precip_colors")) {
# Thanks! https://quantdev.ssri.psu.edu/tutorials/generating-custom-color-palette-function-r
    p_rgb <- col2rgb(c("#FAFBF3", "#F0F8E3", "#D4E9CA", 
                       "#BBE0CE", "#B7DAD0", "#B0CCD7", 
                       "#A9B8D7", "#A297C2", "#8F6F9E", 
                       "#684A77", "#41234D"))
    precip_colors = rgb(p_rgb[1,],p_rgb[2,],p_rgb[3,],maxColorValue = 255)
    name = match.arg(name)
    orig = eval(parse(text = name))
    rgb = t(col2rgb(orig))
    temp = matrix(NA, ncol = 3, nrow = n)
    x = seq(0, 1, , length(orig))
    xg = seq(0, 1, , n)
    for (k in 1:3) {
        hold = spline(x, rgb[, k], n = n)$y
        hold[hold < 0] = 0
        hold[hold > 255] = 255
        temp[, k] = round(hold)
    }
    palette = rgb(temp[, 1], temp[, 2], temp[, 3], maxColorValue = 255)
    palette
}

## ----plot, fig.height=6, fig.width=8-------------------------------------
climdiv_poly <- climdiv_poly %>%
  st_transform(3857) %>% # web mercator
  st_simplify(dTolerance = 5000)

title <- paste0("\n Sum of: ", prcp_data$varmeta$climdiv_prcp_inches$long_name, "\n", 
                format(prcp_data$time[1], 
                         "%Y-%m", tz = "UTC"), " - ", 
                format(prcp_data$time[length(prcp_data$time)], 
                         "%Y-%m", tz = "UTC"))

prcp_sum <- apply(prcp_data$data_frames$climdiv_prcp_inches, 
                  2, sum, na.rm = TRUE)

prcp <- data.frame(CLIMDIV = names(prcp_sum), 
                   prcp = as.numeric(prcp_sum), 
                   stringsAsFactors = FALSE) %>%
  right_join(climdiv_poly, by = "CLIMDIV") %>% 
  st_as_sf()

plot(prcp["prcp"], lwd = 0.1, pal = p_colors, 
     breaks = seq(0, 14000, 1000),
     main = title,
     key.pos = 3, key.length = lcm(20))
  

## ----setup_dontrun, eval = FALSE-----------------------------------------
#  # Description here: ftp://ftp.ncdc.noaa.gov/pub/data/cirs/climdiv/divisional-readme.txt
#  prcp_url <- "ftp://ftp.ncdc.noaa.gov/pub/data/cirs/climdiv/climdiv-pcpndv-v1.0.0-20190408"
#  
#  prcp_file <- "prcp.txt"
#  
#  download.file(url = prcp_url, destfile = prcp_file, quiet = TRUE)
#  
#  division_url <- "ftp://ftp.ncdc.noaa.gov/pub/data/cirs/climdiv/CONUS_CLIMATE_DIVISIONS.shp.zip"
#  division_file <- "CONUS_CLIMATE_DIVISIONS.shp.zip"
#  
#  download.file(url = division_url, destfile = division_file, quiet = TRUE)
#  unzip("CONUS_CLIMATE_DIVISIONS.shp.zip")
#  
#  climdiv_poly <- read_sf("GIS.OFFICIAL_CLIM_DIVISIONS.shp") %>%
#    select("CLIMDIV", CLIMDIV_NAME = "NAME") %>%
#    mutate(CLIMDIV = ifelse(nchar(as.character(CLIMDIV)) == 3,
#                            paste0("0",as.character(CLIMDIV)),
#                            as.character(CLIMDIV))) %>%
#    st_simplify(dTolerance = 0.0125)
#  
#  month_strings <- c("jan", "feb", "mar", "apr", "may", "jun",
#                     "jul", "aug", "sep", "oct", "nov", "dec")
#  
#  prcp_data <- read.table(prcp_file, header = FALSE,
#                          colClasses = c("character",
#                                         rep("numeric", 12)),
#                          col.names = c("meta", month_strings))
#  
#  # Here we gather the data into a long format and prep it for ncdfgeom.
#  prcp_data <- prcp_data %>%
#    gather(key = "month", value = "precip_inches", -meta) %>%
#    mutate(climdiv = paste0(substr(meta, 1, 2), substr(meta, 3, 4)),
#           year = substr(meta, 7, 10),
#           precip_inches = ifelse(precip_inches < 0, NA, precip_inches)) %>%
#    mutate(date = as.Date(paste0("01", "-", month, "-", year),
#                          format = "%d-%b-%Y")) %>%
#    select(-meta, -month, -year) %>%
#    filter(climdiv %in% climdiv_poly$CLIMDIV) %>%
#    spread(key = "climdiv", value = "precip_inches") %>%
#    filter(!is.na(`0101`))
#    as_tibble()
#  
#  # Now make sure things are in the same order.
#  climdiv_names <- names(prcp_data)[2:length(names(prcp_data))]
#  climdiv_row_order <- match(climdiv_names, climdiv_poly$CLIMDIV)
#  climdiv_poly <- climdiv_poly[climdiv_row_order, ]
#  
#  sf::write_sf(climdiv_poly, "climdiv.gpkg")
#  saveRDS(prcp_data, "climdiv-pcpndv.rds")
#  
#  unlink("GIS*")
#  unlink("CONUS_CLIMATE_DIVISIONS.shp.zip")
#  unlink("prcp.txt")

## ----p_colors, eval=FALSE------------------------------------------------
#  p_colors <- function (n, name = c("precip_colors")) {
#  # Thanks! https://quantdev.ssri.psu.edu/tutorials/generating-custom-color-palette-function-r
#      p_rgb <- col2rgb(c("#FAFBF3", "#F0F8E3", "#D4E9CA",
#                         "#BBE0CE", "#B7DAD0", "#B0CCD7",
#                         "#A9B8D7", "#A297C2", "#8F6F9E",
#                         "#684A77", "#41234D"))
#      precip_colors = rgb(p_rgb[1,],p_rgb[2,],p_rgb[3,],maxColorValue = 255)
#      name = match.arg(name)
#      orig = eval(parse(text = name))
#      rgb = t(col2rgb(orig))
#      temp = matrix(NA, ncol = 3, nrow = n)
#      x = seq(0, 1, , length(orig))
#      xg = seq(0, 1, , n)
#      for (k in 1:3) {
#          hold = spline(x, rgb[, k], n = n)$y
#          hold[hold < 0] = 0
#          hold[hold > 255] = 255
#          temp[, k] = round(hold)
#      }
#      palette = rgb(temp[, 1], temp[, 2], temp[, 3], maxColorValue = 255)
#      palette
#  }

## ----cleanup, echo=FALSE-------------------------------------------------
unlink("climdiv_prcp.nc")

