#!/bin/bash
# Maritime Charts - Comprehensive Ocean Chart Viewer
# Alias: maritime
#
# Usage: maritime -o P -t sst # Pacific SST
# maritime -o A -t current # Atlantic currents
# maritime --list # List all chart types
export DISPLAY=:0
# ══════════════════════════════════════════════════════════════════
# URL DEFINITIONS BY OCEAN BASIN AND CHART TYPE
# ══════════════════════════════════════════════════════════════════
# SST Anomaly Charts (NOAA Coral Reef Watch v3.1)
declare -A sst_urls=(
[global]="https://coralreefwatch.noaa.gov/data_current/5km/v3.1_op/daily/png/ct5km_ssta_v3.1_global_current.png"
[pacific]="https://coralreefwatch.noaa.gov/data_current/5km/v3.1_op/daily/png/ct5km_ssta_v3.1_pacific_current.png"
[atlantic]="https://coralreefwatch.noaa.gov/data_current/5km/v3.1_op/daily/png/ct5km_ssta_v3.1_satlantic_current.png"
[indian]="https://coralreefwatch.noaa.gov/data_current/5km/v3.1_op/daily/png/ct5km_ssta_v3.1_indian_current.png"
[southern]="https://coralreefwatch.noaa.gov/data_current/5km/v3.1_op/daily/png/ct5km_ssta_v3.1_global_current.png"
[arctic]="https://coralreefwatch.noaa.gov/data_current/5km/v3.1_op/daily/png/ct5km_ssta_v3.1_global_current.png"
)
# Ocean Current Charts (NOAA Ocean Prediction Center)
declare -A current_urls=(
[global]="https://ocean.weather.gov/sfc_analysis/ghcur.gif"
[pacific]="https://ocean.weather.gov/P_current72hr.gif"
[atlantic]="https://ocean.weather.gov/A_current72hr.gif"
[gulfstream]="https://ocean.weather.gov/gulf_stream_tab.php"
[indian]="https://ocean.weather.gov/sfc_analysis/ghcur.gif"
[southern]="https://ocean.weather.gov/sfc_analysis/ghcur.gif"
[arctic]="https://ocean.weather.gov/sfc_analysis/ghcur.gif"
)
# Wave Height Charts (NOAA WaveWatch III)
declare -A wave_urls=(
[global]="https://polar.ncep.noaa.gov/waves/viewer.shtml?-gfswave-global-htsgw-"
[pacific]="https://polar.ncep.noaa.gov/waves/WEB/multi_1.latest_run/plots/pac_hs.png"
[atlantic]="https://polar.ncep.noaa.gov/waves/WEB/multi_1.latest_run/plots/atl_hs.png"
[indian]="https://polar.ncep.noaa.gov/waves/WEB/multi_1.latest_run/plots/glo_30m_hs.png"
[southern]="https://polar.ncep.noaa.gov/waves/WEB/multi_1.latest_run/plots/glo_30m_hs.png"
[arctic]="https://polar.ncep.noaa.gov/waves/WEB/multi_1.latest_run/plots/arc_hs.png"
)
# Sea Ice Charts (NOAA/NWS)
declare -A ice_urls=(
[arctic]="https://www.natice.noaa.gov/pub/daily/arctic/arctic.png"
[antarctic]="https://www.natice.noaa.gov/pub/daily/antarctic/antarctic.png"
[global]="https://www.natice.noaa.gov/pub/daily/global/global.png"
)
# Chlorophyll/Ocean Color (NASA)
declare -A chlorophyll_urls=(
[global]="https://oceancolor.gsfc.nasa.gov/gallery/images/MODIS-Aqua/AQUA_MODIS.20240101_20240131.L3m.MO.CHL.chlor_a.4km.nc.png"
[pacific]="https://oceancolor.gsfc.nasa.gov/gallery/images/global/WORLD.20240101.L3m.DAY.CHL.chlor_a.4km.png"
)
# Surface Analysis Charts
declare -A analysis_urls=(
[pacific]="https://ocean.weather.gov/P_sfc_full_ocean_color.png"
[atlantic]="https://ocean.weather.gov/A_sfc_full_ocean_color.png"
[global]="https://ocean.weather.gov/sfc_analysis/full_ocean_color.gif"
)
# ══════════════════════════════════════════════════════════════════
# CACHE SETUP
# ══════════════════════════════════════════════════════════════════
cache_dir="$HOME/.cache/maritime/charts"
mkdir -p "$cache_dir"
# ══════════════════════════════════════════════════════════════════
# HELPER FUNCTIONS
# ══════════════════════════════════════════════════════════════════
# Convert short ocean code to full name
expand_ocean() {
case "${1^^}" in
P|PAC*) echo "pacific" ;;
A|ATL*) echo "atlantic" ;;
I|IND*) echo "indian" ;;
S|SOU*) echo "southern" ;;
AR|ARC*) echo "arctic" ;;
G|GLO*) echo "global" ;;
*) echo "global" ;;
esac
}
# Fetch and display chart
fetch_chart() {
local chart_type="$1"
local ocean="$2"
local url=""
local cache_file="$cache_dir/${chart_type}_${ocean}.png"
local title="${chart_type^^} - ${ocean^^}"
# Get URL based on chart type
case "$chart_type" in
sst) url="${sst_urls[$ocean]:-${sst_urls[global]}}" ;;
current|currents) url="${current_urls[$ocean]:-${current_urls[global]}}" ;;
wave|waves) url="${wave_urls[$ocean]:-${wave_urls[global]}}" ;;
ice) url="${ice_urls[$ocean]:-${ice_urls[arctic]}}" ;;
chlorophyll|chl) url="${chlorophyll_urls[$ocean]:-${chlorophyll_urls[global]}}" ;;
analysis|sfc) url="${analysis_urls[$ocean]:-${analysis_urls[global]}}" ;;
*)
echo "Unknown chart type: $chart_type"
list_types
return 1
;;
esac
if [ -z "$url" ]; then
echo "No chart available for $chart_type in $ocean"
return 1
fi
echo "Fetching $title..."
curl -sLo "$cache_file" "$url"
if [ -f "$cache_file" ]; then
setsid -f mpv --title="$title" --autofit=70% "$cache_file"
else
echo "Failed to fetch chart"
return 1
fi
}
# List available chart types
list_types() {
cat << EOF
Available Chart Types:
sst Sea Surface Temperature Anomaly
current Ocean Currents (72hr forecast)
wave Significant Wave Height
ice Sea Ice Concentration
chlorophyll Chlorophyll/Ocean Color
analysis Surface Analysis
Ocean Basins:
P, pacific Pacific Ocean
A, atlantic Atlantic Ocean
I, indian Indian Ocean
S, southern Southern Ocean
AR, arctic Arctic Ocean
G, global Global/All Oceans
EOF
}
# Update all charts for an ocean
update_ocean() {
local ocean="$1"
echo "Updating all charts for $ocean..."
for type in sst current wave analysis; do
fetch_chart "$type" "$ocean" &
done
wait
notify-send "Maritime Charts Updated" "$ocean basin charts refreshed"
}
# Display comprehensive help
help() {
cat << EOF
Maritime Charts - Ocean Chart Viewer
════════════════════════════════════
Usage: maritime [OPTIONS]
Options:
-o, --ocean BASIN Select ocean basin (P/A/I/S/AR/G)
-t, --type TYPE Select chart type (sst/current/wave/ice/chlorophyll/analysis)
-l, --list List all available chart types
-u, --update BASIN Update all charts for basin
-a, --all Show all chart types for selected ocean
-h, --help Show this help
Ocean Basin Codes:
P Pacific Ocean A Atlantic Ocean
I Indian Ocean S Southern Ocean
AR Arctic Ocean G Global
Chart Types:
sst Sea Surface Temperature Anomaly
current Ocean Current Forecasts (72hr)
wave Significant Wave Height
ice Sea Ice Concentration (Arctic/Antarctic)
chlorophyll Ocean Color / Phytoplankton
analysis Surface Analysis Charts
Examples:
maritime -o P -t sst # Pacific SST anomaly
maritime -o A -t current # Atlantic currents
maritime -o AR -t ice # Arctic sea ice
maritime --update P # Update all Pacific charts
maritime -o G -a # All global charts
Data Sources:
NOAA OSPO, Ocean Prediction Center, Coral Reef Watch
NOAA WaveWatch III, National Ice Center
NASA Ocean Color
═══════════════════════════════════════════════════════════════
EOF
}
# ══════════════════════════════════════════════════════════════════
# MAIN ARGUMENT PARSING
# ══════════════════════════════════════════════════════════════════
ocean="global"
chart_type=""
show_all=false
while [[ $# -gt 0 ]]; do
case "$1" in
-o|--ocean)
ocean=$(expand_ocean "$2")
shift 2
;;
-t|--type)
chart_type="$2"
shift 2
;;
-l|--list)
list_types
exit 0
;;
-u|--update)
update_ocean "$(expand_ocean "$2")"
exit 0
;;
-a|--all)
show_all=true
shift
;;
-h|--help)
help
exit 0
;;
*)
# Try to interpret as chart type if no flag
if [ -z "$chart_type" ]; then
chart_type="$1"
fi
shift
;;
esac
done
# Execute based on parsed options
if $show_all; then
echo "Fetching all charts for $ocean..."
for type in sst current wave analysis; do
fetch_chart "$type" "$ocean"
sleep 0.5
done
elif [ -n "$chart_type" ]; then
fetch_chart "$chart_type" "$ocean"
else
help
fi