#!/usr/bin/perl
use strict;
use LWP::Simple;
use CGI;
#use Geo::METAR;
use Time::Local;
my $NDBC_Data_URL = "http://www.ndbc.noaa.gov/data/realtime2/";
my $w = new CGI;
print $w->header;
print $w->title('West Coast NDBC Summary');
print $w->start_html;
print $w->h2('West Coast NDBC Summary');
print "\n
\n";
print "Site | Wind (kts) | Gust (kts) | Direction | Wave Ht | Dominant Pd | Time (PDT) |
\n";
print_ndbc_obs ($NDBC_Data_URL, 46026, "San Francisco");
print "
\n";
print_ndbc_obs ($NDBC_Data_URL, 46013, "Bodega Bay");
print "
\n";
print_ndbc_obs ($NDBC_Data_URL, 46014, "Point Arena");
print "
\n";
print_ndbc_obs ($NDBC_Data_URL, 46022, "Eureka");
print "
\n";
#print_ndbc_obs ($NDBC_Data_URL, 46027, "Crescent City");
#print "
\n";
#print_ndbc_obs ($NDBC_Data_URL, 46015, "Port Orford");
#print "
\n";
print_ndbc_obs ($NDBC_Data_URL, 46229, "Umpqua");
print "
\n";
print_ndbc_obs ($NDBC_Data_URL, 46050, "Newport");
print "
\n";
print_ndbc_obs ($NDBC_Data_URL, 46029, "Columbia River");
print "
\n";
#print_ndbc_obs ($NDBC_Data_URL, 46041, "Aberdeen");
#print "
\n";
print_ndbc_obs ($NDBC_Data_URL, 46087, "Neah Bay");
print "
\n";
print "
\n
\n";
print "\n";
print $w->end_html;
exit(0);
#######################
sub print_ndbc_obs
{my $url = shift;
my $site = shift;
my $sitename = shift;
my $eng_url = "http://www.ndbc.noaa.gov/station_page.php\?station=";
my ($obs_time, $obs_wind_dir, $obs_wind_speed, $obs_gust);
my ($obs_wave_ht, $obs_period );
($obs_wind_speed, $obs_wind_dir, $obs_gust, $obs_wave_ht, $obs_period, $obs_time)
= &get_ndbc_data ($url, $site);
# print "$sitename wind at $obs_time is $obs_speed", "kts ";
# if ($obs_gust) {print "gusts to $obs_gust", "kts ";}
# print "from $obs_dir\n";
print "
$sitename | $obs_wind_speed | ";
if ($obs_gust) {print "$obs_gust";}
else {print "N/A";}
print " | $obs_wind_dir | ";
print "$obs_wave_ht | $obs_period | ";
print "$obs_time | ";
}
sub get_ndbc_data
{
my $url = shift;
my $site = shift;
my ($wspeed, $wdir, $gust, $time, $wave_ht, $period);
my ($hour, $min, $meridian, $date, $day, $month, $year);
my $meterstoknots = 1.94384449;
my $meterstofeet = 3.2808399;
$url = $url . $site . ".txt";
my $page = get ($url);
##YY MM DD hh mm WDIR WSPD GST WVHT DPD APD MWD PRES ATMP WTMP DEWP VIS PTDY TIDE
##yr mo dy hr mn degT m/s m/s m sec sec degT hPa degC degC degC mi hPa ft
#2007 04 28 17 50 300 2.0 3.0 2.6 14 MM MM 1015.9 10.3 10.3 MM MM +1.0 MM
#2007 04 28 19 50 MM MM MM 3.1 14 MM MM 1023.9 9.4 7.1 MM MM MM MM
# yr mo day hr min wdir wspd gust wavht dom pd avg etc
$page =~ m#20(\d{2})\s(\d{2})\s(\d{2})\s(\d{2})\s(\d{2})\s+(\S+)\s+(\S+)\s+(\S+)\s+(\d+.\d+)\s+(\d+)\s+MM\s+.*#;
($year, $month, $day, $hour, $min, $wdir, $wspeed, $gust, $wave_ht, $period) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
#print "url is $url
\n";
($month, $day, $year, $hour, $min, $meridian) = &utc_to_local ($month, $day, $year, $hour, $min);
#if ($hour > 12){$meridian = "PM"; $hour = $hour -12;}
#elsif ($hour == 0){$meridian = "AM"; $hour = 12;}
#else {$meridian = "AM";}
if ($wdir eq "MM") {$wdir = "N/A";}
$date = "$month\/$day\/$year";
$time = "$hour:$min $meridian $date";
#Convert to Knots and Round off the wind speeds
$wspeed = $wspeed * $meterstoknots;
$gust = $gust * $meterstoknots;
$wspeed = sprintf ("%.1f", $wspeed);
$gust = sprintf ("%.1f", $gust);
$wave_ht = sprintf ("%.1f", ($wave_ht*$meterstofeet));
if ($wspeed == 0.0) {$wspeed = "N/A";}
if ($gust == 0.0) {$gust = "N/A";}
return ($wspeed, $wdir, $gust, $wave_ht, $period, $time);
}
sub utc_to_local
{my $umon = shift;
my $uday = shift;
my $uyear = shift;
my $uhour = shift;
my $umin = shift;
my ($time, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $meridian);
#$time = $w->TIME; #Convert Date and Time from UTC to local
# $time =~ m/(\d{1,2}):(\d{2}) UTC/;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time);
$min = $umin;
$hour = $uhour;
$mday = $uday;
#there could be a wrong day here
$time = timegm(0,$min,$hour,$mday,$mon,$year,$wday,$yday);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime ($time);
$mon++;
$year = sprintf ("%02d", ($year - 100)); #Y3K bug... yah yah..
if ($hour > 12){$hour = $hour - 12; $meridian = "PM";}
elsif ($hour == 12) {$meridian = "PM";}
else {$meridian = "AM";}
#$time = "$hour:$min $meridian $mon/$mday/$year";
return ($mon, $mday, $year, $hour, $min, $meridian);
}