Aquifer thickness calculated from ~300,000 well logs

At the time of writing, the California DWR Online Well Completion Report Database contains ~1,000,000 digitized well logs. About 1/3 of those wells have information on the top and bottom of the perforated interval, which we can use to compute and visualize regional estimates of:

  • top of perforated interval - aquifer top
  • bottom of perforated interval - aquifer bottom
  • thickness of perforated interval - aquifer thickness

Read in pre-computed results

I realize that I’m skipping straight to the results. For how I arrived at these numbers, see the full code here.

library(tidyverse)
library(sp)
library(sf)
library(leaflet)
library(widgetframe)

# pre-computed results
gwb_full <- read_rds("~/Github/rp/static/data/gwb_full.rds")
labels  <- read_rds("~/Github/rp/static/data/labels.rds")

Thickness of perforated interval

bins <- c(0,50, 100,200,300,400,500,600)
pal <- colorBin("inferno", gwb_full$mean_pit, bins = bins)

# make another layer control group name
gwb_full$Basin_Subb_2 <- gwb_full$Basin_Subb

# rename groups for legend
temp <- gwb_full %>% 
  rename(median_perforated_interval_thickness = Basin_Subb,
         mean_perforated_interval_thickness = Basin_Subb_2)

# plot
leaflet(width = "100%") %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(data = temp, stroke = FALSE, smoothFactor = 0.2,
              color = ~pal(mean_pit), 
              label = lapply(labels[[1]], htmltools::HTML),
              fillOpacity = 0.8,
              group = "mean_perforated_interval_thickness") %>%
  addPolygons(data = temp, stroke = FALSE, smoothFactor = 0.2,
              color = ~pal(median_pit), 
              label = lapply(labels[[2]], htmltools::HTML),
              fillOpacity = 0.8,
              group = "median_perforated_interval_thickness") %>%
  addLegend(pal = pal, values = temp$mean_pit,
            title = ("thickness (ft.)")) %>%
  addLayersControl(overlayGroups =
                     c("median_perforated_interval_thickness",
                       "mean_perforated_interval_thickness")) %>%
  hideGroup("median_perforated_interval_thickness") %>% 
  frameWidget(height = "400")

Top of perforated interval: aquifer top (depth below sea level)

bins <- c(0,100,200,300,400,500,600,700, 800, 900, 1000)
pal <- colorBin("viridis", gwb_full$mean_top, bins = bins) 

# rename groups for legend
temp <- gwb_full %>% 
  rename(median_top_perforated_interval = Basin_Subb,
         mean_top_perforated_interval = Basin_Subb_2) 

# plot
leaflet(width = "100%") %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(data = temp, stroke = FALSE, smoothFactor = 0.2,
              color = ~pal(mean_top), 
              label = lapply(labels[[3]], htmltools::HTML),
              fillOpacity = 0.8,
              group = "mean_top_perforated_interval") %>%
  addPolygons(data = temp, stroke = FALSE, smoothFactor = 0.2,
              color = ~pal(median_top), 
              label = lapply(labels[[4]], htmltools::HTML),
              fillOpacity = 0.8,
              group = "median_top_perforated_interval") %>%
  addLegend(pal = pal, values = temp$mean_top,
            title = ("depth (ft.)")) %>%
  addLayersControl(overlayGroups =
                     c("median_top_perforated_interval",
                       "mean_top_perforated_interval")) %>%
  hideGroup("median_top_perforated_interval") %>% 
  frameWidget(height = "400")

Bottom of perforated interval: aquifer bottom (depth below sea level)

bins <- c(0,100,200,300,400,500,600,700, 800, 900, 1000, 1100)
pal <- colorBin("viridis", gwb_full$mean_bot, bins = bins) 

# rename groups for legend
temp <- gwb_full %>% 
  rename(median_bot_perforated_interval = Basin_Subb,
         mean_bot_perforated_interval = Basin_Subb_2)

# plot
leaflet(width = "100%") %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(data = temp, stroke = FALSE, smoothFactor = 0.2,
              color = ~pal(mean_bot), 
              label = lapply(labels[[5]], htmltools::HTML),
              fillOpacity = 0.8,
              group = "mean_bot_perforated_interval") %>%
  addPolygons(data = temp, stroke = FALSE, smoothFactor = 0.2,
              color = ~pal(median_bot), 
              label = lapply(labels[[6]], htmltools::HTML),
              fillOpacity = 0.8,
              group = "median_bot_perforated_interval") %>%
  addLegend(pal = pal, values = temp$mean_bot,
            title = ("depth (ft.)")) %>%
  addLayersControl(overlayGroups =
                     c("median_bot_perforated_interval",
                       "mean_bot_perforated_interval")) %>%
  hideGroup("median_bot_perforated_interval") %>% 
  frameWidget(height = "400")
Avatar
Rich Pauloo
PhD Candidate in Hydrogeology

My interests include hydrogeology, 3D groundwater flow and contaminant transport simulation, data science and web technologies, and building simple solutions to complex problems.