#!/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 "\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
SiteWind (kts)Gust (kts)DirectionWave HtDominant PdTime (PDT)
\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); }