Data are pulled from SECOORA ERDDAP: using a 48-hour window ending at the latest available ERDDAP time (2026-07-27 05:06 EDT). The buoy map below shows the most recent non-missing salinity value for each station. Interpolated fields use snapshots at 06:00, 12:00, 18:00, and 24:00 US Eastern on 2026-07-26.
if (nrow(salinity_data) ==0) {stop("No salinity data returned from ERDDAP for the current time window.")}salinity_data |>arrange(desc(time)) |>mutate(time =format_ndbc_time(time),salinity =number(salinity, accuracy =0.1) ) |>select(Station = station, `Station ID`= station_id, Time = time, `Salinity (PSU)`= salinity) |>kable()
Salinity is shown in practical salinity units (PSU, parts per thousand). Lower values (blue) indicate fresher water; higher values (red) indicate more marine conditions.
Interpolated salinity field
The fields below use DIVAnd (Data-Interpolating Variational Analysis) with bathymetry masking, following the same approach as sfer-mbon-oxygen: ~0.01° horizontal grid resolution (~1 km), a two-scale analysis (smooth 0.08° background + 0.035° local anomalies with epsilon2 = 0.01), and interpolation run separately within each connected sea component so distant buoys do not smooth over local features. Land is masked using Natural Earth 10 m coastlines plus NOAA BlueTopo 4 m bathymetry (8 m tiles fill gaps); cells with missing bathymetry or elevation ≥ −0.2 m are treated as land. Sea cells are extended along water paths from each buoy (not across islands), then short bridges are added only through BlueTopo water cells (elevation < −0.2 m) to connect nearby stations still isolated from the main field.
Four panels show the interpolated field at 06:00, 12:00, 18:00, and 24:00 US Eastern on 2026-07-26. Each panel uses buoy observations closest to that hour.
Code
salinity_fields <-interpolate_ndbc_hourly_fields( ndbc_data$snapshots,value_col ="salinity")for (result in salinity_fields) {cat(sprintf("Hour %02d: %d field cells, %d observations\n", result$hour,if (is.null(result$field)) 0L elsenrow(result$field),nrow(result$observations) ) )}
Hour 06: 1194 field cells, 19 observations
Hour 12: 1194 field cells, 19 observations
Hour 18: 1194 field cells, 19 observations
Hour 24: 1194 field cells, 19 observations