How to Create Sea Climate Maps from Satellite Data

Inspired by a section in Heavy Weather Sailing by Peter Bruce, I decided to see what sea climate maps were available online, so I could include them in my collection of cruising resources.

I was looking for seasonal and/or monthly average and maximum wave height and wind speed maps. Surprisingly, I was unable to find any.

However, the search led me to discover the source altimetry data collected by various satellites, and toward some tools for manipulation and visualization of the data.

All the data and tools needed are freely available online.

For my own use, I created maps for significant wave height (SWH) and wind speed, both averages and maximums, by month. I settled on Jason-2 and Jason-3 satellite altimetry data collected from July 2008 to April 2020, yielding a span of roughly 12 years. An example map generated for significant wave height averaged over all January data during the above time frame appears below:

The notes below detail how I created the maps. It’s a bit involved, but not too bad. I used MacOS, but I believe most if not all of the tools are available on other platforms, too.

On the other hand, if you just want the end result without all the mumbo-jumbo and hard work, check out the Ocean Atlas app, which offers this and more in an interactive pilot chart.
  • From NOAA NCEI OSTM/Jason-2 and Jason-3 Satellite Products Archive, download JA2_GDR_gridded_3x1deg_cycle_mean.nc (424 MB)
    • Jason-2 was launched in June 2008 and among other things performs altimetry measurements
    • Due to its orbit, observations are limited to below about 66 degrees latitude
    • The file is an aggregation of the source tracks interpolated over a grid
    • Each cycle (one complete coverage of the earth) of about 10 days is one aggregation period
    • The file contains 303 cycle’s worth of data, from July 2008 to September 2016
  • Also download JA3_IGDR_gridded_3x1deg_cycle_mean.nc (66 MB)
    • Similar to above, for Jason-3
    • This file may be updated as new data comes in
    • The file begins in February 2016
    • Using IGDR right now because GDR doesn’t have any timesteps?
  • Download and install CDO tool
    • Enables manipulation of NetCDF files
    • Can install using homebrew
  • Create a single combined file from Jason-2 and Jason-3 data
    • cdo select,name=swh_ku,wind_speed_alt JA2_GDR_gridded_3x1deg_cycle_mean.nc ja2_select.nc
    • cdo select,name=swh_ku,wind_speed_alt JA3_IGDR_gridded_3x1deg_cycle_mean.nc ja3_select.nc
    • cdo seltimestep,1/279 ja2_select.nc ja2_time.nc
    • cdo mergetime ja2_time.nc ja3_select.nc ja23_combined_full.nc
    • cdo delete,timestep=39 ja23_combined_full.nc ja23_combined.nc
      • Removes a timestep that has a track going over land for some reason
  • Create derivative files for monthly and/or seasonal average and max
    • cdo ymonmean ja23_combined.nc out-monthly-mean.nc
    • cdo ymonmax ja23_combined.nc out-monthly-max.nc
    • cdo yseasmean ja23_combined.nc out-seasonal-mean.nc
    • cdo yseasmax ja23_combined.nc out-seasonal-max.nc
    • Note “mean” and “average” have specific meanings in CDO; see the user guide
  • Download and install NASA’s Panoply tool
    • Visualization of NetCDF files
  • To create a plot in Panoply
    • Load the desired (derivative) file
    • Select the field to plot
      • swh_ku for significant wave height
        • Observations from Ku band are considered more precise; C band is used primarily for calibration
      • wind_speed_alt for wind speed
    • Click “Create Plot”
    • Choose Georeferenced Longitude-Latitude
    • Scale
      • Choose an appropriate min & max range
        • 0 to 5 (m) for mean SWH
        • 0 to 8 (m) for max SWH
        • 0 to 30 (knots) for mean wind speed
        • 0 to 40 (knots) for max wind speed
      • Choose units
        • m for SWH
        • knot for wind speed
      • Tick format = %.0f
      • Select color table
        • panoply.act for SWH
        • CB_RdYlBu.cpt (reversed) for wind speed
      • Outliers on = Right End Only
      • Caption location = None
    • Map
      • Choose a desired projection (I like Natural Earth I)
      • Grid spacing = 20 deg
      • Style = Dots
      • Weight = 30%
      • Border weight = 0%
    • Overlays
      • Overlay 1 = Earth_mask.gif
      • Set color to match fill color
      • Mask opacity = 100%
    • Labels
      • Enter a meaningful title
      • Un-check “Show data min-max”
    • From “Plot” menu choose “Plot Size”
      • I use Size 300 - Maximum which is 2192 x 1472 pixels
    • Save images
      • Select month/season in “Array(s)” tab
        • Month number for monthly (1 = Jan)
        • Season number for seasonal (1 = Dec/Jan/Feb)
      • From “File” menu choose “Save Image As…”
      • Save as PNG or some other lossless type
      • Give an incremental name like Mean SWH 01 Jan.png
      • Increment the array time and repeat
  • Crop images
    • Use ffmpeg with "crop=w:h:x:y" option
    • ffmpeg -i input.png -vf "crop=2078:862:57:264" output.png
    • for f in *.png; do ffmpeg -i "$f" -vf "crop=2078:862:57:264" "Cropped $f"; done

Further Reading

  1. Altimeter Wave and Wind data for Mariners and Scientific Community by Zorana Jelenak / NOAA (PDF)
  2. OSTM/Jason-2 Products Handbook (PDF)
  3. CDO User Guide by Uwe Schulzweida (PDF)
  4. Software for Manipulating or Displaying NetCDF Data
  5. Ocean Atlas app

Leave a Reply

Your email address will not be published. Required fields are marked *