Identifying Areas of Potential Aquaculture in the Western US
Author: William Mullins ・ Date: December 7, 2025
GitHub RepositoryIntroduction
In this analysis, we identified areas along the west coast of the United States which contained suitable depth and sea surface temperature (SST) for aquaculture, specifically on two species: oysters and blue mussels.
Datasets Used
Five-year average of sea surface temperature data from 2008-2012, providing a comprehensive baseline for temperature analysis along the western US coast.
High-resolution ocean depth measurements used to identify suitable depths for shellfish cultivation.
Spatial boundaries defining the Exclusive Economic Zones (EEZs) for California, Oregon, and Washington, used to calculate suitable habitat area by region.
Loading Required Packages
First, we load the necessary R packages for spatial analysis, data manipulation, and visualization. The script checks if each required package is installed before loading them.
library(tidyverse)
library(terra)
library(here)
library(knitr)
library(kableExtra)Sea Surface Temperature Analysis
Sea surface temperature is a critical factor for shellfish survival and growth.
Reading and Processing SST Data
The SST data is read from multiple GeoTIFF files and combined into a single raster stack. The depth data is then reprojected to match the CRS of the SST data.
# Read in sea surface temperature data
sst <- rast(c(
here("data", "average_annual_sst_2008.tif"),
here("data", "average_annual_sst_2009.tif"),
here("data", "average_annual_sst_2010.tif"),
here("data", "average_annual_sst_2011.tif"),
here("data", "average_annual_sst_2012.tif")
))
# Read in depth file
depth <- rast(here("data", "depth.tif")) %>% project(crs(sst))Calculating Mean SST and Converting Units
We calculate the mean SST across all years and convert the temperature from Kelvin to Celsius for easier interpretation. The resulting raster shows the average annual sea surface temperature along the western US coast.
eez_raster <- vect(here::here("data", "wc_regions_clean.shp"))
mean_sst <- app(sst, fun = mean, na.rm = TRUE)
# Convert From Kelvin to Celsius
mean_sst <- mean_sst - 273.15
plot(mean_sst)
Depth Data Preparation
Processing Depth Raster
The depth raster is resampled to match the resolution and extent of the SST data using nearest neighbor interpolation. This ensures that both datasets align perfectly for subsequent analysis.
# Resample depth using nearest neighbor approach
depth <- resample(depth, mean_sst, method = "near")
# Crop raster to match SST
depth_cropped <- crop(depth, mean_sst)
# Check that the depth and SST match in resolution, extent, and coordinate reference system
compareGeom(depth_cropped, mean_sst, res = TRUE, ext = TRUE, crs = TRUE)Habitat Suitability Analysis
To identify areas suitable for aquaculture, we defined temperature and depth ranges for each species based on their biological requirements. The analysis creates binary masks where 1 represents suitable habitat and 0 represents unsuitable areas.
Suitability Function
This function creates masks for both temperature and depth conditions, then combines them to identify areas where both criteria are met. It also generates a visualization showing suitable versus unsuitable areas.
habitable_areas <- function(temp_min, temp_max, depth_min, depth_max, species_name) {
# Create mask of SST and depth values in range
sst_suitable <- mean_sst >= temp_min & mean_sst <= temp_max
depth_suitable <- depth_cropped >= depth_min & depth_cropped <= depth_max
# Create mask where both conditions are met
suitable_habitat <- sst_suitable * depth_suitable
# Plot of suitable habitats
habitat_plot <- plot(suitable_habitat,
col = c("gray90", "maroon"),
type = "classes",
levels = c("Unsuitable", "Suitable"),
main = paste("Potential", species_name, "Habitat\n(SST:", temp_min, "-", temp_max, "C, Depth:", depth_min, "-", depth_max, "m)"),
xlab = "Longitude",
ylab = "Latitude",
axes = TRUE,
plg = list(x = "topright", title = "Classification") # Legend position
)
# Return the plot
return(habitat_plot)
}Potential Oyster Habitat
Oysters prefer slighly warm waters (11-30°C) and are able to be cultivated in shallow depths (0-70 meters).
# View Areas Habitable by Oysters
oysters <- habitable_areas(11, 30, 0, 70, "Oyster")
Potential Blue Mussel Habitat
Blue mussels prefer slightly cooler waters (5-20°C) and shallower depths (0-60 meters) compared to oysters.
# View Areas Habitable by Blue Mussels
mussels <- habitable_areas(5, 20, 0, 60, "Blue Mussel")
Regional Analysis of Suitable Habitat
To understand the regional distribution of suitable areas across different, we calculated the total area of suitable areas within each Exclusive Economic Zone (EEZ) on the west coast.
Calculating Suitable Area by Region
This function builds upon habitat suitability function by calculating the total area (in square kilometers) of suitable habitat within each region. In the table below.
# Returns a data frame of the area suitable for a species by region
habitable_areas_table <- function(temp_min, temp_max, depth_min, depth_max, species_name) {
sst_suitable <- mean_sst >= temp_min & mean_sst <= temp_max
depth_suitable <- depth_cropped >= depth_min & depth_cropped <= depth_max
suitable_habitat <- sst_suitable * depth_suitable
eez_raster <- rasterize(eez_raster, suitable_habitat, field = "rgn")
# Get the cell size of cells in dataframe
cell_area <- cellSize(suitable_habitat, unit = "km")
# Get area of suitable cells in dataframe
area_suitable <- cell_area * suitable_habitat
# Get the total amount of area that is suitable in each EEZ
total_area_by_eez <- zonal(area_suitable, eez_raster, fun = "sum", na.rm = TRUE)
return(total_area_by_eez)
}
oyster_data <- habitable_areas_table(11, 30, 0, 70, "Oyster") %>% rename("Oysters" = area)
mussel_data <- habitable_areas_table(5, 20, 0, 60, "Blue Mussel") %>% rename("Blue Mussel" = area)
inner_join(oyster_data, mussel_data, by = "rgn") %>%
rename("Region" = rgn) %>%
kbl(caption = "Suitable Area For Oysters and Blue Mussels") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Region | Oysters (sq km) | Blue Mussel (sq km) |
|---|---|---|
| Central California | 103.50 | 120.89 |
| Northern California | 32.67 | 49.51 |
| Oregon | 30.11 | 76.65 |
| Southern California | 160.53 | 142.52 |
| Washington | 131.35 | 290.06 |
Table 1: Suitable Area For Oysters and Blue Mussels by Region (in square kilometers)
Key Findings
- Blue mussels generally have more suitable habitat across all regions except Southern California, where oysters have a slight advantage.
Implications for Aquaculture Development
Although the West Coast appears to have a larger area suited to blue mussels, oyster farming still dominates every region. That mismatch may indicate that there is untapped potential for shellfish farming on the west coast.
Limitations and Future Research
While this analysis provides a solid foundation, it has some limitations that should be addressed in future research:
- The analysis uses average annual SST, which doesn't account for seasonal variations that affects shellfish growth cycles.
- Other environmental factors such as tidal patterns, wave exposure, and El Nino events where not considered in the analysis.
- Socioeconomic and regulatory constraints are not incorporated into the suitability model.
- Future research could add climate change projections to assess long-term viability of aquaculture sites.
References
National Oceanic and Atmospheric Administration. (2023). NOAA CoastWatch Pathfinder Sea Surface Temperature Dataset.https://podaac.jpl.nasa.gov/dataset/AVHRR_PATHFINDER_L3_V52
National Centers for Environmental Information. (2023). Gridded Bathymetry Data.https://www.ncei.noaa.gov/access/gridded-bathymetry-data
NOAA Fisheries. (2023). West Coast Regional Boundaries.https://www.fisheries.noaa.gov/west-coast/marine-protected-areas/west-coast-regional-boundaries
Food and Agriculture Organization. (2022). The State of World Fisheries and Aquaculture.https://www.fao.org/3/ca9229en/ca9229en.pdf