## ----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(dplyr) library(ncdfgeom) ## ----data_shape_2------------------------------------------------------------- prcp_data <- readRDS(system.file("extdata/climdiv-pcpndv.rds", package = "ncdfgeom")) print(prcp_data, max_extra_cols = 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")