Identifying Areas of Potential Aquaculture in the Western US

Author: William Mullins ・ Date: December 7, 2025

GitHub Repository
Back to Blog
Spatial Analysis
December 7, 2025R · Geospatial · Environmental Science

Introduction

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

NOAA Pathfinder Sea Surface Temperature Data

Five-year average of sea surface temperature data from 2008-2012, providing a comprehensive baseline for temperature analysis along the western US coast.

NOAA Bathymetry Data

High-resolution ocean depth measurements used to identify suitable depths for shellfish cultivation.

West Coast Regional Boundaries

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)
Mean Sea Surface Temperature Plot

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 Oyster Habitat Map

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")
Potential Blue Mussel Habitat Map

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"))
RegionOysters (sq km)Blue Mussel (sq km)
Central California103.50120.89
Northern California32.6749.51
Oregon30.1176.65
Southern California160.53142.52
Washington131.35290.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